关于SO的另一个问题显示,如果页码和maxResults设置相同,则pageTokens对于不同的搜索是相同的。
API的第2版允许您通过设置起始位置转到任意页面,但v3仅提供下一个和上一个令牌。即使你知道有5页的结果,也没有从第1页跳到第5页。
那么我们如何解决这个问题呢?
答案 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可视为索引。
使用pagetoken指定起点,使用maxresults指定项目数。
示例:
https://www.googleapis.com/youtube/v3/playlistItems?part=id%2Csnippet&playlistId=<PLAYLISTID>&key=<APIKEY>&maxResults=1&pageToken=CAAQAA
https://www.googleapis.com/youtube/v3/playlistItems?part=id%2Csnippet&playlistId=<PLAYLISTID>&key=<APIKEY>&maxResults=1&pageToken=CKoEEAA
https://www.googleapis.com/youtube/v3/playlistItems?part=id%2Csnippet&playlistId=<PLAYLISTID>&key=<APIKEY>&maxResults=1&pageToken=CJ6NBhAA
https://www.googleapis.com/youtube/v3/playlistItems?part=id%2Csnippet&playlistId=<PLAYLISTID>&key=<APIKEY>&maxResults=10&pageToken=CAkQAA
https://www.googleapis.com/youtube/v3/playlistItems?part=id%2Csnippet&playlistId=<PLAYLISTID>&key=<APIKEY>&maxResults=30&pageToken=CKoEEAA
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