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

여기서 어떻게 해야 할지 조언을 듣고 싶지만, 이 문제를 더 잘 처리할 수 있는 방법에 대한 아이디어도 몇 가지 있습니다.

일어날 수 있는 상황

한 가지 가설은, YouTube가 우리의 서버를 음악 비디오를 대량으로 수집하는(farming) 행위로 의심하여 제한을 걸거나 차단하고 있을 수 있다는 것입니다.

우리는 영국에 있는 아주 평범한 작은 포럼이며 트래픽도 적지만, 음악 비디오로 이루어진 10K + 2K개의 게시물로 구성된 스레드가 두 개(실제로는 크기로 인해 둘로 나뉜 하나) 있습니다. 이는 음악 체인(musical chain)으로, 다음 게시자는 이전 게시물과 관련이 있는(종종 간접적으로) 노래를 올리는 방식입니다.

물론 YouTube 링크가 포함된 다른 스레드도 있지만, 이 스레드는 특히 (~100%) 음악으로 가득 차 있습니다.

주말에 재배이크(rebake)를 진행한 후, Oneboxer가 많은 음악 비디오의 헤더를 가져오려던 활동을 YouTube가 감지하고 알고리즘이 우리를 '나쁜 짓을 한 아이’로 분류한 것 같습니다.

그 후 게시물을 다시 베이킹(bake)을 시도했는데, 이는 아마도 YouTube가 이 IP 주소에서 우리가 하는 모든 것이 음악 비디오 다운로드 시도라는 의심을 확실히 한 것 같습니다.

Digital Ocean과 관련이 있을 수 있음

YouTube에서 429 에러를 검색하면서 YouTube API 관련 결과는 무시하고, 결국 유사한 문제들이 모인 그룹에 도달했는데, 모두 가상 서버(특히 Digital Ocean이 명시적으로 언급됨)를 사용했기 때문에 IP 주소가 그레이리스트/블랙리스트/차단되었다고 설명하고 있습니다.

YouTube가 IP 주소 시리즈를 '차단’할 수 있으며, 이로 인해 다른 합법적인 서버들이 종종 부수적 피해(collateral damage)로 함께 묶인다는 제안이 있습니다.

다음은 그러한 문제와 잠재적 해결책 중 하나입니다.

https://support.google.com/youtube/thread/21697789?hl=en

그리고 embed.ly API를 개발하는 medium.com의 개발자가 올린 또 다른 사례입니다.

https://support.google.com/youtube/thread/21939228?hl=en

첫 번째 게시물에서 제안된 해결책은 드롭렛(droplet)에서 ip6를 비활성화하는 것이었습니다.

이것이 그럴듯해 보인다고 아는 사람이 있습니까, 아니면 이것이 문제를 일으킬까요?

해결에 도움이 될 수 있는 다른 데이터를 수집할 수 있도록 현재는 이 작업을 보류하고 있습니다.

무엇이 일어나야 하는가?

먼저, 여기서는 제 경험이 가장자리에 있는 경우(edge-case)이며 변경이 필요하지 않다는 반응이 나올 가능성이 높다는 것을 이해합니다.

그것을 이해합니다. 하지만 만약 @marcozambi와 제가 상대적으로 짧은 기간 내에 동일한 문제를 발견했다면, 다른 사용자들도 이를 겪을 수 있음을 시사합니다. 아마도 YouTube가 임베딩(embedding)에 대한 감시에서 최근 더 엄격해졌을까요?

현재 제 포럼은 완전히 정체 상태(limbo)에 있다는 점을 기억해 주십시오. Onebox 처리에 실패한 링크가 수만 개 있지만, 어디에 있는지 알 수 없으며, 모두를 찾기 위해서는 전체 재배이크를 수행해야 할 것 같고, 이는 거의 확실하게 YouTube에서 더 부정적인 관심을 끌 것입니다.

최소한, Onebox는 레이트 리밋 에러에 도달했을 때 조용히 실패해서는 안 됩니다. 관리자의 주의를 끌어야 하며, 가능한 경우 레이트 리밋 문제를 일으킨 프로세스를 일시 중지해야 합니다.

포럼 소유자의 주의를 끌기 위한 옵션들

이것이 쉽지 않다고 생각합니다. 전혀.

