Youtube API - подписка на push-уведомления

Моя конечная цель - настроить Webhook всякий раз, когда пользователь YouTube загружает видео. После некоторого исследования я добрался до этой статьи.

Но когда я перехожу к части https://www.youtube.com/xml/feeds/videos.xml?channel_id=CHANNEL_ID, я получил Restricted topic ошибку при попытке подписаться на хабы Google / SuperFeedr. У меня также работает URL-адрес обратного вызова.

Я хочу подписаться на следующую тему: https://www.youtube.com/xml/feeds/videos.xml?channel_id=UC7T8roVtC_3afWKTOGtLlBA

Что ничего не показывает при посещении через браузер.

Я делаю что-то неправильно? Я борюсь уже несколько часов, любая помощь приветствуется. Спасибо!

ОБНОВЛЕНИЕ: я нашел это, но эти каналы не имеют атрибута rel=”hub”, поэтому, вероятно, бесполезны, если я хочу подписаться на хаб.


person Poyu    schedule 13.04.2015    source источник
comment
Не уверен, почему Google указывает на концентратор суперподключения, потому что ... ну, они не пингуют нас! Однако вы должны получать данные из их хаба.   -  person Julien Genestoux    schedule 23.04.2015
comment
Здесь та же проблема. Мне также потребовалось много времени, чтобы понять, что https://www.youtube.com/XML/feeds/videos.xml?channel_id= URL отличается от <link rel="alternate" type="application/rss+xml" title="RSS" ...>, указанного в исходном коде страницы канала YouTube.   -  person user3498909    schedule 24.04.2015
comment
Удалось ли вам заставить его работать?   -  person user3498909    schedule 24.04.2015
comment
Кому-нибудь удалось заставить эту работу работать с Youtube API v3? У меня тоже закрытая тема и никаких уведомлений ...   -  person thomas    schedule 07.05.2015
comment
Я нашел это, но в этом фиде нет rel=”hub” так что мне это бесполезно. Пытался подписаться на это, но так и не получил никаких уведомлений. Это действительно расстраивает ...   -  person Poyu    schedule 07.05.2015
comment
Очень надеюсь на некоторую помощь здесь, у меня была та же проблема. Кто-то также указал здесь: code.google.com/p/ gdata-issues / issues / detail? id = 7138   -  person Nicholas Petersen    schedule 12.05.2015
comment
См. Также обсуждение здесь (ответов не дано): code. google.com/p/gdata-issues/issues/detail?id=5602   -  person Nicholas Petersen    schedule 12.05.2015
comment
Это я создал проблему 7138, надеюсь они ответят нам в ближайшее время.   -  person Poyu    schedule 12.05.2015
comment
Исправлено: code.google.com/p / gdata-issues / issues / detail? id = 7138 # c15   -  person user3498909    schedule 28.10.2015
comment
У меня работает сейчас с использованием формата https://www.youtube.com/xml/feeds/videos.xml?channel_id=CHANNEL_ID (диагностика подписчиков на pubsubhubbub.appspot.com/subscribe не работает хоть работать ..).   -  person danmichaelo    schedule 29.05.2017


Ответы (3)


  1. вам нужно отправить запрос на подписку на канал
  2. обратный вызов, который изменяет запрос на подписку и получает актуальные данные при обновлении

функция подписки:

subscribe.php может выглядеть так:

<?php

function subscribeYoutubeChannel($channel_id = null, $subscribe = true) {
    $subscribe_url = 'https://pubsubhubbub.appspot.com/subscribe';
    $topic_url = 'https://www.youtube.com/xml/feeds/videos.xml?channel_id={CHANNEL_ID}';
    $callback_url = 'http://' . $_SERVER['SERVER_NAME'] . str_replace(basename($_SERVER['REQUEST_URI']), '', $_SERVER['REQUEST_URI']) . 'youtube_subscribe_callback.php';

    $data = array(
        'hub.mode' => $subscribe ? 'subscribe' : 'unsubscribe',
        'hub.callback' => $callback_url,
        'hub.lease_seconds'=>60*60*24*365,
        'hub.topic'=> str_replace(array(
            '{CHANNEL_ID}'
        ), array(
            $channel_id
        ), $topic_url)
    );

    $opts = array('http' =>
        array(
            'method'  => 'POST',
            'header'  => 'Content-type: application/x-www-form-urlencoded',
            'content' => http_build_query($data)
        )
    );

    $context  = stream_context_create($opts);

    @file_get_contents($subscribe_url, false, $context);

    return preg_match('200', $http_response_header[0]) === 1;
}

