如何在 2015 年 4 月 20 日之后获取 Youtube 频道 RSS 提要(无 v3 API)?

How to get a Youtube channel RSS feed after 2015 April 20 (without v3 API)?

既然 API v2 已经消失,那么在没有 v3 API 的情况下获取频道的简单 RSS 提要的方法是什么?如果目标是提要 reader,我愿意接受 Yahoo Pipes 或任何比为 v3 API 创建应用程序更简单的解决方法。我只需要一个 RSS 提要。直到现在它都是公开可用的,现在随时可以停止(我认为)。那么,为什么不再允许在没有 API 密钥的情况下访问它。

我创建了一个小的 PHP 脚本,用于抓取 Youtube URL 的视频 link,然后将它们输出为 atom feed:https://gist.github.com/Skalman/801436d9693ff03bc4ce

URL如https://www.youtube.com/user/scishow/videos工作。

注意事项:

  • 该工具不抓取日期
  • 播放列表包含的视频不会超过 100 个
  • 播放列表包括 "play all" link
  • 仅为频道正确设置了作者(例如,不是播放列表)
  • 如果你用得太多,Youtube 可能会阻止你(但希望限制足够高)
  • 可能还有几个...

RSS Reader 部分 https://support.google.com/youtube/answer/6098135?hl=en 有一个选项可以将您的订阅导出到 OPML 文件。然后,查看 OPML 的内容可以提取提要,每个提要的结构为:

https://www.youtube.com/feeds/videos.xml?channel_id=XXXX

因此,如果您知道频道 ID,则可以从此结构生成新的提要。这种提要不会出现“https://youtube.com/devicesupport”错误,所以我希望它们会继续工作。

我在这里创建了一个 Yahoo Pipes 示例。
http://pipes.yahoo.com/pipes/pipe.info?_id=6eeff0110a81f2ab94e8472620770b11

您可以 运行 通过按 "Run Pipe" 而不填充 API 键来使用此管道。但克隆时必须提供自己的 API Key 和频道 ID(可通过频道 API 获取)。想要通过 YouTube 用户名自动获取 channelId 但不容易通过管道传输。

在您的管中,单击左侧窗格中的订阅。这将在页面中央打开您的所有订阅。向下滚动,您会找到导出到 RSS reader 按钮,它会生成一个包含您所有订阅的 xml 文件。我已经这样做并将其添加到我喜欢的 rss reader feedly.

我制作了一个批处理脚本,可以为您的新订阅视频创建 RSS 提要。您不需要 API 键。该脚本使用了 2 个外部工具:YouTube-DL 和 Xidel。

无论如何,请阅读以下线程,然后转到post 98 下载脚本: http://code.google.com/p/gdata-issues/issues/detail?id=3946#c98

我希望有人将其编码为 php、python、javascript、powershell 或 bash。

还有 RSS-Bridge 可以从许多服务中提取 RSS 提要,例如 Twitter、Google+、Flickr、Youtube、Identi.ca 等

来源:https://github.com/sebsauvage/rss-bridge

演示服务器:https://bridge.suumitsu.eu/

尝试使用这个 URL: https://www.youtube.com/feeds/videos.xml?user=USERNAME

适合我。

您可以获得这样的供稿:

https://www.youtube.com/feeds/videos.xml?channel_id=CHANNELID
https://www.youtube.com/feeds/videos.xml?user=USERNAME
https://www.youtube.com/feeds/videos.xml?playlist_id=YOUR_YOUTUBE_PLAYLIST_NUMBER

但是不再支持以前支持的JSON格式(带有附加参数&alt=JSON)。

此外,您可以请求 API 密钥,以便 public 从您的 developer console 访问您的 YouTube 视频,并以 JSON 格式获取 YouTube 视频和播放列表,如下所示:

- Get Channels: 
  https://www.googleapis.com/youtube/v3/channels?part=snippet%2CcontentDetails&forUsername={YOUR_USER_NAME}&key={YOUR_API_KEY}
- Get Playlists: 
  https://www.googleapis.com/youtube/v3/playlists?part=snippet%2CcontentDetails&channelId={YOUR_CHANNEL_ID}&key={YOUR_API_KEY}