Onebox가 여러 가지 뚜렷하게 다른 역할을 수행한다고 봅니다.

a) 게시물이 작성될 때 실시간으로 Onebox를 빌드합니다.
b) 오래된 게시물(종종 이미 알려진 링크 포함)의 재배이크 요청에 대해 백그라운드에서 헤드리스(headless)로 응답합니다.
c) 마이그레이션/재배이크 동안 대량의 백그라운드 작업 게시물을 처리하도록 요청받습니다.

시나리오 a)에서 레이트 리밋 에러가 발생하면 작성자는 Onebox가 확장되지 않은 것을 인식하고 포럼 관리자에게 불평할 수 있으며, 이것이 주목받을 수 있습니다. 작성 중에 단일 에러를 잡아 관리자에게 에러 또는 메시지를 푸시할 수도 있다고 추측합니다.

시나리오 b)에서 실패는 게시물의 백그라운드 처리 중에 발생할 수 있으므로, 재시도되거나 재시도 횟수에 도달했다면 실패 처리되고 포럼 관리자에게 통보되어야 할 수 있습니다.

시나리오 c)에서는 동시에 많은 실패가 발생하는 더 넓은 맥락이 알려져야 합니다. 현재 Onebox에서 10,000개의 429 에러가 반환되는 것을 관리자에게 10,000개의 개별 메시지를 보내는 것보다 더 큰 문제로 인식할 수 있는 게시물 재배이크 프로세스에 대한 포괄적인 제어 메커니즘이 없다고 생각합니다.

현실적으로, 그러한 실패는 YouTube(다른 제공자도 포함될 수 있음) 비디오 확장을 위한 Onebox 호출을 더 이상 레이트 리밋되지 않을 때까지 보류해야 함을 의미합니다.

대안적 접근법

발신 요청 레이트 리밋

예방이 치료보다 낫다는 격언이 적용될 수 있으므로, Discourse 레이트 리미터를 요청 앞에 배치하여 Discourse가 설정에 따라 요청을 보류하도록 할 수 있다고 추측합니다.

이는 재배이크와 마이그레이션에 큰 혼란을 야기할 것입니다.

Onebox Assistant

@merefield의 Onebox Assistant 플러그인에서 사용된 것과 같이 임베드를 캐시하고 프록시하는 조직과의 상업적 관계가 모두에게 필요할까요?

‘봇’ 화이트리스트

Discourse '봇’을 YouTube에서 화이트리스트에 추가하는 방법을 찾을 수 있을까요? 아마도 악용하기 너무 쉬울 것입니다.

YouTube API

Onebox가 Twitter에서 하는 것과 마찬가지로, 레이트 리밋이 더 크다면 YouTube API를 사용할 수 있을까요?

좋은 조사 결과 감사합니다.

알고 계실지 모르겠지만, Signal 메신저도 YouTube에서 문제가 발생하며, 이는 여전히 해결되지 않은 상태입니다:

https://meta.discourse.org/t/onebox-assistant-crawl-for-those-previews-reliably/107405/9?u=merefield

WhatsApp에서도 같은 문제가 발생합니다.

추가로 말씀드리고 싶은 것은, 우리는 2~3주마다 정기적으로 YT(유튜브)에서 "차단"을 당하고, 약 일주일 정도 차단된 상태로 있다가 다시 차단이 해제된다는 것입니다. 그런 다음 이 주기가 반복됩니다.
우리는 YT 동영상 링크를 단 몇백 개만 가지고 있으며, 우리 사용자들은 하루에 몇 개 이상을 게시하지 않습니다…

즉, OneBox Assistant 플러그인을 사용하지 않으면 기본 Discourse에서 youtu.be 링크를 미리보기로 표시할 수 있는 방법이 없다는 뜻인가요?

모든 형식의 YouTube 링크는 Onebox에 의해 확장되어야 합니다.

당신에게는 작동하지 않나요?

작동하지 않는다면, 어떤 문제를 보고 계신가요?

최신 버전의 discourse를 사용 중인데, 방금 youtu.be 링크로 게시글을 작성했는데 미리보기가 표시되지 않았습니다. 일반적인 YouTube 링크는 정상적으로 작동합니다.

한번 보자

https://youtu.be/gLCduDJVksc 는 제게도 괜찮아 보입니다

네, meta.discourse에서는 작동합니다. 제 사이트에서는 왜 작동하지 않는지 알아보고 있습니다. 관리자 패널에서 이 기능을 설정할 수 있는 옵션이 있나요?

위에서 논의했듯이, YouTube에서 서버 또는 IP 범위가 차단되었을 가능성이 높습니다.

하지만 일반적인 YouTube 링크는 작동합니다. 차단되었다면 모두 작동하지 않아야 하지 않나요?

@AntiMetaman 님, 그런 경우는 아닙니다.

위에서 @codinghorror 님이 제안한 대로, 유튜브는 특정 형식의 링크에 대해 속도 제한(rate-limit) 또는 금지를 적용하여 다른 형식의 링크는 계속 작동하는 것으로 보입니다.

제 경우, ‘/embed’ 형식의 링크는 작동하지만 다른 형식은 작동하지 않습니다.

유튜브가 형식별로 다른 속도 제한을 제공하는 것 같습니다. ‘/embed’ 형식은 더 많은 요청을 허용하는 것처럼 보입니다. 이는 순수한 개인적인 경험이며, 이에 대한 구체적인 데이터는 없습니다.

몇 가지 질문이 있습니다.

Digital Ocean에서 호스팅을 하고 계신가요?

IPv6를 사용 중이신가요?

비디오 ID가 올바르게 형성되었는지 확인해 보셨나요? (11자입니다) (바보 같은 질문일 수 있지만, 의외로 이런 경우가 많습니다)

특정 유튜브 비디오에 대해 지원되는 세 가지 형식을 모두 시도해 보셨나요? 즉,

어떤 형식이 작동했고 어떤 형식이 작동하지 않았나요?

저는 이 문제로 몇 주 동안 고생했지만, 작동 가능한 해결책을 찾았습니다. 하지만 왜 작동하는지는 정말로 이해하지 못합니다.

가정을 하자면, 동일한 문제를 겪고 계신다면 Onebox Assistant를 설치한 후 활성화하되 설정하지 마세요.

활성화 후 작동하도록 확인하기 위해 서버를 재시작(bounce)해야 했었습니다.

이 설정은 사실 작동해서는 안 되는 것이지만, 제 경우 속도 제한을 받는 유튜브 비디오(모든 형식)가 Onebox에 의해 확장됩니다. 이 원리는 정확히 알지 못합니다.

@merefield (작성자)와 이 문제에 대해 여기서 논의하고 있습니다…

https://meta.discourse.org/t/onebox-assistant-crawl-for-those-previews-reliably/107405/36?u=bletch

만약, 그리고 이것은 큰 가정이지만, 이 방법도 당신에게 작동한다면, 이는 적절한 해결책이 아닙니다. 단순히 메서드 반환 값의 특이한 현상일 뿐이며 장기적으로 의존해서는 안 됩니다.

별개로, Onebox Assistant 플러그인을 의도된 대로 embed.rocks에 구독하여 사용했는데, 매우 잘 작동했습니다.

일반 유튜브 링크와 일반이 아닌 유튜브 링크를 정의해 주실 수 있나요?

그렇다면 왜 데이터를 폴링하기 전에, 이전에 작동했던 하나의 형식으로 변환하지 않는 것인가요?

가능성은 있을 수 있겠지만, 이건 '수정’이라고 할 수 없어요.

모든 포맷이 속도 제한(rate limit)을 적용받다가 결국 실패하는 것으로 보입니다. 이전 재배킹(re-bake) 과정에서 실패했던 모든 YouTube 임베드를 다시 재배킹해 보려 했을 때, ‘/embed’ 포맷도 저에게는 실패했습니다.

게다가 여기에서 ‘/embed’ 라우트가 다른 포맷들과 달리 작동했던 사례를 공유한 경험담은 저를 포함해 단 두 건밖에 본 적이 없어요.

아직 증거도 부족하고, '피해자’라고 할 수 있는 사용자 수도 많지 않아서 변경을 제안하기에는 이르다고 봅니다.

@Terrapop 님도 이 문제를 경험하고 계신가요, 아니면 그저 관심 있는 쪽이신 건가요?

