Youtube似乎已经摆脱了页面上的/channel/XXXX URL,现在是/c/username?用户名不是真正的“用户名”。例如
https://www.youtube.com/c/lukemiani
通过以下方式运行查找
https://www.googleapis.com/youtube/v3/channels?part=snippet&forUsername=lukemiani&key=...
不返回任何结果。
我有一群非技术用户,他们受过训练,可以寻找/channel/x或/user/x,并在我的应用程序中输入正确的东西。现在/channel已经不存在了,我(或他们)如何将/c/x转换成通道id呢?
我在寻找API解决方案,而不是视图源代码和反向工程代码解决方案。
您可以在python或任何http请求库中执行此操作,方法是请求链接并解析通道ID的响应。频道 ID 位于处理重定向的规范链接代码中:
import requests
import re
url = "https://www.youtube.com/shroud"
r = requests.get(url, allow_redirects=True)
print(re.search(r'(?<=<link rel="canonical" href="https:\/\/www\.youtube\.com\/channel\/)(-?\w+)*(?=">)', r.text).group(0))
# Returns UCoz3Kpu5lv-ALhR4h9bDvcw
根据官方支持人员的说法,一个给定的频道可能与以下形式的URL相关联:
https://www.youtube.com/c/CUSTOM_NAME
。
在这种情况下,将CUSTOM_NAME
相应通道的 customUrl
属性。
现在,您的问题可以重新表述如下:
给定一个< code>CUSTOM_NAME,上面的URL指向一个现有的频道,是否有一个过程能够通过使用YouTube数据API产生该频道的ID,从而使相应的过程符合DTOS标准(即,该过程通过不抓取从相应的自定义URL获得的HTML文本来工作)?
对上述问题的简短回答是不,没有。(请看看我的答案和我最近对类似问题的评论)。
较长的答案如下:是的,可以想象一种算法可以解决问题,但只能部分解决(因为不能保证它总是给出积极的结果)。
这是算法:
Search.list
API 终结点:
q=CUSTOM_NAME
,类型 = 通道
,以及最大结果 = 10
。由于 Search.list
终结点提供的结果集的模糊性,因此无法排除以下可能性:实际上可能存在自定义 URL(即上述形式指向现有通道的 URL),而此算法无法为其生成关联通道的 ID。
最后一点:<代码>频道。listendpoint接受其id
参数为逗号分隔的信道id列表。因此,可以很容易地修改上述算法,以代替N
调用(N
上述算法的Python语言实现,使用Google的Python API客户端库:
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
其中,上面
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
请注意,您必须将应用程序密钥作为参数传递给此脚本,并将其传递给命令行选项
--app key
(使用--help
获取简要的帮助信息)。
我如何从youtube频道获取持续时间和浏览量都很重要的视频? 我试过这个请求: https://www.googleapis.com/youtube/v3/search?part=snippet, id 但响应不包含持续时间/视图计数。有什么想法吗?谢谢。
我正在使用https://developers.google.com/youtube/的这些API,但是我想不出,给定一个youtube频道地址,如何获得带有相关信息的视频列表(至少是单个视频url和标题)
问题内容: 我获得了这段代码,以便从www.youtube.com/watch?v=xxxxxxx之类的链接获取youtube ID 基本上这将使我轻松获得id v = xxxxxxxx 但我注意到有时youtube链接会像这样 我正在从提要中获取链接,所以我需要为此构建一个正则表达式,还是需要一个解析器来为我获取它? 问题答案: 尝试了其他方法,但在我的情况下失败了-调整了正则表达式以适合我的网
问题内容: 我想从某些流式视频资源(例如you- tube或metacafe.com)中获取确切的视频链接,因为没有直接的视频链接可用。如何解析视频链接。还有如何使用Java将流视频从http url下载到本地系统? 谢谢! 问题答案: 我以前使用了一个名为HTMLParser的库。它可以读取html输入并生成HTML节点。然后,您可以分析并检索您喜欢的节点。
目前,我使用它是为了从给定频道获得视频ID列表: 去找https://www.googleapis.com/youtube/v3/search?order=date 这是可行的,但是我想从中获取视频的频道有超过50个在线视频。我已经研究过这个问题,YouTube API可以在一个频道上获取所有视频,但每个在线解决方案最多只能获取50个视频。 我怎样才能得到每一个视频,而不仅仅是50个?
我正在尝试从YouTube自动生成频道(又名主题)获取所有视频。我让我的用户添加到YT频道的链接,我发送频道ID以检索视频。 在常规情况下,当通道不是自动生成的时,我正在使用此终结点:https://www.googleapis.com/youtube/v3/channels?part=snippet 此endpoint返回发布到此频道的视频列表。主题的问题是视频列表返回空... 以下请求的示例: