获取一个抖音用户发布的视频列表,首先拿到该用户的主页 url,然后拿到这个 url 跳转后的 url(例如)。根据跳转后的 url 获取用户的唯一 id,用这个项目提供的代码生成 signature(如果 sig 失效可以参考这篇文章解决问题),最后拼接成一个 api(如下) 即可拿到用户发表的所有 post,包括视频和图片。
const api = `https://www.iesdouyin.com/web/api/v2/aweme/post/?sec_uid=${sec_uid}&max_cursor=${max_cursor}&aid=1128&_signature=${signature}&dytk=`;
但是 post 信息没有发表时间,为了拿到某个 post 的发布时间,需要拿到某个 post 的 id,接着根据这个项目分享的 api(如下)获取更详细的 post 信息。BTW,除了抖音,这个项目还分享了如何爬取头条视频、西瓜视频、腾讯视频。
const api = `https://www.iesdouyin.com/web/api/v2/aweme/iteminfo/?item_ids=${videoId}`;
这里需要重点说一下 max_cursor 这个参数,先看例子:
async function app() {
const sec_uid = ""; //获取方法参考上文
const signature = ""; //获取方法参考上文
const max_cursor = 1655283600000;
const api = `https://www.iesdouyin.com/web/api/v2/aweme/post/?sec_uid=${sec_uid}&max_cursor=${max_cursor}&aid=1128&_signature=${signature}&dytk=`;
const json = await got(url).json();
json.max = new Date(json.max_cursor);
json.min = new Date(json.min_cursor);
console.log(json);
}
有 2 个参数可以控制返回的用户更新数量,一个是 count,一个是 max_cursor,其中 count 表示本次返回多少个更新,max_cursor 表示获取第几页的更新。max_cursor 不是常规的 page,它的值不是 0 1 2 3 这种值。
max_cursor 的值主要有 2 种:
我们向 API 提供了 max_cursor 参数,API 返回的值中也会包括一个 max_cursor 值,和一个 min_cursor 值,返回的这两个 cursor 表示返回的 aweme_list 中最早发布和最迟发布的时间(时间戳),你可以把它理解为距离此时此刻最 max 的 cursor,和距离此时此刻最 min 的 cursor。
如果不传入 count,并且把 max_cursor 设置为此时此刻的 timestamp,API 会最多返回 3 条信息,并且最多返回过去 2 天的信息。(好像不是哦,好像还是会返回 3 条信息,即使过了两天)
请求 API 拿到的数据包括一个 max_cursor 值,这个值不等于我们传入的 max_cursor 值,它的作用是:调用方你好啊,下次你再发起请求时可以把我传入 API,这样你就能拿到下一页的数据。
返回的 max_cursor 值其实就是返回的 aweme_list 中的最后一个更新的发布时间,比如本次请求 API 获得的 aweme_list 列表中最后一个视频的发布时间是 12345,那本次返回的 max_cursor 也是 12345,下次请求 API,把 12345 作为 max_cursor 值传入,即可获得下一页的数据。