【发布时间】:2021-12-20 13:41:51
【问题描述】:
我想在文本文档中显示有关 YouTube 个人资料中的链接的信息,我尝试通过请求库来实现,但 Google 提供了隐私和安全的链接,我在 YouTube API 文档中没有找到相关信息.谁知道,你可以帮忙解决这个问题
【问题讨论】:
-
啊,Stackoverflow 在你尝试的时候效果最好,它不起作用,你分享代码,然后然后我们评论它
标签: youtube-api
我想在文本文档中显示有关 YouTube 个人资料中的链接的信息,我尝试通过请求库来实现,但 Google 提供了隐私和安全的链接,我在 YouTube API 文档中没有找到相关信息.谁知道,你可以帮忙解决这个问题
【问题讨论】:
标签: youtube-api
这不可能使用 YouTube API,我实际上发现自己需要做和自己一样的事情,但由于 YouTube API 缺乏必要的功能而无法做到(希望很快就会添加!)
我看到你提到了 Python,我唯一的解决方案是在 Node 中,但我会做一个大的解释,你可以基于它来编写你的代码。为了在没有 YouTube API 的情况下获取横幅链接,我们需要抓取数据,因为 YouTube 使用客户端渲染,我们需要从源中抓取 JSON 配置。
在名为ytInitialData 的脚本中定义了一个变量,它是一个很大的 JSON 字符串,包含有关频道、观众和 YouTube 配置的大量信息。我们可以通过这个JSON链接解析找到banner链接。
const request = require("request-promise").defaults({
simple: false,
resolveWithFullResponse: true
})
const getBannerLinks = async () => {
return request("https://www.youtube.com/user/pewdiepie").then(res => {
if (res.statusCode === 200) {
const parsed = res.body.split("var ytInitialData = ")[1].split(";</script>")[0]
const data = JSON.parse(parsed)
const links = data.header.c4TabbedHeaderRenderer.headerLinks.channelHeaderLinksRenderer
const allLinks = links.primaryLinks.concat(links.secondaryLinks || [])
const parsedLinks = allLinks.map(l => {
const url = new URLSearchParams(l.navigationEndpoint.commandMetadata.webCommandMetadata.url)
return {
link: url.get("q"),
name: l.title.simpleText,
icon: l.icon.thumbnails[0].url
}
})
return parsedLinks
} else {
// Error/ratelimit - Handle here
}
})
}
链接的抓取方式如下:
split解析正文以提取横幅链接所在的JSON字符串
data.header.c4TabbedHeaderRenderer.headerLinks.channelHeaderLinksRenderer
q 查询参数,因为 YouTube 会加密它们的传出链接(很可能是出于安全原因),然后也使用相应的对象提取名称和图标。这不是一个完美的解决方案,如果 YouTube 更新/更改其前端的任何内容,这可能很容易破坏您的程序。 YouTube 对他们的软件也有速率限制,如果您尝试批量抓取,则会遇到 429/403 错误。
【讨论】: