上的另一个问题显示,只要页码和maxResults设置相同,页面令牌对于不同的搜索是相同的。
API 版本 2 允许通过设置起始位置转到任意页面,但 v3 仅提供下一个和上一个令牌。即使您知道有 5 页的结果,也不会从第 1 页跳到第 5 页。
那么我们如何解决这个问题呢?
YouTube pageToken 的长度为六个字符。以下是我能够确定的格式:
字符 1:我见过的总是"C"。字符 2-3:编码的起始位置char 4-5:我见过的总是"QA"。字符 6:"A"表示列表项的位置大于或等于起始位置。"Q"表示开始位置之前的列表项。
由于字符 6 的性质,有两种不同的方法来表示同一页面。给定 maxResults=1,可以通过将页面标记设置为"CAEQAA"或"CAIQAQ"来访问页面 2。第一个意味着从结果编号 2(由字符 2-3"AE"表示)开始并列出 1 项。第二种表示返回结果编号 3 之前的一项(由字符 2-3 "AI"表示。
字符 2-3 是一种奇怪的基数 16 编码。
字符 3 使用从 A-Z 开始的列表,然后是 a-z,然后是 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 之后行为的更新。
由于字符串仅包含起始位置和">="或"<"选项,因此在多种情况下使用相同的字符串。例如,每页有 2 个结果,第二页的起始位置是结果 3。这个页面令牌是"CAIQAA"。这与第三页的令牌相同,每页一个结果。
由于我主要是一个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 的页面令牌序列已更改,此系统将不再工作。有关最新和工作页面令牌的示例,请参阅此页面。
YouTube的pagetokens可以被视为索引。
- 可以在此处找到前 1000 个项目的页面令牌。
- 可以在此处找到范围(1, 100000)中每10项的页面令牌。
- 可用的最高页面令牌是"CJ-NBhAA",它指向位置为 99.999 的第 100.000 个项目。
- maxresults 的最高可能值为 50。
pagetoken 指定起点,使用 maxresults 指定项目数。
例子:
- 第1项
https://www.googleapis.com/youtube/v3/playlistItems?part=id%2Csnippet&playlistId=<PLAYLISTID>&key=<APIKEY>&maxResults=1&pageToken=CAAQAA
- 第555项
https://www.googleapis.com/youtube/v3/playlistItems?part=id%2Csnippet&playlistId=<PLAYLISTID>&key=<APIKEY>&maxResults=1&pageToken=CKoEEAA
- 第 99999 项
https://www.googleapis.com/youtube/v3/playlistItems?part=id%2Csnippet&playlistId=<PLAYLISTID>&key=<APIKEY>&maxResults=1&pageToken=CJ6NBhAA
- 从第 10 项
- 开始的 10 项
https://www.googleapis.com/youtube/v3/playlistItems?part=id%2Csnippet&playlistId=<PLAYLISTID>&key=<APIKEY>&maxResults=10&pageToken=CAkQAA
- 从第 555 项开始的 30 项
https://www.googleapis.com/youtube/v3/playlistItems?part=id%2Csnippet&playlistId=<PLAYLISTID>&key=<APIKEY>&maxResults=30&pageToken=CKoEEAA
- 50 个项目,从第 9999 个项目开始
https://www.googleapis.com/youtube/v3/playlistItems?part=id%2Csnippet&playlistId=<PLAYLISTID>&key=<APIKEY>&maxResults=50&pageToken=CI9OEAA
使用 ^ 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
作为 thatthatisis 答案的附录,链接令牌列表专门用于 maxResults=10。我导出了 maxResults 当前允许的最大值 50 的完整列表:https://github.com/Koushakur/randomStuff/blob/main/YouTube%20API%20pageTokens%20for%20maxResults%3D50.txt
我称之为"完整",因为即使我使用了一个频道的上传播放列表,上面有一百万个视频来获取令牌,API 也会在列表中最后一个令牌到第一页循环,所以似乎播放列表的最大大小约为 20700 个视频。