- Get Playlist Videos: 
  https://www.googleapis.com/youtube/v3/playlistItems?part=snippet%2CcontentDetails%2Cstatus&playlistId={YOUR_PLAYLIST_ID}&key={YOUR_API_KEY}

来自 YouTube v3 docs 的更多信息。

如果您检查任何 Youtube 频道页面,在 <head> 中您会发现这样的 rss 元节点:

<link rel="alternate" 
      type="application/rss+xml" title="RSS"     
      href="https://www.youtube.com/feeds/videos.xml?channel_id=UCn8zNIfYAQNdrFRrr8oibKw">

这应该会为您提供所需的数据。

通过在YouTube频道页面的源代码中搜索属性data-channel-external-id来获取频道ID。 (感谢 helq)。

此代码将从提要中获取所有视频标题和 ID,并将其转储到一个数组中:

$channel_id = 'XXX'; // put the channel id here
$youtube = file_get_contents('https://www.youtube.com/feeds/videos.xml?channel_id='.$channel_id);
$xml = simplexml_load_string($youtube, "SimpleXMLElement", LIBXML_NOCDATA);
$json = json_encode($xml);
$youtube = json_decode($json, true);
$yt_vids = array();
$count = 0;
foreach ($youtube['entry'] as $k => $v) {
    $yt_vids[$count]['id'] = str_replace('http://www.youtube.com/watch?v=', '', $v['link']['@attributes']['href']);
    $yt_vids[$count]['title'] = $v['title'];
    $count++;
}
print_r($yt_vids);

我发现了一个名为 Youtube RSS-ify 的 Chrome 扩展,它在视频、频道和导航页面上注入了一个 RSS 图标。这正是我要找的。

图标看起来像这样:

我建议使用优秀的 rss 解析器。其中有许多可用,但您可以尝试 http://simplepie.org/,这是我在个人项目中使用的最好的之一。

通过一些示例对其进行了很好的记录。

用法示例

注意:使用了 YouTube 频道大学幽默,您可以从频道页面本身获取它

<?php
include_once('../autoloader.php');
// Parse it
$feed = new SimplePie();
$feed->set_feed_url('https://www.youtube.com/feeds/videos.xml?channel_id=UCPDXXXJj9nax0fr0Wfc048g');
$feed->enable_cache(false);
$feed->init();

$items = $feed->get_items();

foreach ($items as $item)
{
    echo $item->get_title() . "\n";
}

var_dump($feed->get_item_quantity());

获取频道 ID 的最简单方法:

打开订阅管理器(左侧面板,订阅下方)并点击所需的用户。

url 将采用以下形式: https://www.youtube.com/channel/XXXXXXXXXXXXXXXXX

所以提要 url 应该是:

https://www.youtube.com/feeds/videos.xml?channel_id=XXXXXXXXXXXXXXXXX

注意:最好使用频道 ID 而不是用户名,因为用户名可能会更改。

来自我的博客 Post:http://tcodesblog.blogspot.com/search/label/howtofindyouryoutubechannelfeed


如何找到您的 YOUTUBE 频道供稿

在过去,这很容易(2009 年),但现在很难找到(2012 年至今)。这是从您的 YouTube 频道查找新 Feed 的快速方法。请记住正确遵循列表!

  1. 首先找到您的频道 ID:您可以在仪表板中转到您的 YouTube 频道来完成此操作

  2. 复制频道 ID:您的 频道 ID 可以在您从仪表板访问您的 YouTube 频道时找到

  3. Copy your channel id: 复制你的channel id并替换channelidgoeshere 下面加上您的 频道 IDhttps://www.youtube.com/feeds/videos.xml?channel_id=channelidgoeshere

  4. 复制整个 YouTube 频道供稿并创建一个简化的供稿:您可以通过在 http://www.feedburner.com/ 的 FeedBurner link 中创建一个较短的供稿来做到这一点(需要 Google 帐户。免费使用。),这也是 Google 的一部分。创建一个新的供稿(select 我是播客! 以查看您的视频出现在供稿中并使您的供稿与其他供稿阅读器兼容,例如:Digg Reader、Apple iPhone Apple News App、Apple iPhone Podcasts App、Feedly 等)-或- 通过复制整个 YouTube 频道供稿编辑现有应用,然后单击 正常保存 Feed 详细信息

  5. 您的 YouTube 频道供稿现在可以使用了,您的视频可以直接在 FeedBurner 供稿上的供稿文件中看到。我的视频在 YouTube 上作为 https://www.youtube.com/feeds/videos.xml?channel_id=UCvFR6YxwnYfLt_QqRFk_r3g 的提要,在 FeedBurner 上作为 http://feeds.feedburner.com/youtube/warrenwoodhouse 提供,我的视频仅以文本格式显示,例如,因为我需要更新我的视频以显示我的视频。您可以更改 FeedBurner 中的不同设置并执行其他操作,因此值得一试,因为它免费且易于使用。我强烈建议使用 FeedBurner 或其他提要创建服务,但是,FeedBurner 是您最好的选择,因为它还包括 cross-feed 订阅服务机制(USM - 通用订阅机制),这意味着您的提要可以从任何兼容设备读取,例如作为计算机,移动 phone(安装了正确的应用程序),通过较旧的网络浏览器(例如支持网页快讯和 RSS/Atom/XML 提要的 Internet Explorer)。

