在Youtube中,当一个人将光标悬停在视频缩略图上时,视频缩略图开始播放。仅适用于桌面。
我试图获取一个
的链接 https://i.ytimg.com/an_webp/d1w3CWfhzNQ/mqdefault_6s.webp?du=3000&sqp=CPyAhNIF&rs=AOn4CLBqWnVyWD9F_P4j_WFk7LAGs4pNUA
仅适用于上述视频, 当我尝试更改链接中的ID以查看另一个视频是否有效时,如何才能获得视频预览的 id 相关链接?
答案 0 :(得分:3)
我在下面编写了一个示例javascript函数,可抓取视频webp预览。它会返回一个承诺,如果找到则返回url,否则视频将无法预览,或者这意味着在您运行此功能时,Youtube更改了其网站html格式,导致该功能不再起作用(肯定会在将来的某个时候,因此,如果您在网站上的生产环境中使用此功能,请确保还进行一次检查,以定期验证该方法是否仍然有效;如果该方法停止工作,则可能只需要稍作更改即可再次工作。 )
诺言会在大约一秒钟后产生结果;而且在某些方面它可能会出错并且无法返回预览,因此请确保不要让您的网站UX始终依靠它来返回预览。
更好的办法是在后端运行代码,然后将图像保存在后端。 (但是我不确定这是否违反Youtube的版权规则)
const youtubeAnimation = id => {
return fetch(
`https://cors-anywhere.herokuapp.com/https://www.youtube.com/results?search_query=${id}&sp=QgIIAQ%253D%253D`,
{ headers: {} }
)
.then(r => r.text())
.then(html => {
const found = html.match(
new RegExp(`["|']https://i.ytimg.com/an_webp/${id}/(.*?)["|']`)
);
if (found) {
try {
const url = JSON.parse(found[0]);
return url;
} catch (e) {}
}
throw "not found";
})
.catch(e => {
return false;
});
};
示例调用:
youtubeAnimation('s86-Z-CbaHA').then(console.log)
说明:
答案 1 :(得分:1)
spq参数是base64编码的protocol bufffer数据。在这种特殊情况下,它是一个4字节的字段号为1的数字。如果没有规格表或有关文件的更多信息,我无法告诉您它是哪种数字(浮点型,有符号整数,无符号)。返回以便可以猜测或更多样本。
sqp参数还用于自定义尺寸缩略图的url中。例如,https://i.ytimg.com/vi/jNQXAC9IVRw/hqdefault.jpg?sqp=-oaymwEXCPYBEIoBSFryq4qpAwkIARUAAIhCGAE=&rs=AOn4CLAb9wuXOpXrY3TDtPwmmgz4l9PQxg
指示服务器返回缩放和裁剪的缩略图,使其为246x138,这是用于搜索结果中缩略图的分辨率。无法从标准分辨率选择中获得该分辨率,即
https://i.ytimg.com/vi/[video id]/hqdefault.jpg
https://i.ytimg.com/vi/[video id]/mqdefault.jpg
https://i.ytimg.com/vi/[video id]/sddefault.jpg
https://i.ytimg.com/vi/[video id]/default.jpg
在这种情况下,sqp参数对数字138和246进行编码,此外还有一些我不确定其用途的数据。但是,它们始终是相同的数据。
rs参数也是64位编码的数据(但不是protobuf)。该数据的前5个字节始终相同。剩余的20个字节可能是视频ID,sqp参数中的数据以及其他秘密数据的SHA-1哈希。我不知道数据是如何组合的,或者在进行哈希处理时使用了什么其他数据(如果有)。如果更改了视频ID和/或sqp参数,则哈希将无法通过服务器端检查,并且图像将不会调整大小。相反,它为您提供hqdefault.jpg图像,就好像您从未使用过sqp / rs参数一样。
几乎可以肯定的是,数据是有意保密的,因此您不能生成这些网址,以通过大量请求不同大小的图像来饿死服务器以防止拒绝服务攻击。通过所有计算密集型调整大小的资源。
长话短说,您可能无法复制rs参数来获得所需的链接,因为在视频预览中,您不能像缩略图一样简单地省略参数。