Youtube Data API v3 pageToken for arbitrary page


SO

上的另一个问题显示,只要页码和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 个视频。

相关内容

  • 没有找到相关文章

最新更新