v7.0.0-beta.10
2026-10-24 发布的 v7 第十个 beta —— 抖音风控挑战自动处理与验证页、扫码登录补齐四个平台、B站 Cookie 续期、15 个新端点
这一版把三件此前只能自己做或干脆没有的能力补上了:抖音的纯工作量证明挑战在管线内自动解并立即重放,滑块则连同验证页地址一起交给人;扫码登录从抖音 / B站扩到四个平台;B站有了官方协议的 Cookie 续期。另新增 15 个端点(抖音 3、快手 6、小红书 6),端点总数到 80。
主要工作来自 @OduckO(yaya)的 PR #203(squash 合并为 37fe6582):风控挑战自动处理、快手 / 小红书扫码登录、B站 Cookie 续期与 14 个新端点都在其中;抖音分享短链端点来自 094238d5。
安装
升级到最新的测试版本:
这一版仍发到 npm 的 beta 标签:pnpm add @ikenxuan/amagi@beta。
latest 依旧是 6.x 稳定线。beta 期间 API 仍可能调整。
npm install @ikenxuan/amagi@beta正在使用 AI 进行开发?
对 Cursor、Claude Code 这类 AI 编程助手说一句「帮我把 @ikenxuan/amagi 升级到最新版」,
它会自动比对你当前的版本与这一版的差异,并把必要的改动应用到代码里。
了解更多请参阅Agent Skills。
新增:抖音风控挑战自动处理
管线现在区分两类挑战,分界线是有没有人机判定:
- 纯工作量证明在管线内解掉并立即重放。 抖音的 WAF(
_wafchallengeid的 sha256 碰撞)与 VMP 挑战由管线内的解算钩子解出 cookie,runtime 立刻用新 cookie 重放本次请求,不发退避等待。trace 里这类重放的reason是challenge,与业务重试的retry分开,所以「解了几次挑战」和「退避重试了几次」不再混在同一个数字里。 - 滑块永远交给真人。 判
CAPTCHA_REQUIRED、不进重试名单(此前会被退避重发 3 次,每次重新签名,白发且放大风控)。失败信封的error.challenge带人能直接打开的验证页地址;抖音还带jsSdkUrl/verifyData,可以自建验证页。
error.challenge 现在不受 debug 管:client、HTTP 路由、静态 fetcher 三个入口都拿得到。自建验证页有现成的 renderVerifyPage(challenge, { platform }),返回一张自包含 HTML。处理流程仍是三步:把地址交给真人 → 等过完 → 用同一份 cookie 重发原请求。amagi 不识别、不模拟轨迹、不自动过滑块。
配套的两处实现变化:
__ac_signature改成纯算(从 JSVMP 字节码 lift 出来),游客凭据链不再在node:vm里执行挑战页脚本;mint的第一发只读Set-Cookie的__ac_nonce,不解析页面。__ac_nonce按 cookie 身份缓存 45 秒:解出的 nonce 跨调用复用、签名按当刻时钟重算,裸打抖音页面从每次 2 发降到 1 发。缓存只存 nonce,不存合并后的 cookie。
细节与实测记录见传输与反爬与响应类型的「失败分支里的 error.challenge」。
新增:扫码登录补齐四个平台
client.<平台>.login 此前只有抖音与 B站,这一版补上快手与小红书。四个平台统一提供 qrcode()(新建)与 resume(blob)(从 serialize() 的产物恢复),消费方式仍是三种:watch() 回调、for await、start() + next() 手动单步。
- 快手:
start()本地生成did,不依赖传入 cookie;确认后校验passToken/serviceToken。 - 小红书:
start()自带游客冷启动,同样不依赖传入 cookie。 - 状态机与各平台协议差异见翻页与会话,用法见 SDK 参考的「扫码登录」。
抖音侧另补了 credentials 工具命名空间(Cookie 规范化、登录态探测、游客凭据申请),见工具集。
新增:B站 Cookie 续期
client.bilibili.refreshCredential({ cookie, refreshToken }) 走 B站官方的四步续期协议:校验登录态 → 取 refresh_csrf → 换新 cookie 与新 token → 确认并作废旧 token。四平台里只有 B站有这条正规续期通道,不涉及风控对抗。
拿到的 { cookie, refreshToken } 必须整组持久化替换旧值:旧 token 在第 4 步已作废,再用会报 86095。cookie 至少要含 SESSDATA 与 bili_jct。顶层也导出了 refreshBilibiliCredential 与 getBilibiliCorrespondPath,自组装 transport 时可用。
新增:15 个端点
| 平台 | 端点 | 说明 |
|---|---|---|
| 抖音 | fetchShortUrl | 分享链接转 v.douyin.com 短链;不需要 cookie,但必须签名,belong=aweme 是前提 |
| 抖音 | fetchMusicAwemeList | 某条原声下的作品列表;原声缺 play_url 时从这里取 mp3 |
| 抖音 | fetchMixAweme | 合集作品列表,按 mix_id 取作品 |
| 快手 | fetchCommentReplies | 评论回复,声明式翻页 |
| 快手 | fetchEmotionPackageList | 表情包列表 |
| 快手 | fetchSlideFeed | 作品相关推荐 |
| 快手 | fetchSearchUser | PC 用户搜索,游客会话可用;翻页间隔 10 秒 |
| 快手 | fetchSearchWorkList | PC 作品搜索,游客会话可用;翻页间隔 10 秒 |
| 快手 | fetchLoginUserProfile | 当前登录账号资料,仍需登录身份 |
| 小红书 | fetchSearchUser | 用户搜索 |
| 小红书 | fetchSearchHotList | 搜索热榜 |
| 小红书 | fetchSubComments | 子评论,number 自动翻页 |
| 小红书 | fetchLiveRoom | 直播间信息 |
| 小红书 | fetchLiveStatus | 直播状态 |
| 小红书 | fetchLiveSquare | 直播广场 |
抖音 fetchShortUrl 的成功与失败都是 HTTP 200 + code: 0,端点自带 judge 按 reason 区分:check failed 是签名被拒(SIGNATURE_REFUSED,换 cookie 无用),not allowed to shorten 是 belong 不对。同一个 target 返回稳定短码,不是一次性令牌。
行为变更
- 滑块从
ANTIBOT_PAGE改判CAPTCHA_REQUIRED:ANTIBOT_PAGE在抖音是可重试码,滑块中间页此前会被退避重发;现在两条识别通道(验证头与 HTML 中间页)给同一个码,且retryable: false。 - 解完挑战就收口:一次调用里解算成功后,不再因为重放结果仍被判
ANTIBOT_PAGE而继续退避重试。实测零 cookie 裸打抖音首页从 5 发降到 2 发;信封仍带retryable: true,调用方自己重试照旧有效。 - 声明
responseType: 'text'时能拿回 HTML:此前文本响应被当成非 JSON 判失败;现在text模式下对字符串不发表意见,只有平台自己的挑战判据仍然生效。小红书 / 快手 / B站没有 HTML 挑战页锚点,它们的 WAF 页在text模式下会被当成成功——这是显式声明text的取舍,见自定义请求。 - UA 原样发出:不再剥掉
Edg/x,签名用的 UA 与实际发出的 UA 一致。 - 大整数安全解析:超出安全整数范围的裸整数转为字符串,不再丢精度。
致谢
感谢 @OduckO(yaya)贡献 PR #203(37fe6582):这一版的风控挑战自动处理、快手 / 小红书扫码登录、B站 Cookie 续期与 14 个新端点都出自这份 PR。
升级
安装命令见页首。
- 库使用者:新增能力都是可选的,已有调用点不需要改。需要留意三处行为变化:
- 抖音滑块现在报
CAPTCHA_REQUIRED(原ANTIBOT_PAGE)且不可重试——按错误码分流的代码需要检查; - 声明
responseType: 'text'的调用现在会成功拿回 HTML; - 抖音
mintDouyinGuestCookie返回null的条件收窄为「什么都没拿到」——只拿到ttwid时不再整次算失败,返回值里会带上设备标识 cookie。
- 抖音滑块现在报
- 登录调用方:
client.kuaishou.login与client.xiaohongshu.login现在可用,不再是编译错误。 - 从 v6 升上来的必读迁移指南。
遇到问题请提 Issue。
最后更新于 2026-10-23