您的提要也可以在 Apple iPhone Apple News App 和 Apple iPhone Apple iPhone、Apple iPod Touch 和 Apple iPad 上的 Podcasts App 打开如果您已将设置正确设置为 USM(通用订阅机制)。一旦生效,您的提要可以通过不同的服务和设备查看。

您在 FeedBurner 上的供稿允许您创建电子邮件订阅、标题动画器(向您展示如何从 link 到最新的 post)以及有多少订阅者、Chiclets 和其他很酷的东西.

我希望这个答案有用,如果你想看到我的一些更酷的编码实践,请随时查看我的 T-Codes 网站 http://warrenwoodhouse.webs.com/codes,了解更多内容。

我认为 youtube 响应发生了一些变化,因此我进行了一些更改以使用 Curl 从 rss 提要获取频道 ID。

$channel_id = 'XXXXXXXX'; // put the channel id here

//using curl
$url = 'https://www.youtube.com/feeds/videos.xml?channel_id='.$channel_id.'&orderby=published';
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER,1);
//curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'GET');
$response  = curl_exec($ch);
curl_close($ch);

$response=simplexml_load_string($response);
$json = json_encode($response);
$youtube= json_decode($json, true);

$count = 0;
if(isset($youtube['entry']['0']) && $youtube['entry']['0']!=array())
{
    foreach ($youtube['entry'] as $k => $v) {
        $yt_vids[$count]['id'] = str_replace('http://www.youtube.com/watch?v=', '', $v['link']['@attributes']['href']);
        $yt_vids[$count]['title'] = $v['title'];
        $count++;
    }
}
else
{
    $yt_vids[$count]['id']=str_replace('http://www.youtube.com/watch?v=', '', $youtube['entry']['link']['@attributes']['href']);
    $yt_vids[$count]['title']=$youtube['title'];
}
echo "<pre>";
print_r($yt_vids);

我使用以下代码将 Youtube Feed 与 wordpress custom field "ACF plugin" & FancyBox

集成
    <?php  
    $channel_id = get_field('youtube_chanel_id'); //ACF text field
    if ($channel_id){ // if channel_id not empty -- START
    $youtube = file_get_contents('https://www.youtube.com/feeds/videos.xml?channel_id='.$channel_id);
    $xml = simplexml_load_string($youtube, "SimpleXMLElement", LIBXML_NOCDATA);
    $json = json_encode($xml);
    $youtube = json_decode($json, true);
        echo'<div class="col-md-12 youtube-videos-feed">';  
        foreach ($youtube['entry'] as $k => $v) {
            $id = str_replace(array("yt:video:"), "", $v['id']); // Remove "yt:video:" from ID value
            //$date = $v['updated']; // video updated date (disabled for now)
            $title = $v['title']; // video title
            echo '<a class="with-video" href="https://www.youtube.com/watch?v=',$id,'&autoplay=1&rel=0&controls=0&showinfo=0&modestbranding=0" data-fancybox="videos"  data-caption="',$title,'" title="',$title,'" >
                <div class="col-md-3 main-image post-image img-fancy">
                    <img src="https://img.youtube.com/vi/',$id,'/0.jpg" alt="',$title,'" >
                </div>
            </a>';
        }
        echo'</div>';
    } // if channel_id not empty -- END
 ?>