인기 커뮤니티를 곧 Discourse로 이전할 예정인 관계로, 이 주제에 관심이 많습니다. 현재는 스테이징 환경에서 테스트 중이며, 당장은 잘 작동하고 있습니다. 하지만 처음부터 안전한 환경을 구축하고 싶어, Onebox Assistant를 사용해 자체 엔드포인트를 설정할 계획입니다. 이 엔드포인트는 embeds.rock에서 가져온 임베드 응답을 중계하고 캐시할 예정이며, 이 방식이 실패할 경우 Iframely에서 데이터를 가져오도록 하겠습니다.

음, 방금 이것저것 시험해보다가 meta.discourse에서 재현할 수 있었어요. 마크다운과 관련이 있을 것 같아요. 제 youtu.be 링크는 포럼에서는 의도한 대로 잘 작동하지만, 아래 예제에서는 그렇지 않아요. 유튜브가 제 호스트를 차단하는 건 전혀 아니에요.

  1. meta.discourse에서도 작동하지 않아요: https://youtu.be/MLpyi-oVoI

보이나요? 비디오 링크에 문제는 없어요. 링크를 다음 줄에 붙여넣어도 여전히 작동하지 않아요.

  1. 이 링크도 작동하지 않아요:
    https://youtu.be/MLpyi-oVoIY

보이나요? 이제 이 동일한 링크를 여기에 붙여넣으면 작동해요:

YouTube에 의해 차단되지 않아서 다행이네요. 모든 것이 정상적으로 작동한다고 생각합니다. 이는 포맷 문제입니다.

Onebox가 링크를 확장하려면 a) 링크가 줄의 맨 앞에 단독으로 위치해야 하고, b) 목록 중간에 있다면 링크 앞에 추가적인 줄바꿈이 필요합니다.

게시글의 원본(raw) 버전을 살펴보세요.

https://meta.discourse.org/raw/153748/36

Ok, so I was just playing around and I was able to reproduce it here on meta.discourse! I believe it has something to do with markdown. My youtu.be links do in fact work my forum as intended just not in the examples below. Youtube isn't blocking my host at all.

1. This won't work even on meta.discourse: https://youtu.be/MLpyi-oVoI

See? There's nothing wrong with the video link. If you put the link on the next line, it still won't work.

2. This won't work either:
https://youtu.be/MLpyi-oVoIY

You see? Now if I paste this same link here, it will work:

https://youtu.be/MLpyi-oVoIY

첫 번째 항목 1.에서 링크가 줄의 중간에 위치하고 있으므로 확장되지 않는 것을 볼 수 있습니다. 링크는 줄의 첫 번째 요소여야 합니다.

두 번째 항목 2.에서는 YouTube 링크 앞에 줄바꿈이 하나만 있으므로 이 역시 확장되지 않습니다.

게시글의 포맷된 버전을 살펴보면 YouTube 링크에 걸출 들여쓰기(hanging indent)가 있는 것을 볼 수 있을 것입니다…

…이는 마크다운이 여전히 해당 링크를 불릿 포인트 2의 일부로 취급하고 있음을 의미하므로 확장되지 않습니다.

다음과 같이 작성할 수 있습니다.

  1. This is some filler text
  2. This link will work as I’ve left two return / linefeeds after this line and before the YouTube link

네, 마크다운을 다루는 법을 배우고 유튜브 링크를 별도의 줄에 배치하는 수밖에 없겠네요. 사용자들도 아직 적응 중이고, 실제로 한 사용자의 게시글에서 youtu.be 링크가 작동하지 않는 문제를 발견한 게 이 모든 것의 시작이었어요.

안녕하세요, 2일 전부터 100만 개 이상의 게시물을 재처리(rebake)하기 시작했는데, 오늘부터 유튜브 미리보기가 작동하지 않고 있습니다. 그래서 제 IP가 차단된 것 같습니다.
이 경우 어떻게 하는 것이 좋을까요? 재처리가 완료될 때까지 기다렸다가 유튜브에 연락하여 차단을 해제해 달라고 요청해야 할까요?
아니면 "Onebox Assistant", crawl for those previews reliably!? 링크를 사용해야 할까요?

부담이 안 된다면 분명 좋은 방법입니다.