유튜브 영상 원박스 임베딩이 작동하지 않습니다

여기 몇 가지 추가 결과를 공유합니다. 참고로, 아래 게시글에는 실제 지식의 부재로 인해 많은 가정이 포함되어 있습니다.

이 게시글 이후로, 현재 어떤 일이 일어나고 있는지 그리고 무엇이 이루어져야 하는지에 대한 제 의견을 후속 게시글로 올리겠습니다.

답변해 주셔서 감사합니다, Robert.

/watch 라우트를 사용하여 비디오를 원박스(Oneboxing)하는 시도가 (그때도 그랬고, 지금도 그렇습니다!) 실패했기 때문에 실패를 강요하기 위해 루프가 필요하지 않았습니다.

따라서 제가 세운 가정 중 하나는, Onebox가 사용하는 user-agent가 이 코드에 근거하여 Discourse Forum Onebox v2.6.0.beta1라는 것입니다…

임의의 비디오를 하나 선택하여 curl을 사용해 헤더를 읽으려 했습니다.

실제 운영 중인 사이트의 Docker 컨테이너 내부에서 이를 수행했으며, 다음과 같은 응답이 생성되었습니다.

/watch? 라우트를 사용한 첫 번째 curl 결과

명령어

curl --user-agent "Discourse Forum Onebox v2.6.0.beta1" -sD - -o /dev/null "https://m.youtube.com/watch?v=s0ONj4TG0UA"

응답:

curl --user-agent "Discourse Forum Onebox v2.6.0.beta1" -sD - -o /dev/null "https://m.youtube.com/watch?v=s0ONj4TG0UA"
HTTP/2 303 
content-length: 0
p3p: CP="This is not a P3P policy! See http://support.google.com/accounts/answer/151657?hl=en-GB for more info."
cache-control: no-cache
x-frame-options: SAMEORIGIN
content-type: text/html; charset=utf-8
location: https://www.youtube.com/watch?v=s0ONj4TG0UA&app=desktop
accept-ch-lifetime: 2592000
x-content-type-options: nosniff
accept-ch: DPR
expires: Tue, 27 Apr 1971 19:44:06 GMT
strict-transport-security: max-age=31536000
date: Fri, 07 Aug 2020 11:35:21 GMT
server: YouTube Frontend Proxy
x-xss-protection: 0
set-cookie: VISITOR_INFO1_LIVE=rcVTSJn81Ck; path=/; domain=.youtube.com; secure; expires=Wed, 03-Feb-2021 11:35:20 GMT; httponly; samesite=None
set-cookie: YSC=cFXIPerzT3Y; path=/; domain=.youtube.com; secure; httponly; samesite=None
set-cookie: GPS=1; path=/; domain=.youtube.com; expires=Fri, 07-Aug-2020 12:05:20 GMT
alt-svc: h3-29=":443"; ma=2592000,h3-27=":443"; ma=2592000,h3-T050=":443"; ma=2592000,h3-Q050=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000,quic=":443"; ma=2592000; v="46,43"

즉, location 헤더의 URL인 https://www.youtube.com/watch?v=s0ONj4TG0UA&app=desktop으로 303 응답을 통해 리다이렉트되었습니다.

이는 단순히 URL에 &app=desktop을 추가하는 효과를 냈습니다.

리다이렉트된 URL에 대한 두 번째 curl 결과 - 여전히 /watch? 라우트

명령어
curl --user-agent "Discourse Forum Onebox v2.6.0.beta1" -sD - -o /dev/null "https://www.youtube.com/watch?v=s0ONj4TG0UA&app=desktop"

응답

