specific-ai-cli 0.0.0-stage → 0.1.1

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.
Files changed (277) hide show
  1. package/LICENSE +21 -0
  2. package/README.en.md +177 -0
  3. package/README.ja.md +177 -0
  4. package/README.ko.md +177 -0
  5. package/README.md +174 -2
  6. package/README.zh-TW.md +177 -0
  7. package/assets/banner.txt +3 -0
  8. package/dist/cli/argv.js +98 -0
  9. package/dist/cli/commands/auth.js +11 -0
  10. package/dist/cli/commands/config.js +23 -0
  11. package/dist/cli/commands/doctor.js +134 -0
  12. package/dist/cli/commands/platforms.js +24 -0
  13. package/dist/cli/commands/version.js +4 -0
  14. package/dist/cli/confirm.js +22 -0
  15. package/dist/cli/dispatch.js +440 -0
  16. package/dist/cli/help.js +223 -0
  17. package/dist/cli/hints.js +60 -0
  18. package/dist/cli/main.js +18 -0
  19. package/dist/cli/output.js +66 -0
  20. package/dist/core/auth-handlers.js +41 -0
  21. package/dist/core/auth-store.js +119 -0
  22. package/dist/core/capabilities.js +163 -0
  23. package/dist/core/config.js +121 -0
  24. package/dist/core/cookies.js +164 -0
  25. package/dist/core/errors.js +37 -0
  26. package/dist/core/files.js +89 -0
  27. package/dist/core/fsutil.js +52 -0
  28. package/dist/core/hash.js +4 -0
  29. package/dist/core/http.js +331 -0
  30. package/dist/core/image.js +280 -0
  31. package/dist/core/log.js +40 -0
  32. package/dist/core/login.js +191 -0
  33. package/dist/core/mp4.js +130 -0
  34. package/dist/core/normalize.js +207 -0
  35. package/dist/core/options.js +110 -0
  36. package/dist/core/paths.js +38 -0
  37. package/dist/core/pb.js +59 -0
  38. package/dist/core/py.js +181 -0
  39. package/dist/core/rand.js +131 -0
  40. package/dist/core/registry.js +129 -0
  41. package/dist/core/schemas.js +41 -0
  42. package/dist/core/stream.js +104 -0
  43. package/dist/core/toolkit.js +35 -0
  44. package/dist/core/vm.js +73 -0
  45. package/dist/core/vocab.js +157 -0
  46. package/dist/platforms/_shared/impaas.js +410 -0
  47. package/dist/platforms/bilibili/index.js +216 -0
  48. package/dist/platforms/bilibili/web/api.js +806 -0
  49. package/dist/platforms/bilibili/web/client.js +311 -0
  50. package/dist/platforms/bilibili/web/commands.js +783 -0
  51. package/dist/platforms/bilibili/web/ddddocr.js +342 -0
  52. package/dist/platforms/bilibili/web/gaia.js +130 -0
  53. package/dist/platforms/bilibili/web/geetest-manual.js +154 -0
  54. package/dist/platforms/bilibili/web/geetest-vision.js +232 -0
  55. package/dist/platforms/bilibili/web/geetest.js +450 -0
  56. package/dist/platforms/bilibili/web/normalize.js +234 -0
  57. package/dist/platforms/bilibili/web/profile.js +135 -0
  58. package/dist/platforms/bilibili/web/resolve.js +112 -0
  59. package/dist/platforms/bilibili/web/sign.js +223 -0
  60. package/dist/platforms/bilibili/web/upos.js +102 -0
  61. package/dist/platforms/douyin/index.js +142 -0
  62. package/dist/platforms/douyin/web/api.js +863 -0
  63. package/dist/platforms/douyin/web/client.js +413 -0
  64. package/dist/platforms/douyin/web/commands.js +712 -0
  65. package/dist/platforms/douyin/web/creator.js +601 -0
  66. package/dist/platforms/douyin/web/crypto.js +247 -0
  67. package/dist/platforms/douyin/web/dtrait.js +190 -0
  68. package/dist/platforms/douyin/web/im.js +502 -0
  69. package/dist/platforms/douyin/web/image.js +5 -0
  70. package/dist/platforms/douyin/web/live.js +225 -0
  71. package/dist/platforms/douyin/web/mssdk.js +148 -0
  72. package/dist/platforms/douyin/web/normalize.js +326 -0
  73. package/dist/platforms/douyin/web/passport.js +1247 -0
  74. package/dist/platforms/douyin/web/profile.js +221 -0
  75. package/dist/platforms/douyin/web/proto.js +26 -0
  76. package/dist/platforms/douyin/web/resolve.js +88 -0
  77. package/dist/platforms/douyin/web/sign.js +436 -0
  78. package/dist/platforms/douyin/web/tos.js +78 -0
  79. package/dist/platforms/index.js +17 -0
  80. package/dist/platforms/jd/index.js +67 -0
  81. package/dist/platforms/jd/web/aks.js +115 -0
  82. package/dist/platforms/jd/web/api.js +549 -0
  83. package/dist/platforms/jd/web/chat.js +132 -0
  84. package/dist/platforms/jd/web/client.js +470 -0
  85. package/dist/platforms/jd/web/commands.js +557 -0
  86. package/dist/platforms/jd/web/jcap/helper.js +90 -0
  87. package/dist/platforms/jd/web/jcap/host.js +107 -0
  88. package/dist/platforms/jd/web/jcap/lsd.js +300 -0
  89. package/dist/platforms/jd/web/jcap/solver.js +995 -0
  90. package/dist/platforms/jd/web/jcap.js +150 -0
  91. package/dist/platforms/jd/web/js.js +420 -0
  92. package/dist/platforms/jd/web/login.js +775 -0
  93. package/dist/platforms/jd/web/normalize.js +297 -0
  94. package/dist/platforms/jd/web/profile.js +256 -0
  95. package/dist/platforms/jd/web/util.js +175 -0
  96. package/dist/platforms/jd/web/webm.js +133 -0
  97. package/dist/platforms/kuaishou/index.js +98 -0
  98. package/dist/platforms/kuaishou/web/api.js +694 -0
  99. package/dist/platforms/kuaishou/web/captcha-crypto.js +134 -0
  100. package/dist/platforms/kuaishou/web/captcha-fp.js +180 -0
  101. package/dist/platforms/kuaishou/web/captcha.js +273 -0
  102. package/dist/platforms/kuaishou/web/client.js +487 -0
  103. package/dist/platforms/kuaishou/web/commands.js +863 -0
  104. package/dist/platforms/kuaishou/web/gap.js +144 -0
  105. package/dist/platforms/kuaishou/web/gdfp.js +376 -0
  106. package/dist/platforms/kuaishou/web/gql.js +11 -0
  107. package/dist/platforms/kuaishou/web/live.js +125 -0
  108. package/dist/platforms/kuaishou/web/normalize.js +241 -0
  109. package/dist/platforms/kuaishou/web/oracle.js +329 -0
  110. package/dist/platforms/kuaishou/web/profile.js +259 -0
  111. package/dist/platforms/kuaishou/web/resolve.js +84 -0
  112. package/dist/platforms/kuaishou/web/session.js +592 -0
  113. package/dist/platforms/kuaishou/web/sign.js +568 -0
  114. package/dist/platforms/taobao/index.js +56 -0
  115. package/dist/platforms/taobao/web/api.js +96 -0
  116. package/dist/platforms/taobao/web/client.js +102 -0
  117. package/dist/platforms/taobao/web/commands.js +172 -0
  118. package/dist/platforms/taobao/web/im.js +68 -0
  119. package/dist/platforms/taobao/web/normalize.js +103 -0
  120. package/dist/platforms/taobao/web/profile.js +85 -0
  121. package/dist/platforms/taobao/web/resolve.js +51 -0
  122. package/dist/platforms/taobao/web/sign.js +35 -0
  123. package/dist/platforms/tiktok/index.js +120 -0
  124. package/dist/platforms/tiktok/web/api.js +1234 -0
  125. package/dist/platforms/tiktok/web/client.js +362 -0
  126. package/dist/platforms/tiktok/web/commands.js +821 -0
  127. package/dist/platforms/tiktok/web/im.js +133 -0
  128. package/dist/platforms/tiktok/web/jsrun.js +126 -0
  129. package/dist/platforms/tiktok/web/normalize.js +286 -0
  130. package/dist/platforms/tiktok/web/profile.js +169 -0
  131. package/dist/platforms/tiktok/web/resolve.js +156 -0
  132. package/dist/platforms/tiktok/web/sign.js +585 -0
  133. package/dist/platforms/tiktok/web/upload.js +805 -0
  134. package/dist/platforms/tiktok/web/wire.js +490 -0
  135. package/dist/platforms/weibo/index.js +91 -0
  136. package/dist/platforms/weibo/web/api.js +206 -0
  137. package/dist/platforms/weibo/web/client.js +155 -0
  138. package/dist/platforms/weibo/web/commands.js +202 -0
  139. package/dist/platforms/weibo/web/normalize.js +137 -0
  140. package/dist/platforms/weibo/web/profile.js +246 -0
  141. package/dist/platforms/weibo/web/resolve.js +60 -0
  142. package/dist/platforms/weibo/web/sign.js +85 -0
  143. package/dist/platforms/x/index.js +107 -0
  144. package/dist/platforms/x/web/api.js +443 -0
  145. package/dist/platforms/x/web/article.js +212 -0
  146. package/dist/platforms/x/web/client.js +202 -0
  147. package/dist/platforms/x/web/commands.js +363 -0
  148. package/dist/platforms/x/web/graphql.js +108 -0
  149. package/dist/platforms/x/web/normalize.js +235 -0
  150. package/dist/platforms/x/web/profile.js +99 -0
  151. package/dist/platforms/x/web/resolve.js +44 -0
  152. package/dist/platforms/x/web/transaction.js +171 -0
  153. package/dist/platforms/xhs/index.js +101 -0
  154. package/dist/platforms/xhs/web/api.js +278 -0
  155. package/dist/platforms/xhs/web/client.js +540 -0
  156. package/dist/platforms/xhs/web/commands.js +1046 -0
  157. package/dist/platforms/xhs/web/creator-api.js +609 -0
  158. package/dist/platforms/xhs/web/creator.js +203 -0
  159. package/dist/platforms/xhs/web/js.js +194 -0
  160. package/dist/platforms/xhs/web/login.js +230 -0
  161. package/dist/platforms/xhs/web/normalize.js +166 -0
  162. package/dist/platforms/xhs/web/profile.js +127 -0
  163. package/dist/platforms/xhs/web/push.js +361 -0
  164. package/dist/platforms/xhs/web/resolve.js +69 -0
  165. package/dist/platforms/xhs/web/state.js +368 -0
  166. package/dist/platforms/xianyu/index.js +59 -0
  167. package/dist/platforms/xianyu/web/api.js +312 -0
  168. package/dist/platforms/xianyu/web/client.js +134 -0
  169. package/dist/platforms/xianyu/web/commands.js +305 -0
  170. package/dist/platforms/xianyu/web/im.js +73 -0
  171. package/dist/platforms/xianyu/web/normalize.js +123 -0
  172. package/dist/platforms/xianyu/web/profile.js +146 -0
  173. package/dist/platforms/xianyu/web/resolve.js +48 -0
  174. package/dist/platforms/xianyu/web/sign.js +79 -0
  175. package/package.json +77 -4
  176. package/static/douyin/Live.proto +194 -0
  177. package/static/douyin/Request.proto +89 -0
  178. package/static/douyin/Response.proto +46 -0
  179. package/static/douyin/acrawler_runtime/ac_vm.js +2 -0
  180. package/static/douyin/acrawler_runtime/browser_window_shape.json +1 -0
  181. package/static/douyin/acrawler_runtime/canvas_actual_exact.json +1 -0
  182. package/static/douyin/acrawler_runtime/run_ac_node.js +1005 -0
  183. package/static/douyin/acrawler_runtime/runner_window_keys_baseline.txt +240 -0
  184. package/static/douyin/challenge_profile.json +801 -0
  185. package/static/douyin/challenge_template_runner.js +217 -0
  186. package/static/douyin/dtrait_profile.json +66 -0
  187. package/static/douyin/mstoken_common_profile.json +1 -0
  188. package/static/douyin/mstoken_profile.json +214 -0
  189. package/static/jd/h5st5_env.js +750 -0
  190. package/static/jd/h5st5_lib.js +5 -0
  191. package/static/jd/h5st5_server.js +49 -0
  192. package/static/jd/jcap/env/env_core.js +512 -0
  193. package/static/jd/jcap/env/run.js +1307 -0
  194. package/static/jd/jcap/run/jcap_ujb96b.js +39 -0
  195. package/static/jd/package.json +4 -0
  196. package/static/jd/pc_tk_lib.js +1 -0
  197. package/static/jd/pc_tk_server.js +63 -0
  198. package/static/jd/summer_cryptico_runner.js +50 -0
  199. package/static/jd/webm/env/run.js +453 -0
  200. package/static/jd/webm/run/jdwebm-riskhandle.js +49 -0
  201. package/static/kuaishou/bundles/weapon/kwf-0.0.2.2cee19b4b7dec496.js +1 -0
  202. package/static/kuaishou/bundles/weapon/kws-0-0.0.1-obfuscated.4b7f3de1ab0ddcc2.js +1 -0
  203. package/static/kuaishou/bundles/weapon/kws-1-0.0.1-obfuscated.346ebdb1c78df316.js +1 -0
  204. package/static/kuaishou/bundles/weapon/kws-10-0.0.1-obfuscated.a33db41897b983af.js +1 -0
  205. package/static/kuaishou/bundles/weapon/kws-11-0.0.1-obfuscated.5e0a90af726d8a7e.js +1 -0
  206. package/static/kuaishou/bundles/weapon/kws-12-0.0.1-obfuscated.20ea29345706ec8c.js +1 -0
  207. package/static/kuaishou/bundles/weapon/kws-13-0.0.1-obfuscated.6b74e9640ff18648.js +1 -0
  208. package/static/kuaishou/bundles/weapon/kws-14-0.0.1-obfuscated.551e4429d156bf66.js +1 -0
  209. package/static/kuaishou/bundles/weapon/kws-15-0.0.1-obfuscated.8625b087aaba4a60.js +1 -0
  210. package/static/kuaishou/bundles/weapon/kws-16-0.0.1-obfuscated.d5ffa4020f3be99a.js +1 -0
  211. package/static/kuaishou/bundles/weapon/kws-17-0.0.1-obfuscated.6d13e19b22f50a80.js +1 -0
  212. package/static/kuaishou/bundles/weapon/kws-18-0.0.1-obfuscated.6d31405044166289.js +1 -0
  213. package/static/kuaishou/bundles/weapon/kws-19-0.0.1-obfuscated.a9a8d925942f19e4.js +1 -0
  214. package/static/kuaishou/bundles/weapon/kws-2-0.0.1-obfuscated.b849a136ae4a6b3e.js +1 -0
  215. package/static/kuaishou/bundles/weapon/kws-3-0.0.1-obfuscated.f9e77ebf6186e2ac.js +1 -0
  216. package/static/kuaishou/bundles/weapon/kws-4-0.0.1-obfuscated.2c3c155aa52ceb0e.js +1 -0
  217. package/static/kuaishou/bundles/weapon/kws-5-0.0.1-obfuscated.4e553d17691b3c5a.js +1 -0
  218. package/static/kuaishou/bundles/weapon/kws-6-0.0.1-obfuscated.f73ddd3ff13e1217.js +1 -0
  219. package/static/kuaishou/bundles/weapon/kws-7-0.0.1-obfuscated.1628b8729beaab7e.js +1 -0
  220. package/static/kuaishou/bundles/weapon/kws-8-0.0.1-obfuscated.6da6baef7aa81fff.js +1 -0
  221. package/static/kuaishou/bundles/weapon/kws-9-0.0.1-obfuscated.8645d55e5323b743.js +1 -0
  222. package/static/kuaishou/fixtures/current_follow_script_813.network-response +2 -0
  223. package/static/kuaishou/fixtures/live_ws_maps.json +61 -0
  224. package/static/kuaishou/fixtures/live_ws_proto.json +1342 -0
  225. package/static/kuaishou/js/cp-kwf.js +1 -0
  226. package/static/kuaishou/tools/kwf_oracle.js +799 -0
  227. package/static/kuaishou/tools/kws_oracle.js +885 -0
  228. package/static/kuaishou/tools/like_token_oracle.js +70 -0
  229. package/static/taobao/taobao_js_20260407.js +570 -0
  230. package/static/tiktok/Tiktok_Request.json +597 -0
  231. package/static/tiktok/package.json +3 -0
  232. package/static/tiktok/shop_bsid/core.js +1 -0
  233. package/static/tiktok/shop_bsid/env_core.js +512 -0
  234. package/static/tiktok/shop_bsid/loader.js +1 -0
  235. package/static/tiktok/shop_bsid/run.js +753 -0
  236. package/static/tiktok/shop_bsid/sign.js +100 -0
  237. package/static/tiktok/shop_bsid/webmssdk.js +1 -0
  238. package/static/tiktok/shop_bsid/webmssdk_ex.js +1 -0
  239. package/static/tiktok/signing/env/env_core.js +512 -0
  240. package/static/tiktok/signing/env/sign.js +455 -0
  241. package/static/tiktok/signing/sdk_config.json +230 -0
  242. package/static/tiktok/signing/source/webmssdk.js +1 -0
  243. package/static/tiktok/signing/source/webmssdk_ex.js +1 -0
  244. package/static/tiktok/signing/source/webmssdk_legacy.js +1 -0
  245. package/static/x/graphql.json +7777 -0
  246. package/static/x/transaction_l1.json +12 -0
  247. package/static/xhs/package.json +3 -0
  248. package/static/xhs/xhs_core/js/b1.js +210 -0
  249. package/static/xhs/xhs_core/js/mns.js +340 -0
  250. package/static/xhs/xhs_core/js/mns_0101_keystream.json +5 -0
  251. package/static/xhs/xhs_core/js/mns_keystreams.json +1 -0
  252. package/static/xhs/xhs_core/js/sign.js +225 -0
  253. package/static/xhs/xhs_core/js/websectiga_cli.js +220 -0
  254. package/static/xhs/xhs_core/js/websectiga_env.js +512 -0
  255. package/static/xhs/xhs_core/js/xs_common.js +79 -0
  256. package/static/xhs/xhs_creator/js/profile.js +115 -0
  257. package/static/xhs/xhs_creator/js/rap_fingerprint_creator.json +6 -0
  258. package/static/xhs/xhs_creator/js/reference_profile.json +282 -0
  259. package/static/xhs/xhs_creator/js/xhs_creator_sign.js +29 -0
  260. package/static/xhs/xhs_creator/js/xhs_creator_signature.js +23 -0
  261. package/static/xhs/xhs_pc/js/aes_decrypt.js +22 -0
  262. package/static/xhs/xhs_pc/js/aes_encrypt.js +30 -0
  263. package/static/xhs/xhs_pc/js/b1.js +9 -0
  264. package/static/xhs/xhs_pc/js/deflate.js +320 -0
  265. package/static/xhs/xhs_pc/js/mns.js +4 -0
  266. package/static/xhs/xhs_pc/js/profile.js +141 -0
  267. package/static/xhs/xhs_pc/js/rap.js +173 -0
  268. package/static/xhs/xhs_pc/js/rap_cli.js +30 -0
  269. package/static/xhs/xhs_pc/js/rap_crypto.js +73 -0
  270. package/static/xhs/xhs_pc/js/rap_fingerprint_template.json +8 -0
  271. package/static/xhs/xhs_pc/js/reference_profile.json +262 -0
  272. package/static/xhs/xhs_pc/js/sign.js +6 -0
  273. package/static/xhs/xhs_pc/js/web_ssk.js +82 -0
  274. package/static/xhs/xhs_pc/js/xs_common.js +4 -0
  275. package/static/xianyu/et_f.js +2 -0
  276. package/static/xianyu/gen_tfstk.js +410 -0
  277. package/static/xianyu/goofish_js_version_2.js +568 -0