после отправки запроса служба pusub вызовет youtube_subscribe_callback.php, чтобы проверить подписку, она будет использовать метод GET и ожидает получить ответ «hub_challenge». после этого, если вы загрузите видео на свой тестовый канал, youtube_subscribe_callback.php получит POST-запрос с данными.

поэтому youtube_subscribe_callback.php (определенный в функции subscribeYoutubeChannel) может выглядеть так:

 <?php
    if (isset($_GET['hub_challenge'])) {
        echo $_REQUEST['hub_challenge'];
    } else {

        $video = parseYoutubeUpdate(file_get_contents('php://input'));

    }

    function parseYoutubeUpdate($data) {
        $xml = simplexml_load_string($data, 'SimpleXMLElement', LIBXML_NOCDATA);
        $video_id = substr((string)$xml->entry->id, 9);
        $channel_id = substr((string)$xml->entry->author->uri, 32);
        $published = (string)$xml->entry->published;

        return array(
            'video_id'=>$video_id,
            'channel_id'=>$channel_id,
            'published'=>$published
        );
    }
person salexch    schedule 14.07.2016
comment
Это «hub.challenge», а не «hub_challenge» (по крайней мере, теперь это так). Кроме того, может быть полезно для кого-то конкретно знать, что это значение для 'hub.challenge' передается как параметр запроса (не в заголовках или теле), когда URL-адрес обратного вызова попадает после запроса подписки. - person timraybould; 18.09.2019
comment
Вы знаете, есть ли ограничение на количество каналов, на которые я могу подписаться? Я подумываю использовать это как основной способ получить обновление канала, но для сотен тысяч каналов. - person Alex Benfica; 26.05.2020
comment
@timraybould PHP заменит точку на подчеркивание в $ _GET, поэтому "hub_challenge" здесь правильно. - person Markus Laire; 06.09.2020

Мне не удалось подписаться на канал по идентификатору, но я смог сделать это по имени пользователя:

https://www.youtube.com/feeds/videos.xml?user=username

Итак, вы переходите на эту страницу:

https://pubsubhubbub.appspot.com/subscribe

Вставьте URL-адрес обратного вызова, RSS-канал с YouTube с именем пользователя и режимом «подписка».

Не забудьте ответить со своего URL-адреса обратного вызова, чтобы он мог подтвердить подписку, в PHP просто напечатайте:

echo $_REQUEST["hub_challenge"];

Подробнее здесь и здесь.

person dikirill    schedule 03.09.2015
comment
Кстати, вчера я подписался через pubsubhubbub, один из новостных каналов на YouTube, и никогда не получаю пинг на свой URL-адрес обратного вызова. Итак, я не уверен, работает ли это для RSS-каналов YouTube. - person dikirill; 03.09.2015

Обычно этот процесс состоит из двух этапов: сначала вы переходите на страницу подписаться, вводите URL-адрес сервера обратного вызова, тему url (который в основном является URL-адресом канала ytb, который вы хотите прослушивать, другие поля необязательны), сервер pub проверит вашу подписку с помощью GET запроса к вашему серверу обратного вызова, на ходу это может выглядеть так:

http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
    challenge := r.URL.Query().Get("hub.challenge")
    if challenge != "" {
        fmt.Fprintf(w, challenge)
    }
})

Затем при каждом новом видео (или обновлении названия, описания старого видео) паб будет отправлять POST запрос на ваш сервер с xml в теле, похожим на это:

<?xml version='1.0' encoding='UTF-8'?>
<feed xmlns:yt="http://www.youtube.com/xml/schemas/2015" xmlns="http://www.w3.org/2005/Atom">
  <link rel="hub" href="https://pubsubhubbub.appspot.com" />
  <link rel="self" href="https://www.youtube.com/xml/feeds/videos.xml?channel_id=UCtEorrVfo4GQsN82HsrnKyk" />
  <title>YouTube video feed</title>
  <updated>2018-12-12T06:02:55.950497732+00:00</updated>
  <entry>
    <id>yt:video:_em_FFNUcvs</id>
    <yt:videoId>_em_FFNUcvs</yt:videoId>
    <yt:channelId>UCtEorrVfo4GQsN82HsrnKyk</yt:channelId>
    <title>December 12, 20</title>
    <link rel="alternate" href="https://www.youtube.com/watch?v=_em_FFNUcvs" />
    <author>
      <name>Ak Ram</name>
      <uri>https://www.youtube.com/channel/UCtEorrVfo4GQsN82HsrnKyk</uri>
    </author>
    <published>2018-12-12T05:57:07+00:00</published>
    <updated>2018-12-12T06:02:55.950497732+00:00</updated>
  </entry>
</feed>
person Akram Saouri    schedule 12.12.2018