유튜브와 스레드에 영상을 API로 못 올린 이유
쇼츠를 만들면 올릴 곳도 함께 늘어납니다. 인스타그램은 API로 올리는 흐름을 만들었으니, 같은 영상 파일을 유튜브와 스레드에도 넘기면 될 줄 알았습니다. 인증을 붙이고 업로드 요청을 보내는 일. 그렇게 생각했습니다.
결과는 달랐습니다. 유튜브에서는 요청이 성공해도 영상이 비공개로 잠겼고 스레드에서는 파일 바이트를 넘기는 방식 자체가 게시 단계에서 멈췄는데, 둘 다 권한을 더 찾는 문제는 아니었습니다.
먼저 결론부터
- 유튜브는 심사를 받기 전에는 API로 올린 영상을 공개 상태로 둘 수 없었습니다.
- 공개로 요청해도 오류 없이 비공개로 올라가므로, 응답만 보고 성공으로 판단하면 안 됩니다.
- 유튜브 업로드는 서비스 계정이 아니라 사용자 인증으로 처리해야 합니다.
- 스레드 영상 게시에는 파일 바이트가 아니라 공개된
video_url이 필요했습니다. - 스레드는 게시물 삭제 권한도 없어서, 잘못 올린 글은 직접 들어가 지워야 했습니다.
- 영상 업로드가 막혔다고 비슷한 형식의 글로 바꿔 올리면 중복과 삭제 작업이 남았습니다.
유튜브는 성공 응답 뒤에 비공개가 남았습니다
유튜브 업로드 요청은 실패하지 않았습니다. 응답도 정상으로 돌아왔고 처리 과정에서 멈춘 흔적도 보이지 않았으니, 처음에는 자동 게시가 끝난 줄 알았습니다.
채널에 들어가서야 알았습니다. 요청에 공개 상태를 적어 보냈지만 반영되지 않았고 별도 경고도 없었는데, 올린 영상이 전부 비공개였습니다. 오류 없이 비공개 상태로 고정되는 동작입니다.
원인은 프로젝트 생성 시점과 심사 상태. 2020년 7월 28일 이후에 만든 프로젝트는 심사를 받기 전까지 업로드 영상이 비공개로 제한됩니다. 공개 여부를 요청 값으로 바꿔서 될 일이 아닙니다.
심사를 받으면 영상을 공개할 수 있게 됩니다. 다만 서비스의 쓰임새를 설명하고 결과를 기다려야 합니다. 쇼츠를 만든 뒤 바로 여러 채널에 배포하려던 흐름에서는 이 대기 자체가 작업을 멈추게 했습니다.
서비스 계정으로 올리려던 시도도 여기서 끝났습니다. 유튜브는 서비스 계정 업로드를 받지 않고 실제 사용자 계정 인증을 요구하는데, 인증 토큰을 받아 요청하는 것과 채널에 영상을 게시할 권한을 얻는 일은 다릅니다.
그래서 유튜브는 손으로 올리기로 했습니다. API 요청이 성공했다는 기록보다 채널에 어떤 공개 상태로 남았는지를 확인하는 쪽이 먼저입니다.
스레드는 파일이 아니라 공개 주소를 받았습니다
스레드에서는 영상 파일 바이트를 그대로 보내는 흐름으로 시작했고, 업로드 요청이 진행되는 것처럼 보여서 형식이나 인코딩 문제를 더 찾아야 하나 싶었습니다.
막힌 곳은 마지막이었습니다. 서버는 500과 함께 video_url 매개변수가 필요하다고 돌려줬는데, 파일을 전달하는 API가 아니라 이미 외부에서 접근할 수 있는 영상 주소를 받아 게시하는 방식이었습니다.
여기서는 요청 본문을 조금 바꾸는 것으로 끝나지 않았는데, 영상마다 공개 URL을 만들어야 하니 파일을 어딘가에 올려 두고 스레드가 그 주소에서 영상을 가져갈 수 있게 해야 합니다.
그 선택에는 대가도 따랐습니다. 영상 파일은 레포지토리나 공개 저장소에 쌓이고, 자동 게시 하나를 만들려고 영상 보관 위치와 공개 범위까지 같이 정해야 하는 구조입니다.
인스타그램에서 되던 업로드 감각을 그대로 가져온 것이 문제였습니다. 같은 Meta 계열 서비스라고 해도, 영상 파일을 받는 쪽과 URL만 받는 쪽은 작업의 시작점부터 다릅니다.
삭제가 안 되는 자동화도 남았습니다
스레드에서 더 곤란했던 것은 게시한 뒤에 생겼습니다. 잘못 올린 글을 API로 지우려 했지만 권한이 없었고, 응답에는 코드 10이 돌아온 채 삭제 요청은 진행되지 않았습니다.
게시 자동화만 보면 일단 올라갑니다. 제목이 틀리거나 같은 내용을 중복으로 올렸을 때 되돌릴 길이 없으면 사람 손으로 앱이나 웹 화면에 들어가 하나씩 지워야 합니다. 올리는 경로와 지우는 경로가 이어지지 않았습니다.
실제로 영상이 안 올라가자 글로 대신 올린 적이 있는데, 이미 다른 곳에 같은 내용이 있었고 결과적으로 중복 게시가 됐지만 API로 지우려 해도 삭제 권한이 없었습니다. 손으로 세 건을 지웠습니다.
이때 더 자동화하려고 삭제 엔드포인트나 다른 권한을 계속 찾는 쪽으로 가지 않았습니다. 먼저 남은 사실은 하나입니다. 현재 권한으로는 게시 후 복구가 안 됩니다. 자동으로 올리는 기능만 붙인 상태입니다.
막힌 방법을 다른 게시물로 바꾸지 않았어야 했습니다
영상 게시가 안 되면 비슷한 내용의 텍스트 게시로 바꾸고 싶어집니다. 요청한 결과물은 영상인데도 일단 발행 기록을 남기려는 판단이 듭니다. 그 판단이 중복 게시를 만들었습니다.
문제는 기술적인 실패가 아니었습니다. 영상 API가 막힌 사실과 다른 형식의 게시물을 대신 올려도 되는지는 별개였는데, 전자는 도구의 제약이고 후자는 사람이 정할 일입니다.
그 뒤에는 막히면 멈추고 상태를 남기는 쪽으로 바꿨습니다. 유튜브는 심사 전 비공개 제한, 스레드는 공개 video_url 필요, 그리고 삭제 API 권한 없음. 이 상태에서 다른 형식으로 갈아타면 게시 자체보다 되돌리는 일이 더 커집니다.
유튜브와 스레드는 둘 다 영상 자동 게시에서 멈췄지만 이유는 같지 않았습니다. 한쪽은 심사 전 공개 범위 제한, 다른 쪽은 파일을 받지 않는 게시 방식. 여기에 삭제 불가까지 겹치면서, 자동화가 가능한지보다 잘못 실행됐을 때 어디까지 되돌릴 수 있는지를 먼저 확인하게 됐습니다.