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,51 @@
1
+ import { SpecificAIError } from '../../../core/errors.js';
2
+ import { plainId } from './im.js';
3
+ /** 参数归一化(AGENTS 4.8):商品 ID、商品链接、分享短链、会话 ID。 */
4
+ const ITEM_HOST = /(^|\.)(taobao|tmall)\.com$/i;
5
+ const SHORT_HOST = /(^|\.)tb\.cn$/i;
6
+ const itemUrl = (id) => `https://item.taobao.com/item.htm?id=${id}`;
7
+ /** 分享短链(m.tb.cn):落地页用脚本跳转,从最终地址或页面里找商品 ID。 */
8
+ async function expand(tb, url) {
9
+ const res = await tb.http.request({ url, cookies: false, headers: [['user-agent', 'Mozilla/5.0']] });
10
+ const text = `${res.url}\n${await res.text()}`;
11
+ const id = /(?:item\.taobao\.com|detail\.tmall\.com|detail\.m\.tmall\.com)[^"'\s]*?[?&]id=(\d+)/.exec(text)?.[1] ?? /[?&]id=(\d{6,})/.exec(text)?.[1];
12
+ return id ? itemUrl(id) : null;
13
+ }
14
+ /** 商品:纯数字 ID、淘宝 / 天猫商品链接或分享短链,返回要打开的商品页地址(链接原样使用,与上游一致)。 */
15
+ export async function resolveItem(tb, input) {
16
+ const s = input.trim();
17
+ if (/^\d+$/.test(s))
18
+ return itemUrl(s);
19
+ let url = null;
20
+ try {
21
+ url = /^https?:\/\//i.test(s) ? new URL(s) : null;
22
+ }
23
+ catch { }
24
+ if (url && ITEM_HOST.test(url.hostname))
25
+ return s;
26
+ if (url && SHORT_HOST.test(url.hostname)) {
27
+ const expanded = await expand(tb, s);
28
+ if (expanded)
29
+ return expanded;
30
+ }
31
+ throw new SpecificAIError('USAGE', `无法识别的商品:${input}`, { hint: '传商品 ID 或商品链接,例如 https://item.taobao.com/item.htm?id=<id>' });
32
+ }
33
+ /** 用户:淘宝没有按用户 ID 查询的接口,只能通过商品链接取卖家。 */
34
+ export async function resolveSellerItem(tb, input) {
35
+ const s = input.trim();
36
+ if (/^https?:\/\//i.test(s))
37
+ return resolveItem(tb, s);
38
+ throw new SpecificAIError('USAGE', `淘宝只能通过商品链接查询卖家:${input}`, { hint: 'specific-ai taobao user get <商品链接>' });
39
+ }
40
+ /** 会话 ID:`<uid>.1-<uid>.1#11001`,可带 `@cntaobao` 后缀;返回会话 ID 和对方的用户 ID。 */
41
+ export function resolveConversation(input, myId) {
42
+ const cid = plainId(input.trim());
43
+ const m = /^(\d+)\.\d+-(\d+)\.\d+#\d+$/.exec(cid);
44
+ if (!m)
45
+ throw new SpecificAIError('USAGE', `无法识别的会话 ID:${input}`, { hint: '会话 ID 形如 <我的用户 id>.1-<对方用户 id>.1#11001,来自 msg listen 或 msg history 的 conversation_id' });
46
+ const [, a, b] = m;
47
+ const peer = a === myId ? b : b === myId ? a : null;
48
+ if (!peer)
49
+ throw new SpecificAIError('USAGE', `会话 ${cid} 不属于当前账号(${myId})`);
50
+ return { cid, peer };
51
+ }
@@ -0,0 +1,35 @@
1
+ import vm from 'node:vm';
2
+ import { staticFile } from '../../../core/paths.js';
3
+ import { loadScript } from '../../../core/vm.js';
4
+ /**
5
+ * 上游 utils/taobao_utils.py:签名、mid / uuid / 设备号的生成、推送消息的解码,都在上游的
6
+ * static/taobao_js_20260407.js 里(原样复制到 static/taobao/),这里用 vm 执行。
7
+ *
8
+ * 脚本里的函数是顶层 `const` 声明,不挂在 context 的全局对象上,所以按名字在 context 里求值取出。
9
+ */
10
+ const SCRIPT = staticFile('taobao', 'taobao_js_20260407.js');
11
+ function call(fn, ...args) {
12
+ const context = loadScript(SCRIPT);
13
+ const f = vm.runInContext(fn, context);
14
+ return f(...args);
15
+ }
16
+ /** 帧的 mid:`<0~999 的随机数><毫秒时间戳> 0`。 */
17
+ export function generateMid() {
18
+ return call('generate_mid');
19
+ }
20
+ /** 发消息时的客户端 uuid:`_s_<毫秒时间戳>_1`。 */
21
+ export function generateUuid() {
22
+ return call('generate_uuid');
23
+ }
24
+ /** 设备号:32 位随机字符 + `-` + 毫秒时间戳(上游传入 unb,但脚本并不使用它)。 */
25
+ export function generateDeviceId(userId) {
26
+ return call('generate_device_id', userId);
27
+ }
28
+ /** mtop 签名:md5(`token&t&appKey&data`)。 */
29
+ export function generateSign(t, token, data) {
30
+ return call('generate_sign', t, token, data);
31
+ }
32
+ /** 解开推送里 base64 + MessagePack 编码的消息,返回 JSON 字符串(64 位整数写成字符串)。 */
33
+ export function decrypt(data) {
34
+ return call('decrypt', data);
35
+ }
@@ -0,0 +1,120 @@
1
+ import { z } from 'zod';
2
+ import { filter, PRODUCT } from '../../core/options.js';
3
+ import { definePlatform, handlers } from '../../core/registry.js';
4
+ /** 懒加载 web 端的 handler:只有执行到这条命令时才加载实现。 */
5
+ const { h, impl } = handlers(() => import('./web/commands.js'));
6
+ /** 发布的互动开关(AGENTS 4.7)。不给时用上游的默认值,视频与图文不同。 */
7
+ const toggle = (what, dflt) => z.enum(['on', 'off']).optional().describe(`允许${what},默认 ${dflt}`);
8
+ const PUBLISH_TOGGLES = {
9
+ allowComment: toggle('评论', 'on'),
10
+ allowDuet: toggle('合拍(Duet)', '视频 off、图文 on'),
11
+ allowStitch: toggle('拼接(Stitch)', '视频 off、图文 on'),
12
+ allowContentReuse: toggle('他人复用内容', 'on'),
13
+ allowAiRemix: toggle('AI 改编', 'on'),
14
+ };
15
+ /** 收藏夹的公开 / 私密:沿用标准选项 --visibility 的名字与取值(AGENTS 4.9),没有 friends。 */
16
+ const FOLDER_VISIBILITY = z.enum(['public', 'private']).optional().describe('公开或私密;新建默认 private,修改时不给则不变');
17
+ export default definePlatform({
18
+ id: 'tiktok',
19
+ name: 'TikTok',
20
+ aliases: ['tt'],
21
+ item: '视频',
22
+ endpoints: {
23
+ web: {
24
+ login: { methods: ['cookie'], default: 'cookie' },
25
+ commands: {
26
+ 'auth login': impl('full', 'authLogin'),
27
+ 'auth status': impl('full', 'authStatus'),
28
+ 'user get': impl('partial', 'userGet', { note: 'me 部分支持' }),
29
+ 'user search': 'none',
30
+ 'user items': impl('full', 'userItems'),
31
+ 'user likes': 'none',
32
+ 'user collects': impl('full', 'userCollects'),
33
+ 'user reposts': impl('full', 'userReposts'),
34
+ 'user followers': impl('full', 'userFollowers'),
35
+ 'user following': impl('full', 'userFollowing'),
36
+ 'user follow': impl('full', 'userFollow'),
37
+ 'user unfollow': impl('full', 'userUnfollow'),
38
+ 'item get': impl('full', 'itemGet'),
39
+ 'item search': impl('full', 'itemSearch'),
40
+ 'item related': impl('full', 'itemRelated'),
41
+ 'item list': impl('full', 'itemList'),
42
+ 'item media': impl('partial', 'itemMedia', { note: '媒体地址取自视频详情(video.playAddr,图文取 imagePost),上游没有单独的解析接口' }),
43
+ 'item download': impl('partial', 'itemDownload', { note: '媒体地址同 item media' }),
44
+ 'item like': impl('full', 'itemLike'),
45
+ 'item unlike': impl('full', 'itemUnlike'),
46
+ 'item collect': impl('full', 'itemCollect'),
47
+ 'item uncollect': impl('full', 'itemUncollect'),
48
+ 'item repost': 'none',
49
+ 'item unrepost': 'none',
50
+ 'item publish': impl('full', 'itemPublish', {
51
+ supports: ['text', 'image', 'video', 'cover', 'tag', 'topic', 'mention', 'visibility'],
52
+ options: PUBLISH_TOGGLES,
53
+ }),
54
+ 'item delete': 'none',
55
+ 'product get': impl('full', 'productGet'),
56
+ 'comment list': impl('full', 'commentList', { options: { product: PRODUCT } }),
57
+ 'comment replies': impl('full', 'commentReplies'),
58
+ 'comment add': impl('full', 'commentAdd'),
59
+ 'comment delete': 'none',
60
+ 'comment like': 'none',
61
+ 'comment unlike': 'none',
62
+ 'feed list': impl('full', 'feedList', { options: { kind: filter.kind('recommend', 'following') } }),
63
+ // 上游没有推荐流分类接口
64
+ 'feed categories': 'none',
65
+ 'live get': impl('full', 'liveGet'),
66
+ 'live list': impl('full', 'liveList', { note: '只有关注的人里正在直播的(上游 get_webcast_feed 是直播页侧栏的关注列表);没关注的人在播时为空' }),
67
+ 'live search': impl('full', 'liveSearch'),
68
+ 'live categories': impl('full', 'liveCategories'),
69
+ 'live listen': impl('full', 'liveListen'),
70
+ 'live history': impl('partial', 'liveHistory', { note: '只有进房拉取(im/fetch)时带回的弹幕' }),
71
+ 'live send': impl('partial', 'liveSend', { note: '--gift 规划中' }),
72
+ 'live like': impl('full', 'liveLike'),
73
+ 'live rank': impl('full', 'liveRank'),
74
+ 'live gifts': impl('full', 'liveGifts'),
75
+ 'live products': 'none',
76
+ 'live media': impl('partial', 'liveMedia', { note: '上游没有解析拉流地址:取自 /api-live/user/room 的 liveRoom.streamData,或 room/enter 的 stream_url' }),
77
+ 'live start': 'none',
78
+ 'live stop': 'none',
79
+ 'keyword suggest': impl('full', 'keywordSuggest'),
80
+ 'keyword hot': 'none',
81
+ 'notice list': impl('full', 'noticeList'),
82
+ 'notice count': impl('full', 'noticeCount'),
83
+ 'msg list': impl('full', 'msgList'),
84
+ 'msg history': impl('full', 'msgHistory'),
85
+ 'msg send': impl('partial', 'msgSend', { note: '只支持文本,只能发给已有会话的用户(上游不能新建会话)' }),
86
+ 'msg listen': impl('full', 'msgListen'),
87
+ 'msg read': 'none',
88
+ 'msg revoke': 'none',
89
+ 'msg delete': 'none',
90
+ 'media upload': impl('full', 'mediaUpload'),
91
+ 'folder list': impl('full', 'folderList'),
92
+ 'folder items': impl('full', 'folderItems'),
93
+ 'folder create': impl('full', 'folderCreate', { options: { visibility: FOLDER_VISIBILITY } }),
94
+ 'folder update': impl('full', 'folderUpdate', {
95
+ options: { name: z.string().optional().describe('新名字'), visibility: FOLDER_VISIBILITY },
96
+ check: (_a, o) => (o.name == null && o.visibility == null ? '需要 --name 或 --visibility' : undefined),
97
+ }),
98
+ // 上游没有删除收藏夹的接口
99
+ 'folder delete': 'none',
100
+ 'folder add': impl('full', 'folderAdd', {
101
+ summary: '把{item}加入收藏夹(只能加已收藏的{item})',
102
+ args: [
103
+ { name: 'folder', summary: '收藏夹 ID' },
104
+ { name: 'item', summary: '{item}:ID 或 URL' },
105
+ ],
106
+ output: '{id}',
107
+ auth: 'required',
108
+ }),
109
+ 'series list': impl('full', 'seriesList'),
110
+ // 上游只有合集列表,没有合集内容接口
111
+ 'series items': 'none',
112
+ 'history list': 'none',
113
+ 'topic search': 'none',
114
+ 'poi search': impl('partial', 'poiSearch', { note: '在推荐地点里按关键词筛选' }),
115
+ },
116
+ },
117
+ app: 'planned',
118
+ pc: 'planned',
119
+ },
120
+ });