获取缩略图上的视频预览链接[Youtube]

时间:2017-12-25 15:52:15

标签: video youtube

在Youtube中,当一个人将光标悬停在视频缩略图上时,视频缩略图开始播放。仅适用于桌面。

我试图获取一个

的链接
 https://i.ytimg.com/an_webp/d1w3CWfhzNQ/mqdefault_6s.webp?du=3000&sqp=CPyAhNIF&rs=AOn4CLBqWnVyWD9F_P4j_WFk7LAGs4pNUA

仅适用于上述视频, 当我尝试更改链接中的ID以查看另一个视频是否有效时,如何才能获得视频预览的 id 相关链接?

2 个答案:

答案 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. 以视频ID作为搜索查询来获取实际的YouTube搜索结果页面。 URL参数&sp = QgIIAQ%253D%253D用于强制查询的完全匹配。
  2. 我在Heroku上使用通用代理来绕开CORS封锁。为了能够在浏览器中运行该功能,这是必需的。
  3. 在整个html中搜索所需的webp文件格式(包括我们的视频ID)
  4. 如果找到,则将其解析为JSON(图像位于html中JSON内)。否则返回false。

答案 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参数来获得所需的链接,因为在视频预览中,您不能像缩略图一样简单地省略参数。