Pagetoken 原理
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Pagetoken 原理相关的知识,希望对你有一定的参考价值。
参考技术A token是用于验证身份的,在web系统中验证前端是否能够访问后端系统 _ token在服务端产生,如果前端使用用户名/密码向服务端请求认证。用于任意页面的 Youtube Data API v3 pageToken
【中文标题】用于任意页面的 Youtube Data API v3 pageToken【英文标题】:Youtube Data API v3 pageToken for arbitrary page 【发布时间】:2015-09-06 02:39:03 【问题描述】:关于 SO 的另一个问题显示,对于不同的搜索,pageTokens 是相同的,前提是页码和 maxResults 设置相同。
API 的第 2 版允许您通过设置起始位置转到任意页面,但第 3 版仅提供下一个和上一个标记。即使您知道有 5 页结果,也不会从第 1 页跳转到第 5 页。
那么我们如何解决这个问题呢?
【问题讨论】:
【参考方案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&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
【讨论】:
每页 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
【讨论】:
以上是关于Pagetoken 原理的主要内容,如果未能解决你的问题,请参考以下文章
Google URL Shortener API 总是返回与 pagetoken 相同的页面
使用来自 etoken c# 的不可导出私钥签署 xml 请求
Google People API - listDirectoryPeople pageToken 始终无效