好吧,假设我有一个YouTube播放列表,其中有500个项目。YouTube的PlaylistItems终点一次只能检索50个项目:
https://developers.google.com/youtube/v3/docs/playlistItems/list
在50个项目之后,它会给您一个nextPageToken
,您可以使用它在查询中指定以获取下一页。这样做,您可以遍历整个播放列表,在10个查询中获得所有500个项目。
但是,如果我只想得到最后一页呢?第10页?
在YouTube的V2 API中,你可以告诉它在451位置开始索引,然后它会给你451-500的结果。在他们的V3 API中,这似乎不是一个选项。现在,如果我只想得到第10页,我必须再次迭代整个播放列表,去掉前9页,然后只取第10页。
这似乎是对资源的巨大浪费,仅cURL操作就可能是一个杀手。
那么,是否可以像在V2 API中一样,在V3 API中设置起始索引?
您仍然可以使用开始索引,但您必须自己生成相应的页面标记。
根据观察,页面标记基本上是一个以base64编码的字节序列,第一个字节总是8
,最后两个字节是16, 0
。我们生成的令牌有点像这样(使用python 3):
i = 451
k = i // 128
i -= 128 * (k - 1)
b = [8, index]
if k > 1 or i > 127: b += [k]
b += [16, 0]
t = base64.b64encode(bytes(f)).decode('utf8').strip('=')
最后面的操作删除用于填充base64中不完整块的尾随"=
"字符。结果('CMMDEAA
')是您的页面标记。