从 youtube.com/c/xxxx 链接获取频道 ID?

ano*_*guy 2 youtube-api youtube-data-api

Youtube 似乎已经删除了其页面上的 /channel/XXXX 网址,现在是 /c/username?用户名并不是真正的“用户名”。例如

https://www.youtube.com/c/lukeemiani

通过运行查找

https://www.googleapis.com/youtube/v3/channels?part=snippet&forUsername=lukemiani&key=...
Run Code Online (Sandbox Code Playgroud)

没有返回结果。

我有一群非技术用户,他们接受过寻找 /channel/x 或 /user/x 并将正确的内容输入到我的应用程序中的培训。现在 /channel 已经消失了,我(或他们)如何将 /c/x 转换为频道 id?

我正在寻找 API 解决方案,而不是查看源代码和逆向工程代码解决方案。

stv*_*var 8

根据官方支持人员的说法,给定的频道可能关联了以下形式的 URL:

https://www.youtube.com/c/CUSTOM_NAME

在这种情况下,相应通道的customUrl属性是CUSTOM_NAME

现在,您的问题可能会重新表述如下:

给定CUSTOM_NAME上面的 URL 指向现有频道,是否有一个过程能够通过使用 YouTube 数据 API 生成该频道的 ID,以便相应的过程符合DTOS(即程序的工作原理是不抓取从相应自定义 URL 获取的 HTML 文本)?

对上述问题的简短回答是否定的,没有。(请查看我的回答以及我最近对类似问题给出的附加评论)。

更长的答案如下:是的,可以想象一种解决问题的算法,但只能部分解决(因为不能保证它总是给出积极的结果)。

这是算法:

  1. 使用Search.list以下参数调用 API 端点:
    • q=CUSTOM_NAME,
    • type=channel, 和
    • maxResults=10
  2. 从结果集中提取得到通道ID(这些ID位于items[].id.channelId);
  3. 对于步骤 2 中获取的列表中的每个通道 ID:
    1. 调用Channels.listAPI端点获取通道的关联customUrl属性(如果有);
    2. 如果获得的customUrl等于,则停止生成当前通道 ID 的CUSTOM_NAME算法;否则,继续执行当前循环;
  4. 通过生成未找到通道 ID来停止算法。

由于端点提供的结果集具有模糊性Search.list,因此不能排除实际存在自定义 URL(即指向现有通道的上述形式的 URL)的可能性,而该算法无法为其生成关联通道的ID。

最后一点:Channels.list端点接受的id参数是逗号分隔的通道 ID 列表。因此,我们可以很容易地修改上述算法,使得端点的N调用 ( N <= 10)Channels.list不再只有一个。


使用 Google 的 Python API 客户端库以 Python 语言实现上述算法:

def find_channel_by_custom_url(
        youtube, custom_url, max_results = 10):
    resp = youtube.search().list(
        q = custom_url,
        part = 'id',
        type = 'channel',
        fields = 'items(id(kind,channelId))',
        maxResults = max_results
    ).execute()
    assert len(resp['items']) <= max_results

    ch = []
    for item in resp['items']:
        assert item['id']['kind'] == 'youtube#channel'
        ch.append(item['id']['channelId'])

    if not len(ch):
        return None

    resp = youtube.channels().list(
        id = ','.join(ch),
        part = 'id,snippet',
        fields = 'items(id,snippet(customUrl))',
        maxResults = len(ch)
    ).execute()
    assert len(resp['items']) <= len(ch)
    
    for item in resp['items']:
        url = item['snippet'].get('customUrl')
        if url is not None and \
            caseless_equal(url, custom_url):
            assert item['id'] is not None
            return item['id']

    return None

Run Code Online (Sandbox Code Playgroud)

上面使用的函数caseless_equal是由于这个 SO 答案

在这里发布了一个简单的 Python3 脚本,它将上述功能包含find_channel_by_custom_url在一个独立的程序中。应用于此脚本的自定义 URL 会产生预期结果:

$ python3 youtube-search.py \
--custom-url lukemiani \
--app-key ...
UC3c8H4Tlnm5M6pXsVMGnmNg

$ python3 youtube-search.py \
--user-name lukemiani \
--app-key ...
youtube-search.py: error: user name "lukemiani": no associated channel found
Run Code Online (Sandbox Code Playgroud)

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

  • 谢谢你,@aslamdoctor。我有很多基于我​​的这篇文章(和代码)的答案(只需在搜索框中输入两个术语中的任何一个:“user:8327971 自定义 URL”或“user:8327971 forusername”)。根据我的经验,用户很少接受并投票与他们的观点相矛盾的答案(即使各自的答案只断言事实,例如引用官方文档并引入有效的反例)。 (2认同)