@ikenxuan/amagi 7.0.0-beta.4 → 7.0.0-beta.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,4 +1,4 @@
1
- import { $ as unwrap, A as douyinFetcher, B as xiaohongshuSign, C as ValidationError, Ct as parseDmSegMobileReply, D as createBoundKuaishouFetcher, E as xiaohongshuFetcher, F as bilibiliFetcher, G as createDouyinRoutes, H as createKuaishouRoutes, I as createBoundBilibiliFetcher, J as bilibiliUtils, K as passport_exports, L as createClient, M as requestPassportQrcode, N as sendPassportVerifyCode, O as kuaishouFetcher, P as validatePassportVerifyCode, Q as isSuccess, R as xiaohongshuUtils, S as ApiError, St as emitNetworkRetry, T as createBoundXiaohongshuFetcher, Tt as bv2av, U as kuaishouSign, V as kuaishouUtils, W as douyinUtils, X as AmagiThrownError, Y as createBilibiliRoutes, Z as isFailure, _ as validateBilibiliParams, _t as emitLogError, a as AdditionalType, at as wbi_sign, b as validateXiaohongshuParams, bt as emitLogWarn, c as createAmagiClient, ct as fetchResponse, d as assertValidBilibiliParams, dt as emitApiError, et as AMAGI_BUS_EVENT_NAMES, f as assertValidDouyinParams, ft as emitApiSuccess, g as createSuccessResponse, gt as emitLogDebug, h as createErrorResponse, ht as emitLog, i as DynamicType, it as qtparam, j as checkPassportQrcode, k as createBoundDouyinFetcher, l as kuaishouApiUrls, lt as isNetworkErrorResult, m as assertValidXiaohongshuParams, mt as emitHttpResponse, n as CreateApp, nt as KUAISHOU_PC_CAPTCHA_RESULT, o as MajorType, ot as bilibiliApiUrls, p as assertValidKuaishouParams, pt as emitHttpRequest, q as douyinSign, r as amagi, rt as parseKuaishouCaptcha, s as CommentType, st as fetchData, tt as KUAISHOU_H5_CAPTCHA_RESULT, u as douyinApiUrls, ut as amagiEvents, v as validateDouyinParams, vt as emitLogInfo, w as handleError, wt as av2bv, x as xiaohongshuApiUrls, xt as emitNetworkError, y as validateKuaishouParams, yt as emitLogMark, z as createXiaohongshuRoutes } from "../src-ocSC1FCs.mjs";
1
+ import { $ as unwrap, A as douyinFetcher, B as xiaohongshuSign, C as ValidationError, Ct as parseDmSegMobileReply, D as createBoundKuaishouFetcher, E as xiaohongshuFetcher, F as bilibiliFetcher, G as createDouyinRoutes, H as createKuaishouRoutes, I as createBoundBilibiliFetcher, J as bilibiliUtils, K as passport_exports, L as createClient, M as requestPassportQrcode, N as sendPassportVerifyCode, O as kuaishouFetcher, P as validatePassportVerifyCode, Q as isSuccess, R as xiaohongshuUtils, S as ApiError, St as emitNetworkRetry, T as createBoundXiaohongshuFetcher, Tt as bv2av, U as kuaishouSign, V as kuaishouUtils, W as douyinUtils, X as AmagiThrownError, Y as createBilibiliRoutes, Z as isFailure, _ as validateBilibiliParams, _t as emitLogError, a as AdditionalType, at as wbi_sign, b as validateXiaohongshuParams, bt as emitLogWarn, c as createAmagiClient, ct as fetchResponse, d as assertValidBilibiliParams, dt as emitApiError, et as AMAGI_BUS_EVENT_NAMES, f as assertValidDouyinParams, ft as emitApiSuccess, g as createSuccessResponse, gt as emitLogDebug, h as createErrorResponse, ht as emitLog, i as DynamicType, it as qtparam, j as checkPassportQrcode, k as createBoundDouyinFetcher, l as kuaishouApiUrls, lt as isNetworkErrorResult, m as assertValidXiaohongshuParams, mt as emitHttpResponse, n as CreateApp, nt as KUAISHOU_PC_CAPTCHA_RESULT, o as MajorType, ot as bilibiliApiUrls, p as assertValidKuaishouParams, pt as emitHttpRequest, q as douyinSign, r as amagi, rt as parseKuaishouCaptcha, s as CommentType, st as fetchData, tt as KUAISHOU_H5_CAPTCHA_RESULT, u as douyinApiUrls, ut as amagiEvents, v as validateDouyinParams, vt as emitLogInfo, w as handleError, wt as av2bv, x as xiaohongshuApiUrls, xt as emitNetworkError, y as validateKuaishouParams, yt as emitLogMark, z as createXiaohongshuRoutes } from "../src-BHqC-g47.mjs";
2
2
  //#region src/exports/compat.ts
