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 解决方案,而不是查看源代码和逆向工程代码解决方案。
根据官方支持人员的说法,给定的频道可能关联了以下形式的 URL:
https://www.youtube.com/c/CUSTOM_NAME
。
在这种情况下,相应通道的customUrl
属性是CUSTOM_NAME
。
现在,您的问题可能会重新表述如下:
给定
CUSTOM_NAME
上面的 URL 指向现有频道,是否有一个过程能够通过使用 YouTube 数据 API 生成该频道的 ID,以便相应的过程符合DTOS(即程序的工作原理是不抓取从相应自定义 URL 获取的 HTML 文本)?
对上述问题的简短回答是否定的,没有。(请查看我的回答以及我最近对类似问题给出的附加评论)。
更长的答案如下:是的,可以想象一种解决问题的算法,但只能部分解决(因为不能保证它总是给出积极的结果)。
这是算法:
Search.list
以下参数调用 API 端点:
q=CUSTOM_NAME
,type=channel
, 和maxResults=10
。items[].id.channelId
);Channels.list
API端点获取通道的关联customUrl
属性(如果有);customUrl
等于,则停止生成当前通道 ID 的CUSTOM_NAME
算法;否则,继续执行当前循环;由于端点提供的结果集具有模糊性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
简短的帮助信息)。
归档时间: |
|
查看次数: |
2826 次 |
最近记录: |