HTTP/2 429 
x-content-type-options: nosniff
expires: Tue, 27 Apr 1971 19:44:06 GMT
x-frame-options: SAMEORIGIN
cache-control: no-cache
p3p: CP="This is not a P3P policy! See http://support.google.com/accounts/answer/151657?hl=en-GB for more info."
accept-ch-lifetime: 2592000
content-type: text/html; charset=utf-8
accept-ch: DPR
strict-transport-security: max-age=31536000
content-length: 48982
date: Fri, 07 Aug 2020 11:46:00 GMT
server: YouTube Frontend Proxy
x-xss-protection: 0
set-cookie: VISITOR_INFO1_LIVE=VQwNuouhq-s; path=/; domain=.youtube.com; secure; expires=Wed, 03-Feb-2021 11:46:00 GMT; httponly; samesite=None
set-cookie: YSC=8IRfPRFRY6c; path=/; domain=.youtube.com; secure; httponly; samesite=None
set-cookie: GPS=1; path=/; domain=.youtube.com; expires=Fri, 07-Aug-2020 12:16:00 GMT
set-cookie: VISITOR_INFO1_LIVE=VQwNuouhq-s; path=/; domain=.youtube.com; secure; expires=Wed, 03-Feb-2021 11:46:00 GMT; httponly; samesite=None
set-cookie: YSC=8IRfPRFRY6c; path=/; domain=.youtube.com; secure; httponly; samesite=None
set-cookie: GPS=1; path=/; domain=.youtube.com; expires=Fri, 07-Aug-2020 12:16:00 GMT
alt-svc: h3-29=":443"; ma=2592000,h3-27=":443"; ma=2592000,h3-T050=":443"; ma=2592000,h3-Q050=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000,quic=":443"; ma=2592000; v="46,43"

즉, retry-after 헤더 없이 429 “요청이 너무 많습니다(too many requests)” 응답 코드를 받고 있습니다. 협상 없이 중단하라는 뜻입니다.

어쨌든, 이것이 Onebox가 보고 있는 내용이라면, 응답을 무시하고 있거나, 로깅되고 있다면 어디를 봐야 할지 모르겠습니다.

단일 429 응답에 대해 이것이 적법한 조치일 수 있지만, 매우 짧은 시간 내에 많은 429 응답을 확인하는 것은 무시할 수 없습니다.

세 번째 curl 결과 - 이번에는 /embed/ 라우트 사용

완결성을 위해, 즉시 같은 비디오를 가져오려 했지만 이번에는 /embed/ 라우트를 사용했습니다.

명령어

curl --user-agent "Discourse Forum Onebox v2.6.0.beta1" -sD - -o /dev/null "https://www.youtube.com/embed/s0ONj4TG0UA"

응답

HTTP/2 200 
accept-ch-lifetime: 2592000
content-type: text/html; charset=utf-8
expires: Tue, 27 Apr 1971 19:44:06 GMT
x-content-type-options: nosniff
cache-control: no-cache
p3p: CP="This is not a P3P policy! See http://support.google.com/accounts/answer/151657?hl=en-GB for more info."
strict-transport-security: max-age=31536000
accept-ch: DPR
date: Fri, 07 Aug 2020 11:55:29 GMT
server: YouTube Frontend Proxy
x-xss-protection: 0
set-cookie: VISITOR_INFO1_LIVE=PNE6x6djF00; path=/; domain=.youtube.com; secure; expires=Wed, 03-Feb-2021 11:55:29 GMT; httponly; samesite=None
set-cookie: VISITOR_INFO1_LIVE=PNE6x6djF00; path=/; domain=.youtube.com; secure; expires=Wed, 03-Feb-2021 11:55:29 GMT; httponly; samesite=None
set-cookie: GPS=1; path=/; domain=.youtube.com; expires=Fri, 07-Aug-2020 12:25:29 GMT
set-cookie: YSC=pDW-hdbauK8; path=/; domain=.youtube.com; secure; httponly; samesite=None
alt-svc: h3-29=":443"; ma=2592000,h3-27=":443"; ma=2592000,h3-T050=":443"; ma=2592000,h3-Q050=":443"; ma=2592000,h3-Q046=":443"; ma=2592000,h3-Q043=":443"; ma=2592000,quic=":443"; ma=2592000; v="46,43"
accept-ranges: none
vary: Accept-Encoding

200 - 성공.

lazy-yt 플러그인은 /watch 형식의 URL을 다시 작성하는 것 같습니다

이것이 중요할지 확실하지 않지만… 임베디드 플러그인인 lazy-yt가 기본적으로 활성화되어 있는 것 같습니다. 개발 설치 환경에서 이를 발견했습니다.

YouTube Oneboxer의 to_html 메서드를 몽키 패치(monkey patch)하는 것으로 보입니다.

중요한지는 모르겠지만, 원래 Onebox의 to_html 메서드는 /embed/ URL 형식을 반환합니다…

반면 lazy-yt 플러그인은 /watch?v= URL 형식을 사용합니다.

관심을 끌어야 할 문제가 있음을 보여주기 위해 제가 더 할 수 있는 다른 것이 있습니까? 다음 게시글에서는 근본 원인이 무엇이라고 생각하는지 설명하겠습니다.