如何从包含西里尔字符的频道用户名中获取YouTube频道ID

3
这是一个YouTube频道URL,其中用户名包含西里尔字母:
https://www.youtube.com/c/%D0%9B%D1%83%D1%87%D1%88%D0%B8%D0%B5%D0%B4%D0%BE%D0%BA%D1%83%D0%BC%D0%B5%D0%BD%D1%82%D0%B0%D0%BB%D1%8C%D0%BD%D1%8B%D0%B5%D1%84%D0%B8%D0%BB%D1%8C%D0%BC%D1%8B/videos

我正在尝试通过调用YouTube数据API v3从该URL获取频道ID:
https://www.googleapis.com/youtube/v3/channels?key=[YouTubeAPIkey]&forUsername=%D0%9B%D1%83%D1%87%D1%88%D0%B8%D0%B5%D0%B4%D0%BE%D0%BA%D1%83%D0%BC%D0%B5%D0%BD%D1%82%D0%B0%D0%BB%D1%8C%D0%BD%D1%8B%D0%B5%D1%84%D0%B8%D0%BB%D1%8C%D0%BC%D1%8B&part=id

但是该调用未返回任何数据。

作为参考,“https://www.youtube.com/c/besogontv/videos”返回有效结果:

https://www.googleapis.com/youtube/v3/channels?key=[YouTubeAPIkey]&forUsername=besogontv

为了验证是否可以解决问题,我尝试对URL进行解码再重新编码为UTF8,但是并没有起到任何作用。

我是否遗漏了某些字符编码问题?

1个回答

3
如果您在任何GNU/Linux bash提示符下发出以下命令:
$ wget \
--quiet \
--output-document=- \
--content-on-error \
"https://www.googleapis.com/youtube/v3/channels?key=$APP_KEY&id=UCk8LWzqGcHz21FWysiXuCHw&part=brandingSettings,contentDetails,id,snippet,statistics,status,topicDetails&maxResults=1"

你会发现лучшиедокументальныефильмы并不是该频道的用户名,而是其customUrl

forUsername属性不能用于给定频道的自定义URL,因为这些URL不能保证唯一地表示任何给定频道。

通过查询Google的问题跟踪器中的这两个短语之一channels forusernamevanity URL来看到用户从Google的工作人员那里得到的简洁/原始的官方回复。

确实,有时官方文档和工作人员的回复缺乏有用/有意义的明确规范和/或表述。(我自己也经历过所有这些!)

作为最后的说明,您可以从获取自https://www.youtube.com/c/лучшиедокументальныефильмы的HTML页面中抓取您感兴趣的频道ID,但请记住,这一活动被Google禁止,如其DTOS文档所述:

抓取

您和API客户端不得直接或间接地抓取YouTube应用程序或Google应用程序,也不得鼓励、使能或要求其他人直接或间接地抓取YouTube数据或内容。公共搜索引擎只能根据YouTube的robots.txt文件或经过YouTube事先书面许可来抓取数据。

相反,我建议使用Search.list API端点,调用时将q参数设置为лучшиедокументальныефильмы,将type参数设置为channel(如果您能够处理所涉及的模糊性)。

更新于回答相关SO问题后

这里有一个简单的Python3脚本,实现了您要寻找的功能。将您的自定义URL应用于此脚本会产生预期的结果:

$ python3 youtube-search.py \
--custom-url Лучшиедокументальныефильмы \
--app-key ...
UCk8LWzqGcHz21FWysiXuCHw

$ python3 youtube-search.py \
--user-name Лучшиедокументальныефильмы \
--app-key ...
youtube-search.py: error: user name "Лучшиедокументальныефильмы": no associated channel found

请注意,您需要将应用程序密钥作为命令行选项--app-key的参数传递给此脚本(使用--help获取简要帮助信息)。

1
那么,是否有可能仅基于虚拟URL而不需要爬取页面来确定频道ID呢? - bLight
1
在编程时,不使用爬虫(因此符合DTOS的规定),只使用“Search.list”端点进行程序化操作——如果您的算法能够处理所获得结果集的模糊性。 - stvar
1
如果要手动操作,您可以在Youtube的Web UI上使用搜索功能。在这种情况下,通过复制粘贴输入搜索词“лучшиедокументальныефильмы”,然后(再次手动)应用类型为“频道”的筛选器。浏览器中获得的搜索结果将在顶部位置列出规范化的频道URL:“https://www.youtube.com/channel/UCk8LWzqGcHz21FWysiXuCHw”。频道ID只是基本URL“https://www.youtube.com/channel/”末尾的整个字符串。 - stvar
这个“手动操作”在DTOS方面是完全合法的,可以用来获取频道ID,以便进一步通过API端点进行编程调用。 - stvar
@stvar 感谢您澄清手动修复的法律方面。我只有一个频道ID与channels().list()forUsername出现问题。因此,在浏览器中手动查找元数据是一个真正快速的解决方案。 - Simone
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接