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

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

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

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

【问题讨论】:

    标签: php youtube-api youtube-data-api


    【解决方案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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-07-22
      • 2012-12-19
      • 2018-05-15
      • 2021-05-07
      • 2014-11-13
      • 2013-01-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多