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

Posted

技术标签:

【中文标题】如何在 2015 年 4 月 20 日之后获取 Youtube 频道 RSS 提要(没有 v3 API)?【英文标题】:How to get a Youtube channel RSS feed after 2015 April 20 (without v3 API)? 【发布时间】:2015-06-27 10:44:48 【问题描述】:

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

【问题讨论】:

我曾经使用 RSS 提要来获得这样的关键字搜索结果:gdata.youtube.com/feeds/base/… 那些 RSS 提要可能永远消失了。我需要更多时间来掌握 v3。 OP 应该接受 AitorF 的回答而不是 Dan 的回答,因为这样更好(而且选票不言自明)。 好的。但对我个人而言,抓取方法更通用,效果更好。 【参考方案1】:

RSS 阅读器 部分 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”错误,所以我希望它们会继续工作。

【讨论】:

可以通过在youtube页面源码中搜索data-channel-external-id属性获取频道id 很高兴知道这一点,但不幸的是,该提要不包含视频缩略图或有关视频的任何信息。忘了提到那些是需要的。 @Firsh 图片格式为http://i.ytimg.com/vi/[videoid]/default.jpg(正方形)和http://i.ytimg.com/vi/[videoid]/hqdefault.jpg(高质量)。 您也可以使用 youtube 用户名代替频道 ID,如下所示:youtube.com/feeds/videos.xml?user=xxxxxx @JohnChandler user=xxxx 是官方的东西,会继续工作吗?【参考方案2】:

您可以像这样获取提要:

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)现在不再支持了。

此外,您可以通过developer console 请求 API 密钥以公开访问您的 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。

【讨论】:

您能否获取搜索结果的 RSS 提要,这在 v2 中曾经是支持的。 你知道如何打破 youtube 播放列表的限制吗?即使播放列表有更多视频,这也只会返回 5 个结果【参考方案3】:

在您的试管中,单击左侧窗格中的订阅。这将在页面中心打开您的所有订阅。向下滚动,您会找到一个导出到 RSS 阅读器按钮,它会生成一个包含所有订阅的 xml 文件。我已完成此操作并将其添加到我喜欢的 rss 阅读器中。

【讨论】:

这绝对是最好的解决方案。我不明白为什么谷歌不把这些链接放在前面和中心。要在不订阅的情况下获取提要,请参阅频道页面的来源,并找到此行:<link rel="alternate" type="application/rss+xml" title="RSS" href="https://www.youtube.com/feeds/videos.xml?channel_id=_channel ID_">【参考方案4】:

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

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

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

【讨论】:

这可能在 2017 年初不再适用【参考方案5】:

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

此代码将从提要中获取所有视频标题和 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);

【讨论】:

【参考方案6】:

我创建了一个小的 php 脚本,它会抓取视频链接的 Youtube URL,然后将它们作为 atom 提要输出:https://gist.github.com/Skalman/801436d9693ff03bc4ce

https://www.youtube.com/user/scishow/videos 等 URL 有效。

注意事项:

该工具不会抓取日期 播放列表包含的视频不会超过 100 个 播放列表包含“全部播放”链接 仅针对频道正确设置了作者(例如,不是播放列表) 如果您使用过多,YouTube 可能会阻止您(但希望限制足够高) 可能还有更多...

【讨论】:

您为我指明了正确的方向,我将其提升到了一个新的水平,并根据我的具体需求量身定制了脚本。我设法抓取可用的日期(以漂亮的格式)、缩略图等。我不相信 YT 会阻止,因为用户代理被设置为浏览器,无论如何它不会经常抓取。唯一的问题是 YT 上的布局可能会发生变化。 @Firsh,你能发布修改后的脚本吗?谢谢。 不确定它对您有多大用处。我不再需要 RSS 格式,只是我可以抓取的事实。 snipplr.com/view/98436/improved-youtube-scrapers 这是我制作的一个更大的 WP 插件的一部分。抱歉,如果它看起来是随机的 :) 如果您有任何问题,请告诉我。【参考方案7】:

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

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

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

【讨论】:

【参考方案8】:

尝试使用此网址: https://www.youtube.com/feeds/videos.xml?user=USERNAME

对我来说很好。

【讨论】:

【参考方案9】:

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


如何找到您的 YouTube 频道供稿

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

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

    复制频道 id:您的频道 id 可以在仪表板中访问您的 YouTube 频道时找到

    复制您的频道ID:复制您的频道ID并将下面的channelidgoeshere替换为您的频道IDhttps://www.youtube.com/feeds/videos.xml?channel_id=channelidgoeshere

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

    您的 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 是您最好的选择,因为它还包括交叉提要订阅服务机制(USM - 通用订阅机制),这意味着您的提要可以从任何兼容设备读取,例如电脑、手机(安装了正确的应用程序),通过旧版网络浏览器(例如支持 Web Slices 和 RSS/Atom/XML Feeds 的 Internet Explorer)。

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

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

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

【讨论】:

【参考方案10】:

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

您可以在不填写 API 密钥的情况下按“运行管道”来运行此管道。但是您必须在克隆时提供自己的 API Key 和频道 ID(可以通过频道 API 获取)。想要通过 YouTube 用户名自动获取 channelId 但不容易管道。

【讨论】:

Pipes 于 2015 年 9 月 30 日停产 :( 是的,这很糟糕。我将编写一个执行类似操作的 Apps 脚本。【参考方案11】:

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

不管怎样,看下面的帖子,去98帖下载脚本: http://code.google.com/p/gdata-issues/issues/detail?id=3946#c98

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

【讨论】:

我不知道 youtube-dl 有这个功能 - 谢谢。它似乎也很好地隐藏在文档中......【参考方案12】:

我认为 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);

【讨论】:

【参考方案13】:

我使用以下代码将 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"  >
                </div>
            </a>';
        
        echo'</div>';
     // if channel_id not empty -- END
 ?>

【讨论】:

【参考方案14】:

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

图标如下所示:

【讨论】:

【参考方案15】:

我建议使用出色的 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());

【讨论】:

【参考方案16】:

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

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

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

所以提要网址应该是:

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

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

【讨论】:

以上是关于如何在 2015 年 4 月 20 日之后获取 Youtube 频道 RSS 提要(没有 v3 API)?的主要内容,如果未能解决你的问题,请参考以下文章

从减号表中获取不同的场景

您的应用可能会在 2015 年 4 月 30 日之后中断

“Google 帐户的 OpenID2 将于 2015 年 4 月 20 日停用”。我需要担心吗?

如何获取每组最早日期的记录

2019-03-18 Python time 将11月20日转换为2015-11-20

如何获得一个月内每周的第一天和最后一天?