【问题标题】:How to get a YouTube channel ID from the channel's username which includes Cyrillic characters如何从包含西里尔字符的频道用户名中获取 YouTube 频道 ID
【发布时间】:2020-10-15 23:21:03
【问题描述】:

这是一个在用户名中包含西里尔字母的 YouTube 频道网址:
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 DATA 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,但没有任何作用。

我缺少一些字符编码问题吗?

【问题讨论】:

    标签: youtube-api youtube-data-api


    【解决方案1】:

    如果您将发出以下命令(在任何 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 的 issue tracker 上查询 channels forusernamevanity URL 这两个短语中的任何一个来说服自己,以查看用户从 Google 员工那里得到的简洁/原始的官方回复。

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

    最后一点,您可以从https://www.youtube.com/c/лучшиедокументальныефильмы 获得的 HTML 页面中刮出您感兴趣的频道 ID,但请记住,Google 禁止此活动,根据其DTOS docs

    抓取

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

    我建议使用Search.list API 端点而不是抓取,使用q 参数为лучшиедокументальныефильмыtype 参数为channel 调用(如果你能够应付隐含的模糊性)。


    更新 answering 到一个相关的 SO 问题

    Here 是一个简单的 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 获取简要帮助信息)。

    【讨论】:

    • 那么是不是可以从虚名频道名中确定频道id,而无需抓取页面,仅根据虚名URL?
    • 在以编程方式执行时,仅使用Search.list 端点而不进行抓取(因此符合 DTOS)——如果您的算法能够处理所获得结果集的模糊性。
    • 如果手动进行,您可以使用 Youtube Web UI 本身的搜索功能。在这种情况下,通过复制粘贴搜索词лучшиедокументальныефильмы,然后应用(再次手动)过滤器类型为channel。在浏览器中获得的搜索结果在顶部列出了规范化的频道 URL:https://www.youtube.com/channel/UCk8LWzqGcHz21FWysiXuCHw。频道 ID 只是基本 URL https://www.youtube.com/channel/ 末尾的整个字符串。
    • 这个手动活动是完全合法的w.r.t。用于获取通道 ID 的 DTOS——用于以编程方式进一步调用 API 端点。
    • 我希望有一个API可以在两者之间进行转换,使用搜索API意味着可能存在误报(例如一个流行的名字)。
    猜你喜欢
    • 2014-10-12
    • 2013-05-31
    • 2016-06-19
    • 1970-01-01
    • 2012-12-31
    • 2020-11-26
    • 2015-06-23
    • 2019-12-07
    • 2018-04-16
    相关资源
    最近更新 更多