用于任意页面的 Youtube Data API v3 pageToken

Posted

技术标签:

【中文标题】用于任意页面的 Youtube Data API v3 pageToken【英文标题】:Youtube Data API v3 pageToken for arbitrary page 【发布时间】:2015-09-06 02:39:03 【问题描述】:

关于 SO 的另一个问题显示,对于不同的搜索,pageTokens 是相同的,前提是页码和 maxResults 设置相同。

API 的第 2 版允许您通过设置起始位置转到任意页面,但第 3 版仅提供下一个和上一个标记。即使您知道有 5 页结果,也不会从第 1 页跳转到第 5 页。

那么我们如何解决这个问题呢?

【问题讨论】:

【参考方案1】:

YouTube pageToken 有六个字符长。以下是我能够确定的格式:

char 1:我见过的总是'C'。 char 2-3:编码的起始位置 char 4-5:我见过的总是'QA'。 char 6:'A' 表示位置大于或等于起始位置的列表项。 'Q' 表示开始位置之前的列表项。

由于字符 6 的性质,有两种不同的方式来表示同一页面。给定 maxResults=1,可以通过将页面令牌设置为“CAEQAA”或“CAIQAQ”来访问第 2 页。第一个表示从结果编号 2(由字符 2-3“AE”表示)开始并列出 1 个项目。第二种表示返回结果号3之前的一项(用字符2-3“AI”表示。

字符 2-3 是一种奇怪的 base 16 编码。

字符 3 使用从 AZ 开始的列表,然后是 az,然后是 0-9,并且列表中每增加 1 就增加 4。系列是 A,E,I,M,Q,U,Y,c, g,k,o,s,w,0,4,8。字符 2 从 A 到 B 到 C 到 D 等等。出于我的目的,我不使用大型结果集,所以我没有费心去看看第二个字符会发生什么超过几百个结果。也许有人在处理更大的集合时会提供关于角色 2 之后的行为方式的更新。

由于字符串仅包含起始位置和“>=”或“

由于我主要是 php 人,因此我使用以下函数来获取给定页面的 pageToken:

function token($limit, $page) 
    $start = 1 + ($page - 1) * $limit;
    $third_chars = array_merge(
            range("A","Z",4),
            range("c","z",4),
            range(0,9,4));
    return 'C'.
           chr(ord('A') + floor($start / 16)).
           $third_chars[($start % 16) - 1].
           'QAA';

$limit = 1;
echo "With $limit result(s) per page...".PHP_EOL;
for ($i = 1; $i < 6; ++$i) 
    echo "The token for page $i is ".token($limit, $i).PHP_EOL;

请在您的项目中测试此功能,如果您发现缺陷或改进,请更新我们其他人,因为 YouTube 没有为我们提供执行此操作的简单方法。

编辑:YouTube API v3 的页面令牌序列已更改,此系统将不再工作。有关最新和工作页面令牌的示例,请参阅 this page。

【讨论】:

这对我来说非常令人印象深刻......一些很好的逆向工程。在 500 个结果之后,API 停止提供 nextPageTokens,因此您需要证明的模式有一个有限的限制。【参考方案2】:

YouTube 的页面令牌可以被视为索引。

前 1000 个项目的页面令牌可以在 here 找到。 范围 (1, 100000) 中每 10 个项目的页面令牌可以在 here 找到。 可用的最高页面令牌是“CJ-NBhAA”,它指向位置为 99.999 的第 100.000 个项目。 maxresults 的最高可能值为 50。

使用 pagetoken 指定起点,使用 maxresults 指定项数。

例子:

第一项

https://www.googleapis.com/youtube/v3/playlistItems?part=id%2Csnippet&amp;playlistId=&lt;PLAYLISTID&gt;&amp;key=&lt;APIKEY&gt;&amp;maxResults=1&amp;pageToken=CAAQAA

第555项

https://www.googleapis.com/youtube/v3/playlistItems?part=id%2Csnippet&amp;playlistId=&lt;PLAYLISTID&gt;&amp;key=&lt;APIKEY&gt;&amp;maxResults=1&amp;pageToken=CKoEEAA

第99999项

https://www.googleapis.com/youtube/v3/playlistItems?part=id%2Csnippet&amp;playlistId=&lt;PLAYLISTID&gt;&amp;key=&lt;APIKEY&gt;&amp;maxResults=1&amp;pageToken=CJ6NBhAA

10 项,从第 10 项开始

https://www.googleapis.com/youtube/v3/playlistItems?part=id%2Csnippet&amp;playlistId=&lt;PLAYLISTID&gt;&amp;key=&lt;APIKEY&gt;&amp;maxResults=10&amp;pageToken=CAkQAA

30 项,从第 555 项开始

https://www.googleapis.com/youtube/v3/playlistItems?part=id%2Csnippet&amp;playlistId=&lt;PLAYLISTID&gt;&amp;key=&lt;APIKEY&gt;&amp;maxResults=30&amp;pageToken=CKoEEAA

50 项,从第 9999 项开始

https://www.googleapis.com/youtube/v3/playlistItems?part=id%2Csnippet&amp;playlistId=&lt;PLAYLISTID&gt;&amp;key=&lt;APIKEY&gt;&amp;maxResults=50&amp;pageToken=CI9OEAA

【讨论】:

每页 50 项的页面令牌列表。 如果您要求每 50 个项目的页面令牌列表,您可以使用包含所有可用页面令牌 (100000) 的列表 here 如何为 youtube api 总结果创建分页链接 @QuihicoSanchezvanOort 你能更新一下这个新的页面令牌格式吗?【参考方案3】:

使用 ^ Quihico 的文件作为参考点,我在 JS 中编写了对上一张海报的 pageToken 生成器的增强,我获得了一些乐趣。如果我对 4000s 位置编码在 N >= 98304 之后如何变化的假设是正确的,它应该能够为从第 N 个项目开始的页面构造一个 pageToken,在 [0, 4194304) 中提供 N。它只测试到 N = 99999,所以 YMMV。

链接:https://github.com/aricearice/youtube-page-token/blob/master/index.js

【讨论】:

以上是关于用于任意页面的 Youtube Data API v3 pageToken的主要内容,如果未能解决你的问题,请参考以下文章

Youtube Data API v3 PlaylistItems 更新不适用于“稍后观看”播放列表

Youtube Data API按渠道ID获取订户列表

Youtube Data API - 如何避免 Google OAuth 重定向 URL 授权

PHP Youtube Data API:未捕获的异常:必须通过composer或下载完整的软件包来安装此库

Youtube API v3 data.search 返回相同的值

使用 YouTube Data API v3 确定 YouTube 频道的上传速率