@@ -0,0 +1,259 @@
1
+ /**
2
+ * 设备画像、请求头与 Cookie 线序(上游 utils/fingerprint.py、builder/header.py、builder/auth.py 的 cookie_header)。
3
+ * UA 锁在上游实抓的 Chrome 151;TLS 指纹用 wreq-js 最新的 chrome_149。
4
+ */
5
+ export const UA = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/151.0.0.0 Safari/537.36';
6
+ export const SEC_CH_UA = '"Not)A;Brand";v="8", "Chromium";v="151", "Google Chrome";v="151"';
7
+ export const BROWSER = 'chrome_149';
8
+ /**
9
+ * 进程级浏览器档案(上游 fingerprint.py 的 get_profile):请求头、gdfp manMachine 载荷与滑块的
10
+ * captchaExtraParam 都从这里取值,不能各自漂移——UA、几何互相矛盾时服务端回 350014 anti check err。
11
+ * 几何是上游在 Chrome 151 验证码 iframe 里实测的(CURRENT_GEO 与单独给出的 CURRENT_OUTER_WIDTH)。
12
+ */
13
+ export const PROFILE = {
14
+ ua: UA,
15
+ platform: 'Win32',
16
+ language: 'zh-CN',
17
+ timeZone: 'UTC+8',
18
+ productSub: '20030107',
19
+ product: 'Gecko',
20
+ cpuCores: 20,
21
+ webglVendor: 'Google Inc. (NVIDIA)',
22
+ webglRenderer: 'ANGLE (NVIDIA, NVIDIA GeForce RTX 5060 Ti (0x00002D04) Direct3D11 vs_5_0 ps_5_0, D3D11)',
23
+ screenWidth: 2560,
24
+ screenHeight: 1440,
25
+ availWidth: 2560,
26
+ availHeight: 1440,
27
+ innerHeight: 1440,
28
+ outerWidth: 2576,
29
+ outerHeight: 1460,
30
+ devicePixelRatio: 1,
31
+ };
32
+ /** `screen.width x screen.height`(gdfp 字段 8、captchaExtraParam 的 resolution)。 */
33
+ export const RESOLUTION = `${PROFILE.screenWidth}x${PROFILE.screenHeight}`;
34
+ export const ACCEPT_LANGUAGE = 'zh-CN,zh;q=0.9,en;q=0.8,zh-TW;q=0.7,ja;q=0.6';
35
+ /** 登录站的 STS 导航与 gdfp 指纹上报用的短 accept-language(上游实抓如此)。 */
36
+ export const ACCEPT_LANGUAGE_SHORT = 'zh-CN,zh;q=0.9';
37
+ export const ACCEPT_ENCODING = 'gzip, deflate, br, zstd';
38
+ const ACCEPT_WWW = 'application/json';
39
+ export const ACCEPT_AXIOS = 'application/json, text/plain, */*';
40
+ export const ACCEPT_ANY = '*/*';
41
+ const CONTENT_TYPE_JSON = 'application/json';
42
+ const CONTENT_TYPE_CP = 'application/json;charset=UTF-8';
43
+ const CONTENT_TYPE_FORM = 'application/x-www-form-urlencoded';
44
+ const DOC_ACCEPT = 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7';
45
+ export const WWW = 'https://www.kuaishou.com';
46
+ export const CP = 'https://cp.kuaishou.com';
47
+ export const LIVE = 'https://live.kuaishou.com';
48
+ export const ID_HOST = 'https://id.kuaishou.com';
49
+ export const PASSPORT = 'https://passport.kuaishou.com';
50
+ export const GDFP = 'https://gdfp.gifshow.com';
51
+ /** 滑块验证码的 iframe 与接口。 */
52
+ export const CAPTCHA_HOST = 'https://captcha.zt.kuaishou.com';
53
+ /** 直播页 Sentry 的 baggage(带 sentry-trace 的直播接口与登出)。 */
54
+ export const LIVE_SENTRY_BAGGAGE = 'sentry-environment=prod,sentry-release=ab256f1';
55
+ export const RECO_REFERER = `${WWW}/new-reco`;
56
+ export const PUBLISH_REFERER = `${CP}/article/publish/video?origin=www.kuaishou.com`;
57
+ // webweapon 产品名与页面地址(kww_pure.py)
58
+ export const PRODUCT_WWW = 'kuaishou-vision';
59
+ export const PRODUCT_CP = 'onvideo-cp';
60
+ export const PRODUCT_LIVE = 'PCLive';
61
+ export const PRODUCT_CAPTCHA = 'verification-captcha';
62
+ export const HREF_WWW = `${WWW}/new-reco`;
63
+ export const HREF_CP = PUBLISH_REFERER;
64
+ export const HREF_LIVE = `${LIVE}/`;
65
+ export const HREF_CAPTCHA = `${CAPTCHA_HOST}/iframe/index.html`;
66
+ /** 按 product 取 webweapon 的 href / product(_site_defaults)。 */
67
+ export function siteDefaults(product) {
68
+ if (product === PRODUCT_CAPTCHA)
69
+ return [HREF_CAPTCHA, PRODUCT_CAPTCHA];
70
+ if (product === PRODUCT_CP)
71
+ return [HREF_CP, PRODUCT_CP];
72
+ if (product === PRODUCT_LIVE)
73
+ return [HREF_LIVE, PRODUCT_LIVE];
74
+ return [HREF_WWW, PRODUCT_WWW];
75
+ }
76
+ // ---------------------------------------------------------------- 请求头(builder/header.py)
77
+ const DOC_ONLY = ['cache-control', 'pragma', 'sec-ch-ua', 'sec-ch-ua-mobile', 'sec-ch-ua-platform', 'sec-fetch-user', 'upgrade-insecure-requests'];
78
+ const ORDER = {
79
+ www: [
80
+ 'profile_referer', 'sentry-trace', 'referer', 'user-agent', 'accept', 'content-type', 'kww', 'baggage', 'accept-encoding', 'accept-language',
81
+ 'cache-control', 'cookie', 'origin', 'pragma', 'sec-fetch-dest', 'sec-fetch-mode', 'sec-fetch-site', ...DOC_ONLY,
82
+ ],
83
+ cp: ['referer', 'user-agent', 'content-type', 'kww', 'accept', 'accept-encoding', 'accept-language', 'cookie', 'origin', 'sec-fetch-dest', 'sec-fetch-mode', 'sec-fetch-site', ...DOC_ONLY],
84
+ cp_submit: [
85
+ 'referer', 'user-agent', 'content-type', 'kww', 'accept', 'accept-encoding', 'accept-language', 'connection', 'content-length', 'cookie', 'host',
86
+ 'origin', 'sec-fetch-dest', 'sec-fetch-mode', 'sec-fetch-site', ...DOC_ONLY,
87
+ ],
88
+ cp_creator_json: [
89
+ 'referer', 'user-agent', 'accept', 'content-type', 'returnsetrootdomainloginurl', 'accept-encoding', 'accept-language', 'cache-control', 'cookie',
90
+ 'origin', 'pragma', 'sec-fetch-dest', 'sec-fetch-mode', 'sec-fetch-site', ...DOC_ONLY,
91
+ ],
92
+ cp_creator_axios: [
93
+ 'referer', 'x-requested-with', 'user-agent', 'accept', 'content-type', 'returnsetrootdomainloginurl', 'accept-encoding', 'accept-language',
94
+ 'cache-control', 'cookie', 'origin', 'pragma', 'sec-fetch-dest', 'sec-fetch-mode', 'sec-fetch-site', ...DOC_ONLY,
95
+ ],
96
+ login: [
97
+ 'user-agent', 'content-type', 'kww', 'accept', 'origin', 'sec-fetch-site', 'sec-fetch-mode', 'sec-fetch-dest', 'referer', 'accept-encoding',
98
+ 'accept-language', 'cookie', 'priority', ...DOC_ONLY,
99
+ ],
100
+ login_pass_token: [
101
+ 'user-agent', 'content-type', 'referer', 'accept', 'accept-encoding', 'accept-language', 'cookie', 'origin', 'sec-fetch-dest', 'sec-fetch-mode',
102
+ 'sec-fetch-site', ...DOC_ONLY,
103
+ ],
104
+ };
105
+ const STYLE = {
106
+ www: ['www', ACCEPT_WWW, CONTENT_TYPE_JSON],
107
+ live: ['www', ACCEPT_AXIOS, CONTENT_TYPE_JSON],
108
+ cp: ['cp', ACCEPT_ANY, CONTENT_TYPE_CP],
109
+ cp_submit: ['cp_submit', ACCEPT_ANY, CONTENT_TYPE_CP],
110
+ cp_creator_json: ['cp_creator_json', ACCEPT_WWW, CONTENT_TYPE_CP],
111
+ cp_creator_axios: ['cp_creator_axios', ACCEPT_AXIOS, CONTENT_TYPE_CP],
112
+ login: ['login', ACCEPT_ANY, CONTENT_TYPE_FORM],
113
+ login_pass_token: ['login_pass_token', ACCEPT_ANY, CONTENT_TYPE_FORM],
114
+ };
115
+ /** 有序请求头(上游 Header):输出时先按 order,再追加不在 order 里的键。 */
116
+ export class Headers {
117
+ order;
118
+ map = new Map();
119
+ constructor(order = ORDER.www) {
120
+ this.order = order;
121
+ }
122
+ set(key, value) {
123
+ this.map.set(key, value);
124
+ return this;
125
+ }
126
+ remove(key) {
127
+ this.map.delete(key);
128
+ return this;
129
+ }
130
+ has(key) {
131
+ return this.map.has(key);
132
+ }
133
+ get() {
134
+ const out = [];
135
+ const seen = new Set();
136
+ for (const k of [...this.order, ...this.map.keys()]) {
137
+ if (seen.has(k) || !this.map.has(k))
138
+ continue;
139
+ seen.add(k);
140
+ out.push([k, this.map.get(k)]);
141
+ }
142
+ return out;
143
+ }
144
+ }
145
+ /** HeaderBuilder.build:按站点风格产出顺序与 Chrome 一致的请求头。 */
146
+ export function buildHeaders(type, style = 'www', accept) {
147
+ if (type === 'DOC') {
148
+ const h = new Headers();
149
+ h.set('accept', DOC_ACCEPT)
150
+ .set('accept-language', ACCEPT_LANGUAGE)
151
+ .set('cache-control', 'no-cache')
152
+ .set('pragma', 'no-cache')
153
+ .set('priority', 'u=0, i')
154
+ .set('sec-ch-ua', SEC_CH_UA)
155
+ .set('sec-ch-ua-mobile', '?0')
156
+ .set('sec-ch-ua-platform', '"Windows"')
157
+ .set('sec-fetch-dest', 'document')
158
+ .set('sec-fetch-mode', 'navigate')
159
+ .set('sec-fetch-site', 'none')
160
+ .set('sec-fetch-user', '?1')
161
+ .set('upgrade-insecure-requests', '1')
162
+ .set('user-agent', UA);
163
+ return h;
164
+ }
165
+ const [order, defaultAccept, contentType] = STYLE[style];
166
+ const h = new Headers(ORDER[order]);
167
+ h.set('user-agent', UA);
168
+ h.set('accept', accept ?? defaultAccept);
169
+ if (type === 'POST' || type === 'FORM')
170
+ h.set('content-type', type === 'POST' ? contentType : CONTENT_TYPE_FORM);
171
+ h.set('accept-encoding', ACCEPT_ENCODING);
172
+ h.set('accept-language', ACCEPT_LANGUAGE);
173
+ h.set('sec-fetch-dest', 'empty');
174
+ h.set('sec-fetch-mode', 'cors');
175
+ h.set('sec-fetch-site', 'same-origin');
176
+ if (style === 'login')
177
+ h.set('priority', 'u=1, i');
178
+ return h;
179
+ }
180
+ // ---------------------------------------------------------------- Cookie 线序(builder/auth.py cookie_header)
181
+ const W_HEAD = [
182
+ 'kpf', 'clientid', 'did', 'wid', 'didv', 'kwpsecproductname', 'userId', 'kuaishou.server.webday7_st', 'kuaishou.server.webday7_ph', 'bUserId',
183
+ 'kuaishou.web.cp.api_st', 'kuaishou.web.cp.api_ph',
184
+ ];
185
+ const CP_HEAD = ['did', 'wid', 'didv', 'userId', 'bUserId', 'kuaishou.web.cp.api_st', 'kuaishou.web.cp.api_ph'];
186
+ const LIVE_HEAD = ['did', 'wid', 'clientid', 'did', 'client_key', 'kpn', 'didv'];
187
+ const LIVE_CP = [...LIVE_HEAD, 'userId', 'bUserId', 'kuaishou.web.cp.api_st', 'kuaishou.web.cp.api_ph', 'kuaishou.live.bfb1s', 'userId'];
188
+ const LIVE_ONLY = [...LIVE_HEAD, 'bUserId', 'kuaishou.live.bfb1s', 'kwpsecproductname', 'userId', 'userId'];
189
+ const PASS_CP = ['did', 'wid', 'didv', 'userId', 'userId', 'bUserId', 'bUserId', 'kuaishou.web.cp.api_st', 'kuaishou.web.cp.api_ph'];
190
+ const PASS_DIRECT = ['did', 'wid', 'didv', 'bUserId', 'kwpsecproductname', 'userId', 'userId', 'passToken', 'kwfv1', 'kwssectoken', 'kwscode'];
191
+ const WEB = ['kuaishou.live.web_st', 'kuaishou.live.web_ph'];
192
+ const Q = ['kwpsecproductname', 'kwssectoken', 'kwscode', 'kwfv1'];
193
+ /** 各页面、各阶段 Chrome 实抓的 Cookie 字段顺序(含同名重复的 path-scoped 字段)。 */
194
+ export const SEQUENCES = {
195
+ www_initial: [...W_HEAD, 'ktrace-context', 'kpn', ...Q.slice(0, 1), 'kwssectoken', 'kwscode', 'kwfv1'],
196
+ www_graphql_initial: [...W_HEAD, 'ktrace-context', 'kwpsecproductname', 'kwfv1', 'kwssectoken', 'kwscode', 'kpn'],
197
+ www_graphql_refreshed: [...W_HEAD, 'ktrace-context', 'kwpsecproductname', 'kwssectoken', 'kwscode', 'kpn', 'kwfv1'],
198
+ www_graphql_detail_initial: [...W_HEAD, 'kwpsecproductname', 'ktrace-context', 'kwssectoken', 'kwscode', 'kpn', 'kwfv1', 'kwssectoken', 'kwscode'],
199
+ www_graphql_detail_bootstrap: [...W_HEAD, 'ktrace-context', 'kwpsecproductname', 'kwssectoken', 'kwscode', 'kwfv1', 'kwssectoken', 'kwscode', 'kpn'],
200
+ www_graphql_detail_video_success: [...W_HEAD, 'ktrace-context', 'kwpsecproductname', 'kpn', 'kwssectoken', 'kwscode', 'kwssectoken', 'kwscode', 'kwfv1'],
201
+ www_graphql_detail_refreshed: [...W_HEAD, 'kwpsecproductname', 'ktrace-context', 'kwssectoken', 'kwscode', 'kpn', 'kwfv1', 'kwssectoken', 'kwscode'],
202
+ www_graphql_comment_initial: [...W_HEAD, 'ktrace-context', 'kpn', 'kwpsecproductname', 'kwssectoken', 'kwscode', 'kwssectoken', 'kwscode', 'kwfv1'],
203
+ www_graphql_subcomment_initial: [...W_HEAD, 'kwpsecproductname', 'ktrace-context', 'kwssectoken', 'kwscode', 'kpn', 'kwfv1', 'kwssectoken', 'kwscode'],
204
+ www_relogin_relation_following: [...W_HEAD, 'ktrace-context', 'kpn', 'kwpsecproductname', 'kwssectoken', 'kwscode', 'kwfv1', 'kwssectoken', 'kwscode'],
205
+ www_relogin_relation_fans: [...W_HEAD, 'ktrace-context', 'kpn', 'kwpsecproductname', 'kwssectoken', 'kwscode', 'kwssectoken', 'kwscode', 'kwfv1'],
206
+ cp_creator_initial: [...CP_HEAD, 'kwpsecproductname', 'kwssectoken', 'kwscode', 'kwfv1'],
207
+ cp_creator_warmed: [...CP_HEAD, 'kwpsecproductname', 'kwscode', 'kwssectoken', 'kwfv1'],
208
+ cp_creator_refreshed: [...CP_HEAD, 'kwpsecproductname', 'kwscode', 'kwssectoken', 'kwfv1'],
209
+ cp: [...CP_HEAD, 'kwpsecproductname', 'kwscode', 'kwssectoken', 'kwfv1'],
210
+ cp_upload: [...CP_HEAD, 'kwpsecproductname', 'kwfv1', 'kwssectoken', 'kwscode'],
211
+ cp_video_submit: [...CP_HEAD, 'kwpsecproductname', 'kwfv1', 'kwssectoken', 'kwscode'],
212
+ cp_atlas: [...CP_HEAD, 'kwpsecproductname', 'kwfv1', 'kwssectoken', 'kwscode'],
213
+ live_pass_token_home: [...PASS_CP, 'passToken', 'kwfv1', 'kwpsecproductname', 'kwssectoken', 'kwscode'],
214
+ live_pass_token_room: [...PASS_CP, 'kwpsecproductname', 'passToken', 'kwssectoken', 'kwscode', 'kwfv1'],
215
+ live_pass_token_home_direct: PASS_DIRECT,
216
+ live_pass_token_room_direct: PASS_DIRECT,
217
+ live_home_initial: [...LIVE_CP, ...WEB, 'kwfv1', 'kwpsecproductname', 'kwssectoken', 'kwscode'],
218
+ live_home_login: [...LIVE_CP, ...WEB, ...Q],
219
+ live_home_login_bootstrap: [...LIVE_CP, 'kuaishou.live.web_st', ...Q],
220
+ live_home_current_initial: [...LIVE_ONLY, ...WEB, 'kwssectoken', 'kwscode', 'kwfv1'],
221
+ live_home_current_login: [...LIVE_ONLY, ...WEB, 'kwssectoken', 'kwscode', 'kwfv1'],
222
+ live_home_current_login_bootstrap: [...LIVE_ONLY, 'kuaishou.live.web_st', 'kwssectoken', 'kwscode', 'kwfv1'],
223
+ live_home_current_authenticated_1: [...LIVE_ONLY, 'kwssectoken', 'kwscode', 'kwfv1', ...WEB],
224
+ live_home_current_authenticated_2: [...LIVE_ONLY, 'kwfv1', ...WEB, 'kwssectoken', 'kwscode'],
225
+ live_home_current_authenticated_3: [...LIVE_ONLY, ...WEB, 'kwssectoken', 'kwscode', 'kwfv1'],
226
+ live_home_authenticated_1: [...LIVE_CP, ...WEB, ...Q],
227
+ live_home_authenticated_2: [...LIVE_CP, ...Q, ...WEB],
228
+ live_room_initial: [...LIVE_CP, 'kwpsecproductname', ...WEB, 'kwssectoken', 'kwscode', 'kwfv1'],
229
+ live_room_current_initial: [...LIVE_ONLY, 'kwfv1', 'kwssectoken', 'kwscode', ...WEB],
230
+ live_room_login: [...LIVE_CP, 'kwpsecproductname', ...WEB, 'kwssectoken', 'kwscode', 'kwfv1'],
231
+ live_room_login_bootstrap: [...LIVE_CP, 'kwpsecproductname', 'kuaishou.live.web_st', 'kwssectoken', 'kwscode', 'kwfv1'],
232
+ live_room_current_login: [...LIVE_ONLY, 'kwssectoken', 'kwscode', ...WEB, 'kwfv1'],
233
+ live_room_current_login_bootstrap: [...LIVE_ONLY, 'kwssectoken', 'kwscode', 'kuaishou.live.web_st', 'kwfv1'],
234
+ live_room_authenticated: [...LIVE_CP, 'kwpsecproductname', ...WEB, 'kwssectoken', 'kwscode', 'kwfv1'],
235
+ live_room_current_authenticated: [...LIVE_ONLY, 'kwfv1', ...WEB, 'kwssectoken', 'kwscode'],
236
+ // 房间首屏的表情 / 礼物字典(emoji/icon、emoji/allgifts)
237
+ live_room_assets_initial: [...LIVE_HEAD, 'bUserId', 'kuaishou.live.bfb1s', 'userId', ...WEB, 'kwfv1', 'kwssectoken', 'kwscode', 'kwpsecproductname'],
238
+ // 直播间登出:passport 那一跳只带设备与安全票据;已清理过的会话再登出一次时顺序不同
239
+ live_logout_passport_authenticated: ['did', 'wid', 'didv', 'bUserId', 'kwfv1', 'kwssectoken', 'kwscode', 'kwpsecproductname'],
240
+ live_logout_passport_clean: ['did', 'wid', 'didv', 'bUserId', ...Q],
241
+ live_room_logout_authenticated: [...LIVE_HEAD, 'bUserId', 'kuaishou.live.bfb1s', 'userId', ...WEB, ...Q],
242
+ live_room_logout_clean: [...LIVE_HEAD, 'bUserId', 'kuaishou.live.bfb1s', ...Q],
243
+ // 视频发布后跳到的作品管理页(仍是上传上下文的 kuaishou-vision 产品)
244
+ cp_post_publish_manage: [...CP_HEAD, 'kwpsecproductname', 'kwssectoken', 'kwscode', 'kwfv1'],
245
+ // 验证码 iframe:第一个 kwpsecproductname 是 iframe 路径下的 verification-captcha,第二个是父页的产品
246
+ captcha: ['did', 'wid', 'kwpsecproductname', 'didv', 'bUserId', ...Q],
247
+ };
248
+ SEQUENCES.www_refreshed = SEQUENCES.www_initial;
249
+ SEQUENCES.www_security_refreshed = SEQUENCES.www_initial;
250
+ /** 取值时直接读原始 cookie 映射、不触发 webweapon 续期的线序(其余都先经 `auth.cookie`)。 */
251
+ export const RAW_VALUE_PROFILES = new Set([
252
+ 'www_initial', 'www_graphql_initial', 'www_graphql_subcomment_initial', 'cp_creator_initial', 'cp_creator_warmed', 'cp_creator_refreshed',
253
+ 'live_home_initial', 'live_home_current_initial', 'live_room_initial', 'live_room_assets_initial', 'cp_post_publish_manage',
254
+ ]);
255
+ /** 这些线序里奇数次出现的 kwssectoken / kwscode 取上一次轮换前的旧值(真实发生过轮换时)。 */
256
+ export const STALE_PAIR_PROFILES = new Set([
257
+ 'www_graphql_detail_bootstrap', 'www_graphql_detail_initial', 'www_graphql_detail_video_success', 'www_graphql_detail_refreshed',
258
+ 'www_graphql_comment_initial', 'www_graphql_subcomment_initial', 'www_relogin_relation_following', 'www_relogin_relation_fans',
259
+ ]);
@@ -0,0 +1,84 @@
1
+ import { SpecificAIError } from '../../../core/errors.js';
2
+ import { authError } from '../../../core/toolkit.js';
3
+ import * as api from './api.js';
4
+ import { UA } from './profile.js';
5
+ /** 参数归一化(AGENTS 4.8):ID、URL、分享短链、`me`。 */
6
+ const SHORT_HOSTS = /^(v\.kuaishou\.com|v\.m\.chenzhongtech\.com|kuaishou\.cn|c\.kuaishou\.com)$/i;
7
+ /** 分享短链跟一次跳转,取 Location。 */
8
+ async function expand(ks, input) {
9
+ let u;
10
+ try {
11
+ u = new URL(input);
12
+ }
13
+ catch {
14
+ return input;
15
+ }
16
+ if (!SHORT_HOSTS.test(u.hostname))
17
+ return input;
18
+ const res = await ks.http.request({ url: input, redirect: 'manual', cookies: false, headers: [['user-agent', UA]] });
19
+ return res.headers.get('location') ?? input;
20
+ }
21
+ /** 作品:photoId,或 www.kuaishou.com/short-video/<id>、/fw/photo/<id>、live.kuaishou.com/u/<eid>/<id>、分享短链。 */
22
+ export async function resolveItem(ks, input) {
23
+ const s = (await expand(ks, input.trim())).trim();
24
+ if (!/^https?:\/\//i.test(s)) {
25
+ if (/^[0-9A-Za-z_-]{6,}$/.test(s))
26
+ return s;
27
+ throw new SpecificAIError('USAGE', `无法识别的作品:${input}`, { hint: '传作品 ID 或链接,例如 https://www.kuaishou.com/short-video/<id>' });
28
+ }
29
+ const u = new URL(s);
30
+ const fromQuery = u.searchParams.get('photoId') ?? u.searchParams.get('shareObjectId');
31
+ if (fromQuery)
32
+ return fromQuery;
33
+ const m = /\/(?:short-video|fw\/photo|photo|video)\/([^/?#]+)/.exec(u.pathname) ?? /^\/u\/[^/]+\/([^/?#]+)/.exec(u.pathname);
34
+ if (m)
35
+ return decodeURIComponent(m[1]);
36
+ const last = u.pathname.replace(/\/+$/, '').split('/').pop();
37
+ if (last)
38
+ return last;
39
+ throw new SpecificAIError('USAGE', `无法识别的作品:${input}`, { hint: '传作品 ID 或链接,例如 https://www.kuaishou.com/short-video/<id>' });
40
+ }
41
+ /** 当前登录用户的 eid(来自 profile/get,带缓存)。 */
42
+ export async function selfEid(ks) {
43
+ if (ks.s.selfEid)
44
+ return ks.s.selfEid;
45
+ const p = await api.profile(ks);
46
+ ks.check(p, 'profile/get');
47
+ if (!ks.s.selfEid)
48
+ throw authError(ks.ctx, '没有取到当前账号的用户 ID,请重新登录');
49
+ return ks.s.selfEid;
50
+ }
51
+ /** 用户:eid、主页 URL(www.kuaishou.com/profile/<eid>)、分享短链或 `me`。直播间链接(live.kuaishou.com)报 USAGE。 */
52
+ export async function resolveUser(ks, input) {
53
+ const s = (await expand(ks, input.trim())).trim();
54
+ if (s === 'me')
55
+ return selfEid(ks);
56
+ if (/^https?:\/\//i.test(s)) {
57
+ const url = new URL(s);
58
+ // 直播间链接里的是直播用的主播 id(快手号),和主页的 eid 是两套,主页接口查不到
59
+ if (url.hostname === 'live.kuaishou.com') {
60
+ throw new SpecificAIError('USAGE', `这是直播间链接,不是用户主页:${input}`, {
61
+ hint: '直播间里的主播 id 和主页 id 是两套,快手没有互查的接口;请传主页链接 https://www.kuaishou.com/profile/<id>',
62
+ });
63
+ }
64
+ const m = /\/(?:profile|u)\/([^/?#]+)/.exec(url.pathname);
65
+ if (m)
66
+ return decodeURIComponent(m[1]);
67
+ throw new SpecificAIError('USAGE', `无法识别的用户:${input}`, { hint: '传用户 ID(如 3x...)或主页链接 https://www.kuaishou.com/profile/<id>' });
68
+ }
69
+ if (/^[0-9A-Za-z_-]+$/.test(s))
70
+ return s;
71
+ throw new SpecificAIError('USAGE', `无法识别的用户:${input}`, { hint: '传用户 ID(如 3x...)或主页链接 https://www.kuaishou.com/profile/<id>' });
72
+ }
73
+ /** 直播间:主播 eid 或 live.kuaishou.com/u/<eid>。 */
74
+ export async function resolveRoom(ks, input) {
75
+ const s = (await expand(ks, input.trim())).trim();
76
+ if (/^https?:\/\//i.test(s)) {
77
+ const m = /\/(?:u|profile)\/([^/?#]+)/.exec(new URL(s).pathname);
78
+ if (m)
79
+ return decodeURIComponent(m[1]);
80
+ }
81
+ else if (/^[0-9A-Za-z_-]+$/.test(s))
82
+ return s;
83
+ throw new SpecificAIError('USAGE', `无法识别的直播间:${input}`, { hint: '传主播 ID 或直播间链接 https://live.kuaishou.com/u/<id>' });
84
+ }