3
3
  /** 模块级只执行一次的迁移提示(不刷屏) */
4
4
  emitLogWarn("[@ikenxuan/amagi/compat] 你正在使用 v6 兼容入口;v7 迁移说明见 https://github.com/ikenxuan/amagi (v8 将移除 compat)");
@@ -0,0 +1,69 @@
1
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
+ const require_steps = require("../steps-BO8NYQHx.cjs");
3
+ //#region src/exports/sign-steps.ts
4
+ /**
5
+ * 反爬参数的**原子 step 工厂**:给 `client.<平台>.request` 做精细签名控制用。
6
+ *
7
+ * ## 它解决什么
8
+ *
9
+ * 端点声明里的 `sign` 早就能写成 `SignStep[]`,但 `client.<平台>.request` 这条裸请求路
10
+ * 过去只能选一个注册名(`sign: 'a-bogus'`)或干脆不签(`sign: false`)——想「要 a_bogus
11
+ * 但换个 msToken 长度」「只签 x_bogus 不要 secsdk」都没有出口。本入口把四平台的 step 工厂
12
+ * 放出来,配合 `amagi.sign` 收 `SignDecl`,调用方可以自己列:
13
+ *
14
+ * ```ts
15
+ * import { douyin } from '@ikenxuan/amagi/sign-steps'
16
+ *
17
+ * // 自己挑要哪些、调参数(这里用 200 长度的 msToken,且不加 secsdk 收尾)
18
+ * await client.douyin.request.get(url, { amagi: { sign: [douyin.msToken(200), douyin.aBogus()] } })
19
+ * ```
20
+ *
21
+ * runtime 按 `phase`(`prepare` → `token` → `sign` → `finalize`)稳定排序后依次执行,
22
+ * 所以数组顺序写反也不翻车(`[douyin.aBogus(), douyin.msToken()]` 与
23
+ * `[douyin.msToken(), douyin.aBogus()]` 等价)。
24
+ *
25
+ * ## 与默认签名同源
26
+ *
27
+ * 这些工厂就是端点声明和平台签名器表内部用的同一批(阶段 2 已把两条路统一到一份实现)。
28
+ * 所以你手挑的 `[bilibili.wbi()]` 与不挑时的默认 `'wbi'` 压的是同一个签名器实例、同一份
29
+ * `/nav` 缓存,签出来必然一致。带状态的签名器(B站 wbi keys、快手 hxfalcon count)是进程级共享的。
30
+ *
31
+ * ## 命名:按平台分命名空间
32
+ *
33
+ * step 工厂按平台归入四个命名空间对象(`douyin` / `bilibili` / `kuaishou` / `xiaohongshu`),
34
+ * 而不是平铺到一个入口 —— `douyin.msToken()` 一眼看出归属,也不会随平台增多而重名。
35
+ * `douyin.douyinBogus` / `douyin.douyinXBogus` 是抖音的常用组合预设
36
+ * (`[msToken, aBogus, secsdk]` / `[…, xBogus, …]`)。
37
+ *
38
+ * 类型(`SignStep` / `SignPhase` / `SignFn` / `SignDecl`)不属于任何单一平台,平铺导出,
39
+ * 方便写辅助函数的入参 / 返回值。
40
+ *
41
+ * @module @ikenxuan/amagi/sign-steps
42
+ */
43
+ /** 抖音的反爬参数 step 工厂与组合预设 */
44
+ const douyin = {
45
+ msToken: require_steps.msToken,
46
+ aBogus: require_steps.aBogus,
47
+ xBogus: require_steps.xBogus,
48
+ secsdk: require_steps.secsdk,
49
+ douyinBogus: require_steps.douyinBogus,
50
+ douyinXBogus: require_steps.douyinXBogus
51
+ };
52
+ /** B站的反爬参数 step 工厂 */
53
+ const bilibili = {
54
+ wbi: require_steps.wbi,
55
+ qtparam: require_steps.qtparam
56
+ };
57
+ /** 快手的反爬参数 step 工厂 */
58
+ const kuaishou = { hxfalcon: require_steps.hxfalcon };
59
+ /** 小红书的反爬参数 step 工厂 */
60
+ const xiaohongshu = {
61
+ xs: require_steps.xs,
62
+ traceId: require_steps.traceId,
63
+ rap: require_steps.rap
64
+ };
65
+ //#endregion
66
+ exports.bilibili = bilibili;
67
+ exports.douyin = douyin;
68
+ exports.kuaishou = kuaishou;
69
+ exports.xiaohongshu = xiaohongshu;
@@ -0,0 +1,202 @@
1
+ import { C as KuaishouLiveApiRequest, c as SignPhase, l as SignStep, o as SignDecl, s as SignFn } from "../endpoint-CxOrmO8L.js";
2
+ //#region src/platforms/bilibili/sign/steps.d.ts
3
+ /** `wbi`:URL 追加 `&wts=&w_rid=`(comments / userDynamicList / userSpaceInfo) */
4
+ declare const wbi: () => SignStep;
5
+ /**
6
+ * `qtparam`:视频流专属。登录判断 + fnval 档位 + wbi 签名强耦合,整体封成一个单元
7
+ * (fnval 依赖 vipStatus、且必须加在「基于原始 URL 的 wbi 签名」之后,拆开必错)。
8
+ */
9
+ declare const qtparam: () => SignStep;
10
+ //#endregion
11
+ //#region src/platforms/douyin/sign/steps.d.ts
12
+ /**
13
+ * `msToken`:本地随机令牌,长度按端点定(作品详情类 184、评论/音乐等 116)。
14
+ *
15
+ * phase = `'token'`:必须先于 a_bogus / x_bogus 进 URL —— 主签名算的是含 msToken 的整条 URL。
16
+ *
17
+ * 前置:URL 必须是绝对地址。**这道校验不能省** —— 本单元在 phase 序里先于 {@link aBogus} /
18
+ * {@link xBogus},相对 URL 会在这里就撞上 `new URL()`,抛裸 `TypeError: Invalid URL`,把
19
+ * 后面那两句「前置条件不满足」的明确报错整个盖掉(信封 kind 仍是 internal,但 message
20
+ * 没法告诉调用方到底哪里不对)。
21
+ *
22
+ * **会覆盖 URL 里已有的 `msToken`**。对端点无影响(`build` 不再写这个参数);对
23
+ * `client.<平台>.request` 那条路,调用方自己拼的值会被换掉。选「覆盖」而非「有则不动」,
24
+ * 是因为后者会让 `retryFresh` 的重试一直复用调用方那个过期 token —— Argus 按**单次请求的
25
+ * token 组**判定,重放必然同样被拦,重试就白跑了。真要自己掌控的调用方,不放本单元即可
26
+ * (`sign: [aBogus(), secsdk()]`),URL 里原有的 msToken 就会留着。
27
+ * @param length - `==` 之前的随机段长度
28
+ */
29
+ declare const msToken: (length: number) => SignStep;
30
+ /**
31
+ * `a_bogus` 签名(内部先补 webid,命中 ttwid 缓存才补)。
32
+ *
33
+ * 前置:URL 必须是绝对地址,不满足抛错(execute 归因 `kind: 'internal'`)。不含 secsdk ——
34
+ * 需要收尾签名的端点再 append 一个 {@link secsdk}。
35
+ */
36
+ declare const aBogus: () => SignStep;
37
+ /**
38
+ * `X-Bogus` 签名(内部先补 webid)。
39
+ *
40
+ * 前置:真实接口形态的长路径(≥3 段且带查询串),不满足抛错。不含 secsdk。
41
+ */
42
+ declare const xBogus: () => SignStep;
43
+ /**
44
+ * `x-secsdk-web-signature` 收尾:策略表内的 path 才改写整条 URL,表外原样返回(append 恒安全)。
45
+ *
46
+ * phase = `'finalize'`:必须是最后一步。
47
+ */
48
+ declare const secsdk: () => SignStep;
49
+ /**
50
+ * 抖音作品 / 接口类的常用组合:msToken + a_bogus + secsdk。
51
+ * @param msLen - msToken 随机段长度
52
+ */
53
+ declare const douyinBogus: (msLen: number) => SignStep[];
54
+ /**
55
+ * x_bogus 版组合:msToken + X-Bogus + secsdk(如 commentReplies)。
56
+ * @param msLen - msToken 随机段长度
57
+ */
58
+ declare const douyinXBogus: (msLen: number) => SignStep[];
59
+ //#endregion
60
+ //#region src/platforms/kuaishou/sign/helpers.d.ts
61
+ /**
62
+ * 快手 `__NS_hxfalcon` 组包所需的标准化载荷。
63
+ *
64
+ * 这里的 `url` 已经是参与签名的规范路径,而不是最终请求 URL。
65
+ */
66
+ type KuaishouHxfalconPayload = {
67
+ url: string;
68
+ query: Record<string, string>;
69
+ form: Record<string, string>;
70
+ requestBody: Record<string, unknown>;
71
+ };
72
+ //#endregion
73
+ //#region src/platforms/kuaishou/sign/index.d.ts
74
+ /**
75
+ * 快手 `live_api` 请求签名结果。
76
+ */
77
+ type KuaishouLiveApiSignature = {
78
+ url: string;
79
+ headers: Record<string, string>;
80
+ signResult: string;
81
+ signInput: string;
82
+ catVersion: string;
83
+ };
84
+ /**
85
+ * 快手签名器(**实例级**)。
86
+ *
87
+ * 签名状态(`count` / `startupRandom` / 匿名 `kww` 缓存)随实例走,不挂在模块级
88
+ * 单例上 —— 同进程内两个 client 的签名互不干扰:
89
+ * - `count` 每次签名递增,但只影响当前实例。
90
+ * - 匿名 `kww` 按实例缓存(同一实例内复用,不同实例各自生成)。
91
+ * - `startupRandom` 按实例生成。
92
+ */
93
+ declare class KuaishouSigner {
94
+ private readonly runtimeState;
95
+ private readonly anonymousKwwCache;
96
+ constructor();
97
+ /**
98
+ * 获取当前纯算法运行时使用的 `caver`。
99
+ * @returns 快手 `caver` 值
100
+ */
101
+ getCatVersion(): string;
102
+ /**
103
+ * 生成快手请求头中的 `kww` 值(匿名分支按实例缓存)。
104
+ * @param cookie - 原始 Cookie 字符串
105
+ * @returns `kww` 请求头值
106
+ */
107
+ generateKww(cookie?: string): string;
108
+ /**
109
+ * 根据结构化签名载荷生成 `__NS_hxfalcon`。
110
+ *
111
+ * `count` 随实例递增:同一实例内连续签名结果不同(防重放),
112
+ * 但两个实例的 `count` 互不干扰。
113
+ *
114
+ * @param payload - 已标准化的快手签名载荷
115
+ * @returns 包含最终签名串、sign input 与 `caver` 的结果
116
+ */
117
+ generateHxfalconFromPayload(payload: KuaishouHxfalconPayload): Pick<KuaishouLiveApiSignature, 'signResult' | 'signInput' | 'catVersion'>;
118
+ /**
119
+ * 为快手 `live_api` / H5 URL 签名。
120
+ * @param url - 实际请求 URL
121
+ * @param cookie - 原始 Cookie 字符串
122
+ * @param signPath - 可选的规范签名路径
123
+ * @param requestBody - 参与签名的请求体(POST 端点必传,见 helpers 的说明)
124
+ * @returns 带签名 URL、附加请求头和调试信息
125
+ */
126
+ signLiveApiUrl(url: string, cookie?: string, signPath?: string, requestBody?: Record<string, unknown>): KuaishouLiveApiSignature;
127
+ /**
128
+ * 为结构化的快手 `live_api` 请求描述对象签名。
129
+ *
130
+ * 入参与静态类 {@link kuaishouSign} 相同,但状态随实例。
131
+ *
132
+ * @param request - 快手 `live_api` 请求描述对象
133
+ * @param cookie - 原始 Cookie 字符串
134
+ * @param requestBody - 参与签名的请求体
135
+ * @returns 带签名 URL、附加请求头和调试信息
136
+ */
137
+ signLiveApiRequest(request: KuaishouLiveApiRequest, cookie?: string, requestBody?: Record<string, unknown>): KuaishouLiveApiSignature;
138
+ /**
139
+ * 清空实例的签名状态(测试隔离用)。对称于 B站的 `WbiSigner.reset()`。
140
+ *
141
+ * 两份状态都清:
142
+ * - `runtimeState`:`count` 回到默认、`startupRandom` 重取(`catVersion` 一并归位)。
143
+ * - `anonymousKwwCache`:清空缓存值,下次 `generateKww` 重新生成匿名 `kww`。
144
+ *
145
+ * 这两个字段是 `private readonly` —— readonly 只禁止给字段重新赋值,改对象内部属性
146
+ * 仍然允许。这里复用 `createKuaishouPureRuntimeState()` 取初值,不必把 `state.ts` 的
147
+ * 默认常量对外暴露。不改签名算法本身的任何行为,只把状态清零。
148
+ */
149
+ reset(): void;
150
+ }
151
+ //#endregion
152
+ //#region src/platforms/kuaishou/sign/steps.d.ts
153
+ /**
154
+ * `__NS_hxfalcon` 签名(live_api 与 H5 共用一套算法,区别只在喂什么料)。
155
+ *
156
+ * `signer` 缺省用模块级 {@link sharedKuaishouSigner}(端点声明走这条);`signers.ts`
157
+ * 需要注入独立实例时传入,这样注入的 `count` 状态才生效。
158
+ * @param signer - 签名器实例,缺省用共享实例
159
+ * @returns `sign` 阶段的签名步骤
160
+ */
161
+ declare const hxfalcon: (signer?: KuaishouSigner) => SignStep;
162
+ //#endregion
163
+ //#region src/platforms/xiaohongshu/sign/steps.d.ts
164
+ /**
165
+ * `x-s` + `x-s-common` + `x-t` + `x-xray-traceid` 四个签名头。
166
+ *
167
+ * @param method - GET 签 query、POST 签 body
168
+ * @param protocol - `'xys'` 传统 / `'xyw'` 绕 406(2026-03 后数据接口必用)
169
+ */
170
+ declare const xs: (method: 'get' | 'post', protocol: 'xys' | 'xyw') => SignStep;
171
+ /** `x-b3-traceid`(userNoteList / noteComments 需要),phase = `'finalize'` */
172
+ declare const traceId: () => SignStep;
173
+ /** `x-rap-param`(feed / 搜索 / 发布类需要),phase = `'finalize'`。api 入参去协议、保留 `//host/path` */
174
+ declare const rap: () => SignStep;
175
+ //#endregion
176
+ //#region src/exports/sign-steps.d.ts
177
+ /** 抖音的反爬参数 step 工厂与组合预设 */
178
+ export declare const douyin: {
179
+ readonly msToken: typeof msToken;
180
+ readonly aBogus: typeof aBogus;
181
+ readonly xBogus: typeof xBogus;
182
+ readonly secsdk: typeof secsdk;
183
+ readonly douyinBogus: typeof douyinBogus;
184
+ readonly douyinXBogus: typeof douyinXBogus;
185
+ };
186
+ /** B站的反爬参数 step 工厂 */
187
+ export declare const bilibili: {
188
+ readonly wbi: typeof wbi;
189
+ readonly qtparam: typeof qtparam;
190
+ };
191
+ /** 快手的反爬参数 step 工厂 */
192
+ export declare const kuaishou: {
193
+ readonly hxfalcon: typeof hxfalcon;
194
+ };
195
+ /** 小红书的反爬参数 step 工厂 */
196
+ export declare const xiaohongshu: {
197
+ readonly xs: typeof xs;
198
+ readonly traceId: typeof traceId;
199
+ readonly rap: typeof rap;
200
+ };
201
+ //#endregion
202
+ export type { SignDecl, SignFn, SignPhase, SignStep };
@@ -0,0 +1,65 @@
1
+ import { C as wbi, S as qtparam, d as douyinBogus, f as douyinXBogus, h as xBogus, m as secsdk, n as traceId, p as msToken, r as xs, s as hxfalcon, t as rap, u as aBogus } from "../steps-DQlwODdh.mjs";
2
+ //#region src/exports/sign-steps.ts
3
+ /**
4
+ * 反爬参数的**原子 step 工厂**:给 `client.<平台>.request` 做精细签名控制用。
5
+ *
6
+ * ## 它解决什么
7
+ *
8
+ * 端点声明里的 `sign` 早就能写成 `SignStep[]`,但 `client.<平台>.request` 这条裸请求路
9
+ * 过去只能选一个注册名(`sign: 'a-bogus'`)或干脆不签(`sign: false`)——想「要 a_bogus
10
+ * 但换个 msToken 长度」「只签 x_bogus 不要 secsdk」都没有出口。本入口把四平台的 step 工厂
11
+ * 放出来,配合 `amagi.sign` 收 `SignDecl`,调用方可以自己列:
12
+ *
13
+ * ```ts
14
+ * import { douyin } from '@ikenxuan/amagi/sign-steps'
15
+ *
16
+ * // 自己挑要哪些、调参数(这里用 200 长度的 msToken,且不加 secsdk 收尾)
17
+ * await client.douyin.request.get(url, { amagi: { sign: [douyin.msToken(200), douyin.aBogus()] } })
18
+ * ```
19
+ *
20
+ * runtime 按 `phase`(`prepare` → `token` → `sign` → `finalize`)稳定排序后依次执行,
21
+ * 所以数组顺序写反也不翻车(`[douyin.aBogus(), douyin.msToken()]` 与
22
+ * `[douyin.msToken(), douyin.aBogus()]` 等价)。
23
+ *
24
+ * ## 与默认签名同源
25
+ *
26
+ * 这些工厂就是端点声明和平台签名器表内部用的同一批(阶段 2 已把两条路统一到一份实现)。
27
+ * 所以你手挑的 `[bilibili.wbi()]` 与不挑时的默认 `'wbi'` 压的是同一个签名器实例、同一份
28
+ * `/nav` 缓存,签出来必然一致。带状态的签名器(B站 wbi keys、快手 hxfalcon count)是进程级共享的。
29
+ *
30
+ * ## 命名:按平台分命名空间
31
+ *
32
+ * step 工厂按平台归入四个命名空间对象(`douyin` / `bilibili` / `kuaishou` / `xiaohongshu`),
33
+ * 而不是平铺到一个入口 —— `douyin.msToken()` 一眼看出归属,也不会随平台增多而重名。
34
+ * `douyin.douyinBogus` / `douyin.douyinXBogus` 是抖音的常用组合预设
35
+ * (`[msToken, aBogus, secsdk]` / `[…, xBogus, …]`)。
36
+ *
37
+ * 类型(`SignStep` / `SignPhase` / `SignFn` / `SignDecl`)不属于任何单一平台,平铺导出,
38
+ * 方便写辅助函数的入参 / 返回值。
39
+ *
40
+ * @module @ikenxuan/amagi/sign-steps
41
+ */
42
+ /** 抖音的反爬参数 step 工厂与组合预设 */
43
+ const douyin = {
44
+ msToken,
45
+ aBogus,
46
+ xBogus,
47
+ secsdk,
48
+ douyinBogus,
49
+ douyinXBogus
50
+ };
51
+ /** B站的反爬参数 step 工厂 */
52
+ const bilibili = {
53
+ wbi,
54
+ qtparam
55
+ };
56
+ /** 快手的反爬参数 step 工厂 */
57
+ const kuaishou = { hxfalcon };
58
+ /** 小红书的反爬参数 step 工厂 */
59
+ const xiaohongshu = {
60
+ xs,
61
+ traceId,
62
+ rap
63
+ };
64
+ //#endregion
65
+ export { bilibili, douyin, kuaishou, xiaohongshu };