任意页面的Youtube Data API v3 pageToken

时间:2015-06-20 02:08:52

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

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

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

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

3 个答案:

答案 0 :(得分:8)

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是一种奇怪的基数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在此之后的行为的更新。

由于字符串仅包含起始位置和“> =”或“<”的选项,因此在多种情况下使用相同的字符串。例如,每页有2个结果,第二个页面的起始位置是结果3.对此的pageToken是“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没有为我们提供简单的方法。

答案 1 :(得分:3)

YouTube的pagetokens可视为索引。

  • 可以找到前1000个项目的Pagetokens here
  • 可以找到范围(1,100000)中每10个项目的Pagetokens here
  • 最高可用的pagetoken是“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

  • 99999th item

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

  • 从第9999项开始的50件商品

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

答案 2 :(得分:0)

使用^ 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