@jackwener/opencli 1.6.1 → 1.6.2

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 (384) hide show
  1. package/CONTRIBUTING.md +1 -1
  2. package/README.md +27 -45
  3. package/README.zh-CN.md +32 -34
  4. package/autoresearch/browse-tasks.json +18 -20
  5. package/autoresearch/commands/debug.ts +163 -0
  6. package/autoresearch/commands/fix.ts +145 -0
  7. package/autoresearch/commands/plan.ts +88 -0
  8. package/autoresearch/commands/run.ts +138 -0
  9. package/autoresearch/config.ts +82 -0
  10. package/autoresearch/engine.ts +359 -0
  11. package/autoresearch/eval-all.ts +127 -0
  12. package/autoresearch/eval-browse.ts +1 -1
  13. package/autoresearch/eval-publish.ts +238 -0
  14. package/autoresearch/eval-save.ts +249 -0
  15. package/autoresearch/eval-skill.ts +14 -8
  16. package/autoresearch/eval-v2ex.ts +220 -0
  17. package/autoresearch/eval-zhihu.ts +230 -0
  18. package/autoresearch/logger.ts +69 -0
  19. package/autoresearch/presets/combined-reliability.ts +27 -0
  20. package/autoresearch/presets/index.ts +23 -0
  21. package/autoresearch/presets/operate-reliability.ts +24 -0
  22. package/autoresearch/presets/save-reliability.ts +26 -0
  23. package/autoresearch/presets/skill-quality.ts +20 -0
  24. package/autoresearch/presets/v2ex-reliability.ts +24 -0
  25. package/autoresearch/presets/zhihu-reliability.ts +25 -0
  26. package/autoresearch/publish-tasks.json +345 -0
  27. package/autoresearch/run-save.sh +11 -0
  28. package/autoresearch/save-adapters/xhs-explore-deep.ts +64 -0
  29. package/autoresearch/save-adapters/xhs-note-comments.ts +61 -0
  30. package/autoresearch/save-adapters/xhs-search-full.ts +62 -0
  31. package/autoresearch/save-adapters/zhihu-hot-detail.ts +52 -0
  32. package/autoresearch/save-adapters/zhihu-question-full.ts +57 -0
  33. package/autoresearch/save-adapters/zhihu-search-detail.ts +53 -0
  34. package/autoresearch/save-tasks.json +281 -0
  35. package/autoresearch/v2ex-tasks.json +899 -0
  36. package/autoresearch/zhihu-tasks.json +848 -0
  37. package/dist/browser/base-page.d.ts +4 -2
  38. package/dist/browser/base-page.js +37 -4
  39. package/dist/browser/bridge.js +10 -8
  40. package/dist/browser/cdp.js +2 -6
  41. package/dist/browser/daemon-client.d.ts +11 -1
  42. package/dist/browser/daemon-client.js +3 -0
  43. package/dist/browser/dom-helpers.d.ts +4 -2
  44. package/dist/browser/dom-helpers.js +42 -31
  45. package/dist/browser/dom-snapshot.js +23 -1
  46. package/dist/browser/page.d.ts +7 -2
  47. package/dist/browser/page.js +112 -30
  48. package/dist/browser.test.js +1 -1
  49. package/dist/build-manifest.d.ts +1 -0
  50. package/dist/build-manifest.js +1 -0
  51. package/dist/cli-manifest.json +1135 -184
  52. package/dist/cli.d.ts +2 -0
  53. package/dist/cli.js +48 -7
  54. package/dist/cli.test.d.ts +1 -0
  55. package/dist/cli.test.js +88 -0
  56. package/dist/clis/1688/item.d.ts +70 -0
  57. package/dist/clis/1688/item.js +187 -0
  58. package/dist/clis/1688/item.test.d.ts +1 -0
  59. package/dist/clis/1688/item.test.js +67 -0
  60. package/dist/clis/1688/search.d.ts +56 -0
  61. package/dist/clis/1688/search.js +309 -0
  62. package/dist/clis/1688/search.test.d.ts +1 -0
  63. package/dist/clis/1688/search.test.js +75 -0
  64. package/dist/clis/1688/shared.d.ts +112 -0
  65. package/dist/clis/1688/shared.js +514 -0
  66. package/dist/clis/1688/shared.test.d.ts +1 -0
  67. package/dist/clis/1688/shared.test.js +57 -0
  68. package/dist/clis/1688/store.d.ts +45 -0
  69. package/dist/clis/1688/store.js +226 -0
  70. package/dist/clis/1688/store.test.d.ts +1 -0
  71. package/dist/clis/1688/store.test.js +62 -0
  72. package/dist/clis/amazon/bestsellers.d.ts +0 -20
  73. package/dist/clis/amazon/bestsellers.js +6 -129
  74. package/dist/clis/amazon/bestsellers.test.js +12 -3
  75. package/dist/clis/amazon/movers-shakers.d.ts +1 -0
  76. package/dist/clis/amazon/movers-shakers.js +7 -0
  77. package/dist/clis/amazon/new-releases.d.ts +1 -0
  78. package/dist/clis/amazon/new-releases.js +7 -0
  79. package/dist/clis/amazon/rankings.d.ts +59 -0
  80. package/dist/clis/amazon/rankings.js +226 -0
  81. package/dist/clis/amazon/rankings.test.d.ts +1 -0
  82. package/dist/clis/amazon/rankings.test.js +41 -0
  83. package/dist/clis/amazon/shared.d.ts +11 -0
  84. package/dist/clis/amazon/shared.js +121 -11
  85. package/dist/clis/amazon/shared.test.js +11 -0
  86. package/dist/clis/bilibili/comments.js +2 -2
  87. package/dist/clis/bilibili/comments.test.js +3 -2
  88. package/dist/clis/bilibili/download.js +2 -1
  89. package/dist/clis/bilibili/subtitle.js +4 -3
  90. package/dist/clis/bilibili/subtitle.test.js +2 -1
  91. package/dist/clis/bilibili/utils.d.ts +5 -0
  92. package/dist/clis/bilibili/utils.js +30 -0
  93. package/dist/clis/bilibili/utils.test.d.ts +1 -0
  94. package/dist/clis/bilibili/utils.test.js +17 -0
  95. package/dist/clis/douban/marks.js +1 -1
  96. package/dist/clis/douban/subject.yaml +50 -19
  97. package/dist/clis/doubao/utils.js +32 -12
  98. package/dist/clis/douyin/_shared/browser-fetch.test.js +0 -1
  99. package/dist/clis/douyin/_shared/transcode.test.js +0 -2
  100. package/dist/clis/douyin/draft.test.js +0 -2
  101. package/dist/clis/facebook/search.test.js +0 -2
  102. package/dist/clis/gemini/ask.js +9 -3
  103. package/dist/clis/gemini/ask.test.d.ts +1 -0
  104. package/dist/clis/gemini/ask.test.js +100 -0
  105. package/dist/clis/gemini/reply-state.test.d.ts +1 -0
  106. package/dist/clis/gemini/reply-state.test.js +641 -0
  107. package/dist/clis/gemini/utils.d.ts +44 -1
  108. package/dist/clis/gemini/utils.js +528 -61
  109. package/dist/clis/gemini/utils.test.js +149 -2
  110. package/dist/clis/hupu/detail.d.ts +1 -0
  111. package/dist/clis/hupu/detail.js +72 -0
  112. package/dist/clis/hupu/hot.yaml +43 -0
  113. package/dist/clis/hupu/like.d.ts +1 -0
  114. package/dist/clis/hupu/like.js +75 -0
  115. package/dist/clis/hupu/reply.d.ts +1 -0
  116. package/dist/clis/hupu/reply.js +71 -0
  117. package/dist/clis/hupu/search.d.ts +1 -0
  118. package/dist/clis/hupu/search.js +59 -0
  119. package/dist/clis/hupu/unlike.d.ts +1 -0
  120. package/dist/clis/hupu/unlike.js +75 -0
  121. package/dist/clis/hupu/utils.d.ts +20 -0
  122. package/dist/clis/hupu/utils.js +319 -0
  123. package/dist/clis/instagram/_shared/private-publish.d.ts +138 -0
  124. package/dist/clis/instagram/_shared/private-publish.js +1030 -0
  125. package/dist/clis/instagram/_shared/private-publish.test.d.ts +1 -0
  126. package/dist/clis/instagram/_shared/private-publish.test.js +705 -0
  127. package/dist/clis/instagram/_shared/protocol-capture.d.ts +26 -0
  128. package/dist/clis/instagram/_shared/protocol-capture.js +282 -0
  129. package/dist/clis/instagram/_shared/protocol-capture.test.d.ts +1 -0
  130. package/dist/clis/instagram/_shared/protocol-capture.test.js +114 -0
  131. package/dist/clis/instagram/_shared/runtime-info.d.ts +9 -0
  132. package/dist/clis/instagram/_shared/runtime-info.js +81 -0
  133. package/dist/clis/instagram/note.d.ts +1 -0
  134. package/dist/clis/instagram/note.js +222 -0
  135. package/dist/clis/instagram/note.test.d.ts +1 -0
  136. package/dist/clis/instagram/note.test.js +81 -0
  137. package/dist/clis/instagram/post.d.ts +4 -0
  138. package/dist/clis/instagram/post.js +1496 -0
  139. package/dist/clis/instagram/post.test.d.ts +1 -0
  140. package/dist/clis/instagram/post.test.js +1647 -0
  141. package/dist/clis/instagram/reel.d.ts +1 -0
  142. package/dist/clis/instagram/reel.js +826 -0
  143. package/dist/clis/instagram/reel.test.d.ts +1 -0
  144. package/dist/clis/instagram/reel.test.js +167 -0
  145. package/dist/clis/instagram/story.d.ts +1 -0
  146. package/dist/clis/instagram/story.js +115 -0
  147. package/dist/clis/instagram/story.test.d.ts +1 -0
  148. package/dist/clis/instagram/story.test.js +167 -0
  149. package/dist/clis/sinafinance/stock-rank.d.ts +4 -0
  150. package/dist/clis/sinafinance/stock-rank.js +65 -0
  151. package/dist/clis/substack/utils.test.js +0 -2
  152. package/dist/clis/twitter/post.js +72 -45
  153. package/dist/clis/twitter/post.test.d.ts +1 -0
  154. package/dist/clis/twitter/post.test.js +116 -0
  155. package/dist/clis/twitter/reply.d.ts +12 -0
  156. package/dist/clis/twitter/reply.js +257 -35
  157. package/dist/clis/twitter/reply.test.d.ts +1 -0
  158. package/dist/clis/twitter/reply.test.js +151 -0
  159. package/dist/clis/xianyu/chat.d.ts +7 -0
  160. package/dist/clis/xianyu/chat.js +146 -0
  161. package/dist/clis/xianyu/chat.test.d.ts +1 -0
  162. package/dist/clis/xianyu/chat.test.js +15 -0
  163. package/dist/clis/xianyu/item.d.ts +7 -0
  164. package/dist/clis/xianyu/item.js +152 -0
  165. package/dist/clis/xianyu/item.test.d.ts +1 -0
  166. package/dist/clis/xianyu/item.test.js +56 -0
  167. package/dist/clis/xianyu/search.d.ts +10 -0
  168. package/dist/clis/xianyu/search.js +134 -0
  169. package/dist/clis/xianyu/search.test.d.ts +1 -0
  170. package/dist/clis/xianyu/search.test.js +17 -0
  171. package/dist/clis/xianyu/utils.d.ts +1 -0
  172. package/dist/clis/xianyu/utils.js +8 -0
  173. package/dist/clis/xiaoe/catalog.yaml +129 -0
  174. package/dist/clis/xiaoe/content.yaml +43 -0
  175. package/dist/clis/xiaoe/courses.yaml +73 -0
  176. package/dist/clis/xiaoe/detail.yaml +39 -0
  177. package/dist/clis/xiaoe/play-url.yaml +124 -0
  178. package/dist/clis/xiaohongshu/comments.test.js +0 -2
  179. package/dist/clis/xiaohongshu/creator-note-detail.test.js +0 -2
  180. package/dist/clis/xiaohongshu/creator-notes.test.js +0 -2
  181. package/dist/clis/xiaohongshu/download.test.js +0 -2
  182. package/dist/clis/xiaohongshu/note.test.js +0 -2
  183. package/dist/clis/xiaohongshu/publish.test.js +0 -2
  184. package/dist/clis/xiaohongshu/search.js +29 -20
  185. package/dist/clis/xiaohongshu/search.test.js +56 -48
  186. package/dist/clis/yuanbao/ask.d.ts +21 -0
  187. package/dist/clis/yuanbao/ask.js +427 -0
  188. package/dist/clis/yuanbao/ask.test.d.ts +1 -0
  189. package/dist/clis/yuanbao/ask.test.js +124 -0
  190. package/dist/clis/yuanbao/new.d.ts +1 -0
  191. package/dist/clis/yuanbao/new.js +70 -0
  192. package/dist/clis/yuanbao/new.test.d.ts +1 -0
  193. package/dist/clis/yuanbao/new.test.js +30 -0
  194. package/dist/clis/yuanbao/shared.d.ts +13 -0
  195. package/dist/clis/yuanbao/shared.js +49 -0
  196. package/dist/clis/zhihu/question.js +30 -19
  197. package/dist/clis/zhihu/question.test.js +34 -16
  198. package/dist/commanderAdapter.js +8 -4
  199. package/dist/commanderAdapter.test.js +42 -0
  200. package/dist/completion.js +3 -1
  201. package/dist/completion.test.d.ts +1 -0
  202. package/dist/completion.test.js +23 -0
  203. package/dist/doctor.js +1 -1
  204. package/dist/electron-apps.d.ts +2 -0
  205. package/dist/electron-apps.js +7 -1
  206. package/dist/errors.js +1 -1
  207. package/dist/execution.js +25 -35
  208. package/dist/explore.js +1 -1
  209. package/dist/launcher.d.ts +4 -0
  210. package/dist/launcher.js +64 -8
  211. package/dist/launcher.test.js +88 -7
  212. package/dist/output.d.ts +2 -0
  213. package/dist/output.js +10 -1
  214. package/dist/output.test.d.ts +0 -3
  215. package/dist/output.test.js +59 -92
  216. package/dist/pipeline/executor.test.js +0 -2
  217. package/dist/pipeline/steps/download.test.js +0 -2
  218. package/dist/registry.d.ts +2 -0
  219. package/dist/serialization.d.ts +1 -0
  220. package/dist/serialization.js +1 -0
  221. package/dist/types.d.ts +9 -2
  222. package/docs/.vitepress/config.mts +4 -0
  223. package/docs/adapters/browser/1688.md +52 -0
  224. package/docs/adapters/browser/36kr.md +2 -1
  225. package/docs/adapters/browser/doubao.md +5 -1
  226. package/docs/adapters/browser/hupu.md +53 -0
  227. package/docs/adapters/browser/sinafinance.md +32 -2
  228. package/docs/adapters/browser/weibo.md +6 -1
  229. package/docs/adapters/browser/wikipedia.md +2 -0
  230. package/docs/adapters/browser/xianyu.md +42 -0
  231. package/docs/adapters/browser/xiaoe.md +44 -0
  232. package/docs/adapters/browser/yuanbao.md +64 -0
  233. package/docs/adapters/index.md +14 -5
  234. package/docs/comparison.md +1 -1
  235. package/docs/developer/ai-workflow.md +2 -2
  236. package/docs/developer/contributing.md +1 -1
  237. package/docs/developer/testing.md +2 -0
  238. package/docs/guide/plugins.md +1 -0
  239. package/docs/guide/troubleshooting.md +11 -0
  240. package/docs/superpowers/specs/2026-04-03-v2ex-autoresearch-design.md +41 -0
  241. package/docs/zh/guide/plugins.md +1 -0
  242. package/extension/dist/background.js +1127 -0
  243. package/extension/src/background.test.ts +39 -0
  244. package/extension/src/background.ts +223 -34
  245. package/extension/src/cdp.ts +194 -4
  246. package/extension/src/protocol.ts +22 -1
  247. package/package.json +3 -2
  248. package/scripts/postinstall.js +1 -1
  249. package/skills/opencli-explorer/SKILL.md +1 -1
  250. package/skills/opencli-oneshot/SKILL.md +2 -2
  251. package/skills/opencli-operate/SKILL.md +120 -27
  252. package/skills/opencli-usage/SKILL.md +31 -20
  253. package/skills/opencli-usage/browser.md +114 -16
  254. package/skills/opencli-usage/public-api.md +32 -3
  255. package/skills/smart-search/SKILL.md +156 -0
  256. package/skills/smart-search/references/sources-ai.md +74 -0
  257. package/skills/smart-search/references/sources-info.md +43 -0
  258. package/skills/smart-search/references/sources-media.md +50 -0
  259. package/skills/smart-search/references/sources-other.md +42 -0
  260. package/skills/smart-search/references/sources-shopping.md +31 -0
  261. package/skills/smart-search/references/sources-social.md +51 -0
  262. package/skills/smart-search/references/sources-tech.md +42 -0
  263. package/skills/smart-search/references/sources-travel.md +20 -0
  264. package/src/browser/base-page.ts +41 -6
  265. package/src/browser/bridge.ts +11 -8
  266. package/src/browser/cdp.ts +1 -8
  267. package/src/browser/daemon-client.ts +11 -1
  268. package/src/browser/dom-helpers.ts +43 -31
  269. package/src/browser/dom-snapshot.ts +23 -1
  270. package/src/browser/page.ts +115 -31
  271. package/src/browser.test.ts +1 -1
  272. package/src/build-manifest.ts +2 -0
  273. package/src/cli.test.ts +133 -0
  274. package/src/cli.ts +73 -11
  275. package/src/clis/1688/item.test.ts +69 -0
  276. package/src/clis/1688/item.ts +282 -0
  277. package/src/clis/1688/search.test.ts +81 -0
  278. package/src/clis/1688/search.ts +402 -0
  279. package/src/clis/1688/shared.test.ts +75 -0
  280. package/src/clis/1688/shared.ts +623 -0
  281. package/src/clis/1688/store.test.ts +69 -0
  282. package/src/clis/1688/store.ts +300 -0
  283. package/src/clis/amazon/bestsellers.test.ts +12 -3
  284. package/src/clis/amazon/bestsellers.ts +6 -178
  285. package/src/clis/amazon/movers-shakers.ts +8 -0
  286. package/src/clis/amazon/new-releases.ts +8 -0
  287. package/src/clis/amazon/rankings.test.ts +47 -0
  288. package/src/clis/amazon/rankings.ts +312 -0
  289. package/src/clis/amazon/shared.test.ts +16 -0
  290. package/src/clis/amazon/shared.ts +134 -12
  291. package/src/clis/bilibili/comments.test.ts +4 -3
  292. package/src/clis/bilibili/comments.ts +2 -2
  293. package/src/clis/bilibili/download.ts +2 -1
  294. package/src/clis/bilibili/subtitle.test.ts +2 -1
  295. package/src/clis/bilibili/subtitle.ts +4 -3
  296. package/src/clis/bilibili/utils.test.ts +21 -0
  297. package/src/clis/bilibili/utils.ts +27 -0
  298. package/src/clis/douban/marks.ts +1 -1
  299. package/src/clis/douban/subject.yaml +50 -19
  300. package/src/clis/doubao/utils.ts +32 -12
  301. package/src/clis/douyin/_shared/browser-fetch.test.ts +0 -1
  302. package/src/clis/douyin/_shared/transcode.test.ts +0 -2
  303. package/src/clis/douyin/draft.test.ts +0 -2
  304. package/src/clis/facebook/search.test.ts +0 -2
  305. package/src/clis/gemini/ask.test.ts +116 -0
  306. package/src/clis/gemini/ask.ts +10 -3
  307. package/src/clis/gemini/reply-state.test.ts +708 -0
  308. package/src/clis/gemini/utils.test.ts +184 -2
  309. package/src/clis/gemini/utils.ts +588 -60
  310. package/src/clis/hupu/detail.ts +126 -0
  311. package/src/clis/hupu/hot.yaml +43 -0
  312. package/src/clis/hupu/like.ts +76 -0
  313. package/src/clis/hupu/reply.ts +76 -0
  314. package/src/clis/hupu/search.ts +95 -0
  315. package/src/clis/hupu/unlike.ts +76 -0
  316. package/src/clis/hupu/utils.ts +381 -0
  317. package/src/clis/instagram/_shared/private-publish.test.ts +827 -0
  318. package/src/clis/instagram/_shared/private-publish.ts +1303 -0
  319. package/src/clis/instagram/_shared/protocol-capture.test.ts +148 -0
  320. package/src/clis/instagram/_shared/protocol-capture.ts +321 -0
  321. package/src/clis/instagram/_shared/runtime-info.ts +91 -0
  322. package/src/clis/instagram/note.test.ts +96 -0
  323. package/src/clis/instagram/note.ts +254 -0
  324. package/src/clis/instagram/post.test.ts +1716 -0
  325. package/src/clis/instagram/post.ts +1620 -0
  326. package/src/clis/instagram/reel.test.ts +191 -0
  327. package/src/clis/instagram/reel.ts +886 -0
  328. package/src/clis/instagram/story.test.ts +191 -0
  329. package/src/clis/instagram/story.ts +151 -0
  330. package/src/clis/sinafinance/stock-rank.ts +68 -0
  331. package/src/clis/substack/utils.test.ts +0 -2
  332. package/src/clis/twitter/post.test.ts +157 -0
  333. package/src/clis/twitter/post.ts +82 -48
  334. package/src/clis/twitter/reply.test.ts +177 -0
  335. package/src/clis/twitter/reply.ts +285 -39
  336. package/src/clis/xianyu/chat.test.ts +20 -0
  337. package/src/clis/xianyu/chat.ts +175 -0
  338. package/src/clis/xianyu/item.test.ts +67 -0
  339. package/src/clis/xianyu/item.ts +172 -0
  340. package/src/clis/xianyu/search.test.ts +22 -0
  341. package/src/clis/xianyu/search.ts +151 -0
  342. package/src/clis/xianyu/utils.ts +9 -0
  343. package/src/clis/xiaoe/catalog.yaml +129 -0
  344. package/src/clis/xiaoe/content.yaml +43 -0
  345. package/src/clis/xiaoe/courses.yaml +73 -0
  346. package/src/clis/xiaoe/detail.yaml +39 -0
  347. package/src/clis/xiaoe/play-url.yaml +124 -0
  348. package/src/clis/xiaohongshu/comments.test.ts +0 -2
  349. package/src/clis/xiaohongshu/creator-note-detail.test.ts +0 -2
  350. package/src/clis/xiaohongshu/creator-notes.test.ts +0 -2
  351. package/src/clis/xiaohongshu/download.test.ts +0 -2
  352. package/src/clis/xiaohongshu/note.test.ts +0 -2
  353. package/src/clis/xiaohongshu/publish.test.ts +0 -2
  354. package/src/clis/xiaohongshu/search.test.ts +59 -48
  355. package/src/clis/xiaohongshu/search.ts +31 -21
  356. package/src/clis/yuanbao/ask.test.ts +156 -0
  357. package/src/clis/yuanbao/ask.ts +522 -0
  358. package/src/clis/yuanbao/new.test.ts +36 -0
  359. package/src/clis/yuanbao/new.ts +81 -0
  360. package/src/clis/yuanbao/shared.ts +57 -0
  361. package/src/clis/zhihu/question.test.ts +42 -17
  362. package/src/clis/zhihu/question.ts +31 -26
  363. package/src/commanderAdapter.test.ts +51 -0
  364. package/src/commanderAdapter.ts +8 -4
  365. package/src/completion.test.ts +30 -0
  366. package/src/completion.ts +3 -1
  367. package/src/doctor.ts +1 -1
  368. package/src/electron-apps.ts +9 -1
  369. package/src/errors.ts +1 -1
  370. package/src/execution.ts +26 -30
  371. package/src/explore.ts +1 -1
  372. package/src/launcher.test.ts +121 -7
  373. package/src/launcher.ts +87 -9
  374. package/src/output.test.ts +50 -90
  375. package/src/output.ts +10 -1
  376. package/src/pipeline/executor.test.ts +0 -2
  377. package/src/pipeline/steps/download.test.ts +0 -2
  378. package/src/registry.ts +2 -0
  379. package/src/serialization.ts +2 -0
  380. package/src/types.ts +9 -2
  381. package/tests/e2e/browser-auth.test.ts +9 -0
  382. package/CLI-EXPLORER.md +0 -724
  383. package/CLI-ONESHOT.md +0 -216
  384. package/SKILL.md +0 -59
@@ -1,4 +1,93 @@
1
1
  [
2
+ {
3
+ "site": "1688",
4
+ "name": "item",
5
+ "description": "1688 商品详情(公开商品字段、价格阶梯、卖家基础信息)",
6
+ "domain": "www.1688.com",
7
+ "strategy": "cookie",
8
+ "browser": true,
9
+ "args": [
10
+ {
11
+ "name": "input",
12
+ "type": "str",
13
+ "required": true,
14
+ "positional": true,
15
+ "help": "1688 商品 URL 或 offer ID(如 887904326744)"
16
+ }
17
+ ],
18
+ "columns": [
19
+ "offer_id",
20
+ "title",
21
+ "price_text",
22
+ "moq_text",
23
+ "seller_name",
24
+ "origin_place"
25
+ ],
26
+ "type": "ts",
27
+ "modulePath": "1688/item.js",
28
+ "navigateBefore": false
29
+ },
30
+ {
31
+ "site": "1688",
32
+ "name": "search",
33
+ "description": "1688 商品搜索(结果候选、卖家链接、价格/MOQ/销量文本)",
34
+ "domain": "www.1688.com",
35
+ "strategy": "cookie",
36
+ "browser": true,
37
+ "args": [
38
+ {
39
+ "name": "query",
40
+ "type": "str",
41
+ "required": true,
42
+ "positional": true,
43
+ "help": "搜索关键词,如 \"置物架\""
44
+ },
45
+ {
46
+ "name": "limit",
47
+ "type": "int",
48
+ "default": 20,
49
+ "required": false,
50
+ "help": "结果数量上限(默认 20,最大 100)"
51
+ }
52
+ ],
53
+ "columns": [
54
+ "rank",
55
+ "title",
56
+ "price_text",
57
+ "moq_text",
58
+ "seller_name",
59
+ "location"
60
+ ],
61
+ "type": "ts",
62
+ "modulePath": "1688/search.js",
63
+ "navigateBefore": false
64
+ },
65
+ {
66
+ "site": "1688",
67
+ "name": "store",
68
+ "description": "1688 店铺/供应商公开信息(联系方式、主营、入驻年限、公开服务信号)",
69
+ "domain": "www.1688.com",
70
+ "strategy": "cookie",
71
+ "browser": true,
72
+ "args": [
73
+ {
74
+ "name": "input",
75
+ "type": "str",
76
+ "required": true,
77
+ "positional": true,
78
+ "help": "1688 店铺 URL 或 member ID(如 b2b-22154705262941f196)"
79
+ }
80
+ ],
81
+ "columns": [
82
+ "store_name",
83
+ "years_on_platform_text",
84
+ "location",
85
+ "return_rate_text"
86
+ ],
87
+ "type": "ts",
88
+ "modulePath": "1688/store.js",
89
+ "navigateBefore": false
90
+ },
2
91
  {
3
92
  "site": "36kr",
4
93
  "name": "article",
@@ -124,7 +213,7 @@
124
213
  "type": "str",
125
214
  "required": false,
126
215
  "positional": true,
127
- "help": "Best sellers URL or /zgbs path. Omit to use the root Best Sellers page."
216
+ "help": "Ranking URL or supported Amazon path. Omit to use the list root."
128
217
  },
129
218
  {
130
219
  "name": "limit",
@@ -135,6 +224,7 @@
135
224
  }
136
225
  ],
137
226
  "columns": [
227
+ "list_type",
138
228
  "rank",
139
229
  "asin",
140
230
  "title",
@@ -178,6 +268,78 @@
178
268
  "modulePath": "amazon/discussion.js",
179
269
  "navigateBefore": false
180
270
  },
271
+ {
272
+ "site": "amazon",
273
+ "name": "movers-shakers",
274
+ "description": "Amazon Movers & Shakers pages for short-term growth signals",
275
+ "domain": "amazon.com",
276
+ "strategy": "cookie",
277
+ "browser": true,
278
+ "args": [
279
+ {
280
+ "name": "input",
281
+ "type": "str",
282
+ "required": false,
283
+ "positional": true,
284
+ "help": "Ranking URL or supported Amazon path. Omit to use the list root."
285
+ },
286
+ {
287
+ "name": "limit",
288
+ "type": "int",
289
+ "default": 100,
290
+ "required": false,
291
+ "help": "Maximum number of ranked items to return (default 100)"
292
+ }
293
+ ],
294
+ "columns": [
295
+ "list_type",
296
+ "rank",
297
+ "asin",
298
+ "title",
299
+ "price_text",
300
+ "rating_value",
301
+ "review_count"
302
+ ],
303
+ "type": "ts",
304
+ "modulePath": "amazon/movers-shakers.js",
305
+ "navigateBefore": false
306
+ },
307
+ {
308
+ "site": "amazon",
309
+ "name": "new-releases",
310
+ "description": "Amazon New Releases pages for early momentum discovery",
311
+ "domain": "amazon.com",
312
+ "strategy": "cookie",
313
+ "browser": true,
314
+ "args": [
315
+ {
316
+ "name": "input",
317
+ "type": "str",
318
+ "required": false,
319
+ "positional": true,
320
+ "help": "Ranking URL or supported Amazon path. Omit to use the list root."
321
+ },
322
+ {
323
+ "name": "limit",
324
+ "type": "int",
325
+ "default": 100,
326
+ "required": false,
327
+ "help": "Maximum number of ranked items to return (default 100)"
328
+ }
329
+ ],
330
+ "columns": [
331
+ "list_type",
332
+ "rank",
333
+ "asin",
334
+ "title",
335
+ "price_text",
336
+ "rating_value",
337
+ "review_count"
338
+ ],
339
+ "type": "ts",
340
+ "modulePath": "amazon/new-releases.js",
341
+ "navigateBefore": false
342
+ },
181
343
  {
182
344
  "site": "amazon",
183
345
  "name": "offer",
@@ -4093,6 +4255,8 @@
4093
4255
  "genres",
4094
4256
  "directors",
4095
4257
  "casts",
4258
+ "country",
4259
+ "duration",
4096
4260
  "summary",
4097
4261
  "url"
4098
4262
  ],
@@ -4101,7 +4265,7 @@
4101
4265
  "navigate": "https://movie.douban.com/subject/${{ args.id }}"
4102
4266
  },
4103
4267
  {
4104
- "evaluate": "(async () => {\n const id = '${{ args.id }}';\n \n // Wait for page to load\n await new Promise(r => setTimeout(r, 2000));\n \n // Extract title\n const titleEl = document.querySelector('span[property=\"v:itemreviewed\"]');\n const title = titleEl?.textContent?.trim() || '';\n \n // Extract original title\n const ogTitleEl = document.querySelector('span[property=\"v:originalTitle\"]');\n const originalTitle = ogTitleEl?.textContent?.trim() || '';\n \n // Extract year\n const yearEl = document.querySelector('.year');\n const year = yearEl?.textContent?.trim() || '';\n \n // Extract rating\n const ratingEl = document.querySelector('strong[property=\"v:average\"]');\n const rating = parseFloat(ratingEl?.textContent || '0');\n \n // Extract rating count\n const ratingCountEl = document.querySelector('span[property=\"v:votes\"]');\n const ratingCount = parseInt(ratingCountEl?.textContent || '0', 10);\n \n // Extract genres\n const genreEls = document.querySelectorAll('span[property=\"v:genre\"]');\n const genres = Array.from(genreEls).map(el => el.textContent?.trim()).filter(Boolean).join(',');\n \n // Extract directors\n const directorEls = document.querySelectorAll('a[rel=\"v:directedBy\"]');\n const directors = Array.from(directorEls).map(el => el.textContent?.trim()).filter(Boolean).join(',');\n \n // Extract casts\n const castEls = document.querySelectorAll('a[rel=\"v:starring\"]');\n const casts = Array.from(castEls).slice(0, 5).map(el => el.textContent?.trim()).filter(Boolean).join(',');\n \n // Extract summary\n const summaryEl = document.querySelector('span[property=\"v:summary\"]');\n const summary = summaryEl?.textContent?.trim() || '';\n \n return [{\n id,\n title,\n originalTitle,\n year,\n rating,\n ratingCount,\n genres,\n directors,\n casts,\n summary: summary.substring(0, 200),\n url: `https://movie.douban.com/subject/${id}`\n }];\n})()\n"
4268
+ "evaluate": "(async () => {\n const id = '${{ args.id }}';\n\n // Wait for page to load\n await new Promise(r => setTimeout(r, 2000));\n\n // Extract title - v:itemreviewed contains \"中文名 OriginalName\"\n const titleEl = document.querySelector('span[property=\"v:itemreviewed\"]');\n const fullTitle = titleEl?.textContent?.trim() || '';\n\n // Split title and originalTitle\n // Douban format: \"中文名 OriginalName\" - split by first space that separates CJK from non-CJK\n let title = fullTitle;\n let originalTitle = '';\n const titleMatch = fullTitle.match(/^([\\u4e00-\\u9fff\\u3000-\\u303f\\uff00-\\uffef]+(?:\\s*[\\u4e00-\\u9fff\\u3000-\\u303f\\uff00-\\uffef·::!?]+)*)\\s+(.+)$/);\n if (titleMatch) {\n title = titleMatch[1].trim();\n originalTitle = titleMatch[2].trim();\n }\n\n // Extract year\n const yearEl = document.querySelector('.year');\n const year = yearEl?.textContent?.trim().replace(/[()()]/g, '') || '';\n\n // Extract rating\n const ratingEl = document.querySelector('strong[property=\"v:average\"]');\n const rating = parseFloat(ratingEl?.textContent || '0');\n\n // Extract rating count\n const ratingCountEl = document.querySelector('span[property=\"v:votes\"]');\n const ratingCount = parseInt(ratingCountEl?.textContent || '0', 10);\n\n // Extract genres\n const genreEls = document.querySelectorAll('span[property=\"v:genre\"]');\n const genres = Array.from(genreEls).map(el => el.textContent?.trim()).filter(Boolean).join(',');\n\n // Extract directors\n const directorEls = document.querySelectorAll('a[rel=\"v:directedBy\"]');\n const directors = Array.from(directorEls).map(el => el.textContent?.trim()).filter(Boolean).join(',');\n\n // Extract casts\n const castEls = document.querySelectorAll('a[rel=\"v:starring\"]');\n const casts = Array.from(castEls).slice(0, 5).map(el => el.textContent?.trim()).filter(Boolean);\n\n // Extract info section for country and duration\n const infoEl = document.querySelector('#info');\n const infoText = infoEl?.textContent || '';\n\n // Extract country/region from #info as list\n let country = [];\n const countryMatch = infoText.match(/制片国家\\/地区:\\s*([^\\n]+)/);\n if (countryMatch) {\n country = countryMatch[1].trim().split(/\\s*\\/\\s*/).filter(Boolean);\n }\n\n // Extract duration from #info as pure number in min\n const durationEl = document.querySelector('span[property=\"v:runtime\"]');\n let durationRaw = durationEl?.textContent?.trim() || '';\n if (!durationRaw) {\n const durationMatch = infoText.match(/片长:\\s*([^\\n]+)/);\n if (durationMatch) {\n durationRaw = durationMatch[1].trim();\n }\n }\n const durationNumMatch = durationRaw.match(/(\\d+)/);\n const duration = durationNumMatch ? parseInt(durationNumMatch[1], 10) : null;\n\n // Extract summary\n const summaryEl = document.querySelector('span[property=\"v:summary\"]');\n const summary = summaryEl?.textContent?.trim() || '';\n\n return [{\n id,\n title,\n originalTitle,\n year,\n rating,\n ratingCount,\n genres,\n directors,\n casts,\n country,\n duration,\n summary: summary.substring(0, 200),\n url: `https://movie.douban.com/subject/${id}`\n }];\n})()\n"
4105
4269
  }
4106
4270
  ],
4107
4271
  "type": "yaml"
@@ -5445,7 +5609,7 @@
5445
5609
  {
5446
5610
  "name": "op",
5447
5611
  "type": "str",
5448
- "default": "/Users/jakevin/tmp/gemini-images",
5612
+ "default": "/home/runner/tmp/gemini-images",
5449
5613
  "required": false,
5450
5614
  "help": "Output directory shorthand"
5451
5615
  },
@@ -6195,136 +6359,386 @@
6195
6359
  "modulePath": "hf/top.js"
6196
6360
  },
6197
6361
  {
6198
- "site": "imdb",
6199
- "name": "person",
6200
- "description": "Get actor or director info",
6201
- "domain": "www.imdb.com",
6362
+ "site": "hupu",
6363
+ "name": "detail",
6364
+ "description": "获取虎扑帖子详情 (使用Next.js JSON数据)",
6365
+ "domain": "bbs.hupu.com",
6202
6366
  "strategy": "public",
6203
6367
  "browser": true,
6204
6368
  "args": [
6205
6369
  {
6206
- "name": "id",
6370
+ "name": "tid",
6207
6371
  "type": "str",
6208
6372
  "required": true,
6209
6373
  "positional": true,
6210
- "help": "IMDb person ID (nm0634240) or URL"
6374
+ "help": "帖子ID(9位数字)"
6211
6375
  },
6212
6376
  {
6213
- "name": "limit",
6214
- "type": "int",
6215
- "default": 10,
6377
+ "name": "replies",
6378
+ "type": "boolean",
6379
+ "default": false,
6216
6380
  "required": false,
6217
- "help": "Max filmography entries"
6381
+ "help": "是否包含热门回复"
6218
6382
  }
6219
6383
  ],
6220
6384
  "columns": [
6221
- "field",
6222
- "value"
6385
+ "title",
6386
+ "author",
6387
+ "content",
6388
+ "replies",
6389
+ "lights",
6390
+ "url"
6223
6391
  ],
6224
6392
  "type": "ts",
6225
- "modulePath": "imdb/person.js"
6393
+ "modulePath": "hupu/detail.js",
6394
+ "navigateBefore": false
6226
6395
  },
6227
6396
  {
6228
- "site": "imdb",
6229
- "name": "reviews",
6230
- "description": "Get user reviews for a movie or TV show",
6231
- "domain": "www.imdb.com",
6232
- "strategy": "public",
6397
+ "site": "hupu",
6398
+ "name": "hot",
6399
+ "description": "虎扑热门帖子",
6400
+ "domain": "bbs.hupu.com",
6401
+ "strategy": "cookie",
6233
6402
  "browser": true,
6234
6403
  "args": [
6235
- {
6236
- "name": "id",
6237
- "type": "str",
6238
- "required": true,
6239
- "positional": true,
6240
- "help": "IMDb title ID (tt1375666) or URL"
6241
- },
6242
6404
  {
6243
6405
  "name": "limit",
6244
6406
  "type": "int",
6245
- "default": 10,
6407
+ "default": 20,
6246
6408
  "required": false,
6247
- "help": "Number of reviews"
6409
+ "positional": false,
6410
+ "help": "Number of hot posts"
6248
6411
  }
6249
6412
  ],
6250
6413
  "columns": [
6251
6414
  "rank",
6252
6415
  "title",
6253
- "rating",
6254
- "author",
6255
- "date",
6256
- "text"
6416
+ "url"
6257
6417
  ],
6258
- "type": "ts",
6259
- "modulePath": "imdb/reviews.js"
6418
+ "pipeline": [
6419
+ {
6420
+ "navigate": "https://bbs.hupu.com/"
6421
+ },
6422
+ {
6423
+ "evaluate": "(async () => {\n // 从HTML中提取帖子信息(适配新的HTML结构)\n const html = document.documentElement.outerHTML;\n const posts = [];\n\n // 匹配当前虎扑页面结构的正则表达式\n // 结构: <a href=\"/638249612.html\"...><span class=\"t-title\">标题</span></a>\n const regex = /<a[^>]*href=\"\\/(\\d{9})\\.html\"[^>]*><span[^>]*class=\"t-title\"[^>]*>([^<]+)<\\/span><\\/a>/g;\n let match;\n\n while ((match = regex.exec(html)) !== null && posts.length < ${{ args.limit }}) {\n posts.push({\n tid: match[1],\n title: match[2].trim()\n });\n }\n\n return posts;\n})()\n"
6424
+ },
6425
+ {
6426
+ "map": {
6427
+ "rank": "${{ index + 1 }}",
6428
+ "title": "${{ item.title }}",
6429
+ "url": "https://bbs.hupu.com/${{ item.tid }}.html"
6430
+ }
6431
+ },
6432
+ {
6433
+ "limit": "${{ args.limit }}"
6434
+ }
6435
+ ],
6436
+ "type": "yaml"
6260
6437
  },
6261
6438
  {
6262
- "site": "imdb",
6263
- "name": "search",
6264
- "description": "Search IMDb for movies, TV shows, and people",
6265
- "domain": "www.imdb.com",
6266
- "strategy": "public",
6439
+ "site": "hupu",
6440
+ "name": "like",
6441
+ "description": "点赞虎扑回复 (需要登录)",
6442
+ "domain": "bbs.hupu.com",
6443
+ "strategy": "cookie",
6267
6444
  "browser": true,
6268
6445
  "args": [
6269
6446
  {
6270
- "name": "query",
6447
+ "name": "tid",
6271
6448
  "type": "str",
6272
6449
  "required": true,
6273
6450
  "positional": true,
6274
- "help": "Search query"
6451
+ "help": "帖子ID(9位数字)"
6275
6452
  },
6276
6453
  {
6277
- "name": "limit",
6278
- "type": "int",
6279
- "default": 20,
6280
- "required": false,
6281
- "help": "Number of results"
6454
+ "name": "pid",
6455
+ "type": "str",
6456
+ "required": true,
6457
+ "positional": true,
6458
+ "help": "回复ID"
6459
+ },
6460
+ {
6461
+ "name": "fid",
6462
+ "type": "str",
6463
+ "required": true,
6464
+ "help": "板块ID(如278汽车区)"
6282
6465
  }
6283
6466
  ],
6284
6467
  "columns": [
6285
- "rank",
6286
- "id",
6287
- "title",
6288
- "year",
6289
- "type",
6290
- "url"
6468
+ "status",
6469
+ "message"
6291
6470
  ],
6292
6471
  "type": "ts",
6293
- "modulePath": "imdb/search.js"
6472
+ "modulePath": "hupu/like.js",
6473
+ "navigateBefore": false
6294
6474
  },
6295
6475
  {
6296
- "site": "imdb",
6297
- "name": "title",
6298
- "description": "Get movie or TV show details",
6299
- "domain": "www.imdb.com",
6300
- "strategy": "public",
6476
+ "site": "hupu",
6477
+ "name": "reply",
6478
+ "description": "回复虎扑帖子 (需要登录)",
6479
+ "domain": "bbs.hupu.com",
6480
+ "strategy": "cookie",
6301
6481
  "browser": true,
6302
6482
  "args": [
6303
6483
  {
6304
- "name": "id",
6484
+ "name": "tid",
6305
6485
  "type": "str",
6306
6486
  "required": true,
6307
6487
  "positional": true,
6308
- "help": "IMDb title ID (tt1375666) or URL"
6488
+ "help": "帖子ID(9位数字)"
6489
+ },
6490
+ {
6491
+ "name": "topic_id",
6492
+ "type": "str",
6493
+ "required": true,
6494
+ "help": "板块ID,即接口中的 topicId(如 502 篮球资讯)"
6495
+ },
6496
+ {
6497
+ "name": "text",
6498
+ "type": "str",
6499
+ "required": true,
6500
+ "positional": true,
6501
+ "help": "回复内容"
6502
+ },
6503
+ {
6504
+ "name": "quote_id",
6505
+ "type": "str",
6506
+ "required": false,
6507
+ "help": "被引用回复的 pid;填写后会以“回复某条热门回复”的方式发言"
6309
6508
  }
6310
6509
  ],
6311
6510
  "columns": [
6312
- "field",
6313
- "value"
6511
+ "status",
6512
+ "message"
6314
6513
  ],
6315
6514
  "type": "ts",
6316
- "modulePath": "imdb/title.js"
6515
+ "modulePath": "hupu/reply.js",
6516
+ "navigateBefore": false
6317
6517
  },
6318
6518
  {
6319
- "site": "imdb",
6320
- "name": "top",
6321
- "description": "IMDb Top 250 Movies",
6322
- "domain": "www.imdb.com",
6519
+ "site": "hupu",
6520
+ "name": "search",
6521
+ "description": "搜索虎扑帖子 (使用官方API)",
6522
+ "domain": "bbs.hupu.com",
6323
6523
  "strategy": "public",
6324
6524
  "browser": true,
6325
6525
  "args": [
6326
6526
  {
6327
- "name": "limit",
6527
+ "name": "query",
6528
+ "type": "str",
6529
+ "required": true,
6530
+ "positional": true,
6531
+ "help": "搜索关键词"
6532
+ },
6533
+ {
6534
+ "name": "page",
6535
+ "type": "int",
6536
+ "default": 1,
6537
+ "required": false,
6538
+ "help": "结果页码"
6539
+ },
6540
+ {
6541
+ "name": "limit",
6542
+ "type": "int",
6543
+ "default": 20,
6544
+ "required": false,
6545
+ "help": "返回结果数量"
6546
+ },
6547
+ {
6548
+ "name": "forum",
6549
+ "type": "str",
6550
+ "required": false,
6551
+ "help": "板块ID过滤 (可选)"
6552
+ },
6553
+ {
6554
+ "name": "sort",
6555
+ "type": "str",
6556
+ "default": "general",
6557
+ "required": false,
6558
+ "help": "排序方式: general/createtime/replytime/light/reply"
6559
+ }
6560
+ ],
6561
+ "columns": [
6562
+ "rank",
6563
+ "title",
6564
+ "author",
6565
+ "replies",
6566
+ "lights",
6567
+ "forum",
6568
+ "url"
6569
+ ],
6570
+ "type": "ts",
6571
+ "modulePath": "hupu/search.js",
6572
+ "navigateBefore": false
6573
+ },
6574
+ {
6575
+ "site": "hupu",
6576
+ "name": "unlike",
6577
+ "description": "取消点赞虎扑回复 (需要登录)",
6578
+ "domain": "bbs.hupu.com",
6579
+ "strategy": "cookie",
6580
+ "browser": true,
6581
+ "args": [
6582
+ {
6583
+ "name": "tid",
6584
+ "type": "str",
6585
+ "required": true,
6586
+ "positional": true,
6587
+ "help": "帖子ID(9位数字)"
6588
+ },
6589
+ {
6590
+ "name": "pid",
6591
+ "type": "str",
6592
+ "required": true,
6593
+ "positional": true,
6594
+ "help": "回复ID"
6595
+ },
6596
+ {
6597
+ "name": "fid",
6598
+ "type": "str",
6599
+ "required": true,
6600
+ "help": "板块ID(如278汽车区)"
6601
+ }
6602
+ ],
6603
+ "columns": [
6604
+ "status",
6605
+ "message"
6606
+ ],
6607
+ "type": "ts",
6608
+ "modulePath": "hupu/unlike.js",
6609
+ "navigateBefore": false
6610
+ },
6611
+ {
6612
+ "site": "imdb",
6613
+ "name": "person",
6614
+ "description": "Get actor or director info",
6615
+ "domain": "www.imdb.com",
6616
+ "strategy": "public",
6617
+ "browser": true,
6618
+ "args": [
6619
+ {
6620
+ "name": "id",
6621
+ "type": "str",
6622
+ "required": true,
6623
+ "positional": true,
6624
+ "help": "IMDb person ID (nm0634240) or URL"
6625
+ },
6626
+ {
6627
+ "name": "limit",
6628
+ "type": "int",
6629
+ "default": 10,
6630
+ "required": false,
6631
+ "help": "Max filmography entries"
6632
+ }
6633
+ ],
6634
+ "columns": [
6635
+ "field",
6636
+ "value"
6637
+ ],
6638
+ "type": "ts",
6639
+ "modulePath": "imdb/person.js"
6640
+ },
6641
+ {
6642
+ "site": "imdb",
6643
+ "name": "reviews",
6644
+ "description": "Get user reviews for a movie or TV show",
6645
+ "domain": "www.imdb.com",
6646
+ "strategy": "public",
6647
+ "browser": true,
6648
+ "args": [
6649
+ {
6650
+ "name": "id",
6651
+ "type": "str",
6652
+ "required": true,
6653
+ "positional": true,
6654
+ "help": "IMDb title ID (tt1375666) or URL"
6655
+ },
6656
+ {
6657
+ "name": "limit",
6658
+ "type": "int",
6659
+ "default": 10,
6660
+ "required": false,
6661
+ "help": "Number of reviews"
6662
+ }
6663
+ ],
6664
+ "columns": [
6665
+ "rank",
6666
+ "title",
6667
+ "rating",
6668
+ "author",
6669
+ "date",
6670
+ "text"
6671
+ ],
6672
+ "type": "ts",
6673
+ "modulePath": "imdb/reviews.js"
6674
+ },
6675
+ {
6676
+ "site": "imdb",
6677
+ "name": "search",
6678
+ "description": "Search IMDb for movies, TV shows, and people",
6679
+ "domain": "www.imdb.com",
6680
+ "strategy": "public",
6681
+ "browser": true,
6682
+ "args": [
6683
+ {
6684
+ "name": "query",
6685
+ "type": "str",
6686
+ "required": true,
6687
+ "positional": true,
6688
+ "help": "Search query"
6689
+ },
6690
+ {
6691
+ "name": "limit",
6692
+ "type": "int",
6693
+ "default": 20,
6694
+ "required": false,
6695
+ "help": "Number of results"
6696
+ }
6697
+ ],
6698
+ "columns": [
6699
+ "rank",
6700
+ "id",
6701
+ "title",
6702
+ "year",
6703
+ "type",
6704
+ "url"
6705
+ ],
6706
+ "type": "ts",
6707
+ "modulePath": "imdb/search.js"
6708
+ },
6709
+ {
6710
+ "site": "imdb",
6711
+ "name": "title",
6712
+ "description": "Get movie or TV show details",
6713
+ "domain": "www.imdb.com",
6714
+ "strategy": "public",
6715
+ "browser": true,
6716
+ "args": [
6717
+ {
6718
+ "name": "id",
6719
+ "type": "str",
6720
+ "required": true,
6721
+ "positional": true,
6722
+ "help": "IMDb title ID (tt1375666) or URL"
6723
+ }
6724
+ ],
6725
+ "columns": [
6726
+ "field",
6727
+ "value"
6728
+ ],
6729
+ "type": "ts",
6730
+ "modulePath": "imdb/title.js"
6731
+ },
6732
+ {
6733
+ "site": "imdb",
6734
+ "name": "top",
6735
+ "description": "IMDb Top 250 Movies",
6736
+ "domain": "www.imdb.com",
6737
+ "strategy": "public",
6738
+ "browser": true,
6739
+ "args": [
6740
+ {
6741
+ "name": "limit",
6328
6742
  "type": "int",
6329
6743
  "default": 20,
6330
6744
  "required": false,
@@ -6432,7 +6846,7 @@
6432
6846
  {
6433
6847
  "name": "path",
6434
6848
  "type": "str",
6435
- "default": "/Users/jakevin/Downloads/Instagram",
6849
+ "default": "/home/runner/Downloads/Instagram",
6436
6850
  "required": false,
6437
6851
  "help": "Download directory"
6438
6852
  }
@@ -6627,6 +7041,63 @@
6627
7041
  ],
6628
7042
  "type": "yaml"
6629
7043
  },
7044
+ {
7045
+ "site": "instagram",
7046
+ "name": "note",
7047
+ "description": "Publish a text Instagram note",
7048
+ "domain": "www.instagram.com",
7049
+ "strategy": "ui",
7050
+ "browser": true,
7051
+ "args": [
7052
+ {
7053
+ "name": "content",
7054
+ "type": "str",
7055
+ "required": true,
7056
+ "positional": true,
7057
+ "help": "Note text (max 60 characters)"
7058
+ }
7059
+ ],
7060
+ "columns": [
7061
+ "status",
7062
+ "detail",
7063
+ "noteId"
7064
+ ],
7065
+ "timeout": 120,
7066
+ "type": "ts",
7067
+ "modulePath": "instagram/note.js"
7068
+ },
7069
+ {
7070
+ "site": "instagram",
7071
+ "name": "post",
7072
+ "description": "Post an Instagram feed image or mixed-media carousel",
7073
+ "domain": "www.instagram.com",
7074
+ "strategy": "ui",
7075
+ "browser": true,
7076
+ "args": [
7077
+ {
7078
+ "name": "media",
7079
+ "type": "str",
7080
+ "required": false,
7081
+ "valueRequired": true,
7082
+ "help": "Comma-separated media paths (images/videos, up to 10)"
7083
+ },
7084
+ {
7085
+ "name": "content",
7086
+ "type": "str",
7087
+ "required": false,
7088
+ "positional": true,
7089
+ "help": "Caption text"
7090
+ }
7091
+ ],
7092
+ "columns": [
7093
+ "status",
7094
+ "detail",
7095
+ "url"
7096
+ ],
7097
+ "timeout": 300,
7098
+ "type": "ts",
7099
+ "modulePath": "instagram/post.js"
7100
+ },
6630
7101
  {
6631
7102
  "site": "instagram",
6632
7103
  "name": "profile",
@@ -6662,6 +7133,38 @@
6662
7133
  ],
6663
7134
  "type": "yaml"
6664
7135
  },
7136
+ {
7137
+ "site": "instagram",
7138
+ "name": "reel",
7139
+ "description": "Post an Instagram reel video",
7140
+ "domain": "www.instagram.com",
7141
+ "strategy": "ui",
7142
+ "browser": true,
7143
+ "args": [
7144
+ {
7145
+ "name": "video",
7146
+ "type": "str",
7147
+ "required": false,
7148
+ "valueRequired": true,
7149
+ "help": "Path to a single .mp4 video file"
7150
+ },
7151
+ {
7152
+ "name": "content",
7153
+ "type": "str",
7154
+ "required": false,
7155
+ "positional": true,
7156
+ "help": "Caption text"
7157
+ }
7158
+ ],
7159
+ "columns": [
7160
+ "status",
7161
+ "detail",
7162
+ "url"
7163
+ ],
7164
+ "timeout": 600,
7165
+ "type": "ts",
7166
+ "modulePath": "instagram/reel.js"
7167
+ },
6665
7168
  {
6666
7169
  "site": "instagram",
6667
7170
  "name": "save",
@@ -6778,6 +7281,31 @@
6778
7281
  ],
6779
7282
  "type": "yaml"
6780
7283
  },
7284
+ {
7285
+ "site": "instagram",
7286
+ "name": "story",
7287
+ "description": "Post a single Instagram story image or video",
7288
+ "domain": "www.instagram.com",
7289
+ "strategy": "ui",
7290
+ "browser": true,
7291
+ "args": [
7292
+ {
7293
+ "name": "media",
7294
+ "type": "str",
7295
+ "required": false,
7296
+ "valueRequired": true,
7297
+ "help": "Path to a single story image or video file"
7298
+ }
7299
+ ],
7300
+ "columns": [
7301
+ "status",
7302
+ "detail",
7303
+ "url"
7304
+ ],
7305
+ "timeout": 300,
7306
+ "type": "ts",
7307
+ "modulePath": "instagram/story.js"
7308
+ },
6781
7309
  {
6782
7310
  "site": "instagram",
6783
7311
  "name": "unfollow",
@@ -10523,7 +11051,43 @@
10523
11051
  "MarketCap"
10524
11052
  ],
10525
11053
  "type": "ts",
10526
- "modulePath": "sinafinance/stock.js"
11054
+ "modulePath": "sinafinance/stock.js"
11055
+ },
11056
+ {
11057
+ "site": "sinafinance",
11058
+ "name": "stock-rank",
11059
+ "description": "新浪财经热搜榜",
11060
+ "domain": "finance.sina.cn",
11061
+ "strategy": "cookie",
11062
+ "browser": true,
11063
+ "args": [
11064
+ {
11065
+ "name": "market",
11066
+ "type": "string",
11067
+ "default": "cn",
11068
+ "required": false,
11069
+ "help": "Market: cn (A股), hk (港股), us (美股), wh (外汇), ft (期货)",
11070
+ "choices": [
11071
+ "cn",
11072
+ "hk",
11073
+ "us",
11074
+ "wh",
11075
+ "ft"
11076
+ ]
11077
+ }
11078
+ ],
11079
+ "columns": [
11080
+ "rank",
11081
+ "name",
11082
+ "symbol",
11083
+ "market",
11084
+ "price",
11085
+ "change",
11086
+ "url"
11087
+ ],
11088
+ "type": "ts",
11089
+ "modulePath": "sinafinance/stock-rank.js",
11090
+ "navigateBefore": false
10527
11091
  },
10528
11092
  {
10529
11093
  "site": "smzdm",
@@ -12247,6 +12811,12 @@
12247
12811
  "required": true,
12248
12812
  "positional": true,
12249
12813
  "help": "The text content of the tweet"
12814
+ },
12815
+ {
12816
+ "name": "images",
12817
+ "type": "string",
12818
+ "required": false,
12819
+ "help": "Image paths, comma-separated, max 4 (jpg/png/gif/webp)"
12250
12820
  }
12251
12821
  ],
12252
12822
  "columns": [
@@ -12292,7 +12862,7 @@
12292
12862
  {
12293
12863
  "site": "twitter",
12294
12864
  "name": "reply",
12295
- "description": "Reply to a specific tweet",
12865
+ "description": "Reply to a specific tweet, optionally with a local or remote image",
12296
12866
  "domain": "x.com",
12297
12867
  "strategy": "ui",
12298
12868
  "browser": true,
@@ -12310,6 +12880,18 @@
12310
12880
  "required": true,
12311
12881
  "positional": true,
12312
12882
  "help": "The text content of your reply"
12883
+ },
12884
+ {
12885
+ "name": "image",
12886
+ "type": "str",
12887
+ "required": false,
12888
+ "help": "Optional local image path to attach to the reply"
12889
+ },
12890
+ {
12891
+ "name": "image-url",
12892
+ "type": "str",
12893
+ "required": false,
12894
+ "help": "Optional remote image URL to download and attach to the reply"
12313
12895
  }
12314
12896
  ],
12315
12897
  "columns": [
@@ -13448,23 +14030,275 @@
13448
14030
  }
13449
14031
  ],
13450
14032
  "columns": [
13451
- "rank",
14033
+ "rank",
14034
+ "title",
14035
+ "author",
14036
+ "category",
14037
+ "readingCount",
14038
+ "bookId"
14039
+ ],
14040
+ "type": "ts",
14041
+ "modulePath": "weread/ranking.js"
14042
+ },
14043
+ {
14044
+ "site": "weread",
14045
+ "name": "search",
14046
+ "description": "Search books on WeRead",
14047
+ "domain": "weread.qq.com",
14048
+ "strategy": "public",
14049
+ "browser": false,
14050
+ "args": [
14051
+ {
14052
+ "name": "query",
14053
+ "type": "str",
14054
+ "required": true,
14055
+ "positional": true,
14056
+ "help": "Search keyword"
14057
+ },
14058
+ {
14059
+ "name": "limit",
14060
+ "type": "int",
14061
+ "default": 10,
14062
+ "required": false,
14063
+ "help": "Max results"
14064
+ }
14065
+ ],
14066
+ "columns": [
14067
+ "rank",
14068
+ "title",
14069
+ "author",
14070
+ "bookId",
14071
+ "url"
14072
+ ],
14073
+ "type": "ts",
14074
+ "modulePath": "weread/search.js"
14075
+ },
14076
+ {
14077
+ "site": "weread",
14078
+ "name": "shelf",
14079
+ "description": "List books on your WeRead bookshelf",
14080
+ "domain": "weread.qq.com",
14081
+ "strategy": "cookie",
14082
+ "browser": true,
14083
+ "args": [
14084
+ {
14085
+ "name": "limit",
14086
+ "type": "int",
14087
+ "default": 20,
14088
+ "required": false,
14089
+ "help": "Max results"
14090
+ }
14091
+ ],
14092
+ "columns": [
14093
+ "title",
14094
+ "author",
14095
+ "progress",
14096
+ "bookId"
14097
+ ],
14098
+ "type": "ts",
14099
+ "modulePath": "weread/shelf.js"
14100
+ },
14101
+ {
14102
+ "site": "wikipedia",
14103
+ "name": "random",
14104
+ "description": "Get a random Wikipedia article",
14105
+ "strategy": "public",
14106
+ "browser": false,
14107
+ "args": [
14108
+ {
14109
+ "name": "lang",
14110
+ "type": "str",
14111
+ "default": "en",
14112
+ "required": false,
14113
+ "help": "Language code (e.g. en, zh, ja)"
14114
+ }
14115
+ ],
14116
+ "columns": [
14117
+ "title",
14118
+ "description",
14119
+ "extract",
14120
+ "url"
14121
+ ],
14122
+ "type": "ts",
14123
+ "modulePath": "wikipedia/random.js"
14124
+ },
14125
+ {
14126
+ "site": "wikipedia",
14127
+ "name": "search",
14128
+ "description": "Search Wikipedia articles",
14129
+ "strategy": "public",
14130
+ "browser": false,
14131
+ "args": [
14132
+ {
14133
+ "name": "query",
14134
+ "type": "str",
14135
+ "required": true,
14136
+ "positional": true,
14137
+ "help": "Search keyword"
14138
+ },
14139
+ {
14140
+ "name": "limit",
14141
+ "type": "int",
14142
+ "default": 10,
14143
+ "required": false,
14144
+ "help": "Max results"
14145
+ },
14146
+ {
14147
+ "name": "lang",
14148
+ "type": "str",
14149
+ "default": "en",
14150
+ "required": false,
14151
+ "help": "Language code (e.g. en, zh, ja)"
14152
+ }
14153
+ ],
14154
+ "columns": [
14155
+ "title",
14156
+ "snippet",
14157
+ "url"
14158
+ ],
14159
+ "type": "ts",
14160
+ "modulePath": "wikipedia/search.js"
14161
+ },
14162
+ {
14163
+ "site": "wikipedia",
14164
+ "name": "summary",
14165
+ "description": "Get Wikipedia article summary",
14166
+ "strategy": "public",
14167
+ "browser": false,
14168
+ "args": [
14169
+ {
14170
+ "name": "title",
14171
+ "type": "str",
14172
+ "required": true,
14173
+ "positional": true,
14174
+ "help": "Article title (e.g. \"Transformer (machine learning model)\")"
14175
+ },
14176
+ {
14177
+ "name": "lang",
14178
+ "type": "str",
14179
+ "default": "en",
14180
+ "required": false,
14181
+ "help": "Language code (e.g. en, zh, ja)"
14182
+ }
14183
+ ],
14184
+ "columns": [
14185
+ "title",
14186
+ "description",
14187
+ "extract",
14188
+ "url"
14189
+ ],
14190
+ "type": "ts",
14191
+ "modulePath": "wikipedia/summary.js"
14192
+ },
14193
+ {
14194
+ "site": "wikipedia",
14195
+ "name": "trending",
14196
+ "description": "Most-read Wikipedia articles (yesterday)",
14197
+ "strategy": "public",
14198
+ "browser": false,
14199
+ "args": [
14200
+ {
14201
+ "name": "limit",
14202
+ "type": "int",
14203
+ "default": 10,
14204
+ "required": false,
14205
+ "help": "Max results"
14206
+ },
14207
+ {
14208
+ "name": "lang",
14209
+ "type": "str",
14210
+ "default": "en",
14211
+ "required": false,
14212
+ "help": "Language code (e.g. en, zh, ja)"
14213
+ }
14214
+ ],
14215
+ "columns": [
14216
+ "rank",
14217
+ "title",
14218
+ "description",
14219
+ "views"
14220
+ ],
14221
+ "type": "ts",
14222
+ "modulePath": "wikipedia/trending.js"
14223
+ },
14224
+ {
14225
+ "site": "xianyu",
14226
+ "name": "chat",
14227
+ "description": "打开闲鱼聊一聊会话,并可选发送消息",
14228
+ "domain": "www.goofish.com",
14229
+ "strategy": "cookie",
14230
+ "browser": true,
14231
+ "args": [
14232
+ {
14233
+ "name": "item_id",
14234
+ "type": "str",
14235
+ "required": true,
14236
+ "positional": true,
14237
+ "help": "闲鱼商品 item_id"
14238
+ },
14239
+ {
14240
+ "name": "user_id",
14241
+ "type": "str",
14242
+ "required": true,
14243
+ "positional": true,
14244
+ "help": "聊一聊对方的 user_id / peerUserId"
14245
+ },
14246
+ {
14247
+ "name": "text",
14248
+ "type": "str",
14249
+ "required": false,
14250
+ "help": "Message to send after opening the chat"
14251
+ }
14252
+ ],
14253
+ "columns": [
14254
+ "status",
14255
+ "peer_name",
14256
+ "item_title",
14257
+ "price",
14258
+ "location",
14259
+ "message"
14260
+ ],
14261
+ "type": "ts",
14262
+ "modulePath": "xianyu/chat.js",
14263
+ "navigateBefore": false
14264
+ },
14265
+ {
14266
+ "site": "xianyu",
14267
+ "name": "item",
14268
+ "description": "查看闲鱼商品详情",
14269
+ "domain": "www.goofish.com",
14270
+ "strategy": "cookie",
14271
+ "browser": true,
14272
+ "args": [
14273
+ {
14274
+ "name": "item_id",
14275
+ "type": "str",
14276
+ "required": true,
14277
+ "positional": true,
14278
+ "help": "闲鱼商品 item_id"
14279
+ }
14280
+ ],
14281
+ "columns": [
14282
+ "item_id",
13452
14283
  "title",
13453
- "author",
13454
- "category",
13455
- "readingCount",
13456
- "bookId"
14284
+ "price",
14285
+ "condition",
14286
+ "brand",
14287
+ "location",
14288
+ "seller_name",
14289
+ "want_count"
13457
14290
  ],
13458
14291
  "type": "ts",
13459
- "modulePath": "weread/ranking.js"
14292
+ "modulePath": "xianyu/item.js",
14293
+ "navigateBefore": false
13460
14294
  },
13461
14295
  {
13462
- "site": "weread",
14296
+ "site": "xianyu",
13463
14297
  "name": "search",
13464
- "description": "Search books on WeRead",
13465
- "domain": "weread.qq.com",
13466
- "strategy": "public",
13467
- "browser": false,
14298
+ "description": "搜索闲鱼商品",
14299
+ "domain": "www.goofish.com",
14300
+ "strategy": "cookie",
14301
+ "browser": true,
13468
14302
  "args": [
13469
14303
  {
13470
14304
  "name": "query",
@@ -13476,168 +14310,223 @@
13476
14310
  {
13477
14311
  "name": "limit",
13478
14312
  "type": "int",
13479
- "default": 10,
14313
+ "default": 20,
13480
14314
  "required": false,
13481
- "help": "Max results"
14315
+ "help": "Number of results to return"
13482
14316
  }
13483
14317
  ],
13484
14318
  "columns": [
14319
+ "item_id",
13485
14320
  "rank",
13486
14321
  "title",
13487
- "author",
13488
- "bookId",
14322
+ "price",
14323
+ "condition",
14324
+ "brand",
14325
+ "location",
14326
+ "badge",
13489
14327
  "url"
13490
14328
  ],
13491
14329
  "type": "ts",
13492
- "modulePath": "weread/search.js"
14330
+ "modulePath": "xianyu/search.js",
14331
+ "navigateBefore": false
13493
14332
  },
13494
14333
  {
13495
- "site": "weread",
13496
- "name": "shelf",
13497
- "description": "List books on your WeRead bookshelf",
13498
- "domain": "weread.qq.com",
14334
+ "site": "xiaoe",
14335
+ "name": "catalog",
14336
+ "description": "小鹅通课程目录(支持普通课程、专栏、大专栏)",
14337
+ "domain": "h5.xet.citv.cn",
13499
14338
  "strategy": "cookie",
13500
14339
  "browser": true,
13501
14340
  "args": [
13502
14341
  {
13503
- "name": "limit",
13504
- "type": "int",
13505
- "default": 20,
13506
- "required": false,
13507
- "help": "Max results"
14342
+ "name": "url",
14343
+ "type": "str",
14344
+ "required": true,
14345
+ "positional": true,
14346
+ "help": "课程页面 URL"
13508
14347
  }
13509
14348
  ],
13510
14349
  "columns": [
14350
+ "ch",
14351
+ "chapter",
14352
+ "no",
13511
14353
  "title",
13512
- "author",
13513
- "progress",
13514
- "bookId"
14354
+ "type",
14355
+ "resource_id",
14356
+ "status"
13515
14357
  ],
13516
- "type": "ts",
13517
- "modulePath": "weread/shelf.js"
14358
+ "pipeline": [
14359
+ {
14360
+ "navigate": "${{ args.url }}"
14361
+ },
14362
+ {
14363
+ "wait": 8
14364
+ },
14365
+ {
14366
+ "evaluate": "(async () => {\n var el = document.querySelector('#app');\n var store = (el && el.__vue__) ? el.__vue__.$store : null;\n if (!store) return [];\n var coreInfo = store.state.coreInfo || {};\n var resourceType = coreInfo.resource_type || 0;\n var origin = window.location.origin;\n var courseName = coreInfo.resource_name || '';\n\n function typeLabel(t) {\n return {1:'图文',2:'直播',3:'音频',4:'视频',6:'专栏',8:'大专栏'}[Number(t)] || String(t||'');\n }\n function buildUrl(item) {\n var u = item.jump_url || item.h5_url || item.url || '';\n return (u && !u.startsWith('http')) ? origin + u : u;\n }\n function clickTab(name) {\n var tabs = document.querySelectorAll('span, div');\n for (var i = 0; i < tabs.length; i++) {\n if (tabs[i].children.length === 0 && tabs[i].textContent.trim() === name) {\n tabs[i].click(); return;\n }\n }\n }\n\n clickTab('目录');\n await new Promise(function(r) { setTimeout(r, 2000); });\n\n // ===== 专栏 / 大专栏 =====\n if (resourceType === 6 || resourceType === 8) {\n await new Promise(function(r) { setTimeout(r, 1000); });\n var listData = [];\n var walkList = function(vm, depth) {\n if (!vm || depth > 6 || listData.length > 0) return;\n var d = vm.$data || {};\n var keys = ['columnList', 'SingleItemList', 'chapterChildren'];\n for (var ki = 0; ki < keys.length; ki++) {\n var arr = d[keys[ki]];\n if (arr && Array.isArray(arr) && arr.length > 0 && arr[0].resource_id) {\n for (var j = 0; j < arr.length; j++) {\n var item = arr[j];\n if (!item.resource_id || !/^[pvlai]_/.test(item.resource_id)) continue;\n listData.push({\n ch: 1, chapter: courseName, no: j + 1,\n title: item.resource_title || item.title || item.chapter_title || '',\n type: typeLabel(item.resource_type || item.chapter_type),\n resource_id: item.resource_id,\n url: buildUrl(item),\n status: item.finished_state === 1 ? '已完成' : (item.resource_count ? item.resource_count + '节' : ''),\n });\n }\n return;\n }\n }\n if (vm.$children) {\n for (var c = 0; c < vm.$children.length; c++) walkList(vm.$children[c], depth + 1);\n }\n };\n walkList(el.__vue__, 0);\n return listData;\n }\n\n // ===== 普通课程 =====\n var chapters = document.querySelectorAll('.chapter_box');\n for (var ci = 0; ci < chapters.length; ci++) {\n var vue = chapters[ci].__vue__;\n if (vue && typeof vue.getSecitonList === 'function' && (!vue.isShowSecitonsList || !vue.chapterChildren.length)) {\n if (vue.isShowSecitonsList) vue.isShowSecitonsList = false;\n try { vue.getSecitonList(); } catch(e) {}\n await new Promise(function(r) { setTimeout(r, 1500); });\n }\n }\n await new Promise(function(r) { setTimeout(r, 3000); });\n\n var result = [];\n chapters = document.querySelectorAll('.chapter_box');\n for (var cj = 0; cj < chapters.length; cj++) {\n var v = chapters[cj].__vue__;\n if (!v) continue;\n var chTitle = (v.chapterItem && v.chapterItem.chapter_title) || '';\n var children = v.chapterChildren || [];\n for (var ck = 0; ck < children.length; ck++) {\n var child = children[ck];\n var resId = child.resource_id || child.chapter_id || '';\n var chType = child.chapter_type || child.resource_type || 0;\n var urlPath = {1:'/v1/course/text/',2:'/v2/course/alive/',3:'/v1/course/audio/',4:'/v1/course/video/'}[Number(chType)];\n result.push({\n ch: cj + 1, chapter: chTitle, no: ck + 1,\n title: child.chapter_title || child.resource_title || '',\n type: typeLabel(chType),\n resource_id: resId,\n url: urlPath ? origin + urlPath + resId + '?type=2' : '',\n status: child.is_finish === 1 ? '已完成' : (child.learn_progress > 0 ? child.learn_progress + '%' : '未学'),\n });\n }\n }\n return result;\n})()\n"
14367
+ },
14368
+ {
14369
+ "map": {
14370
+ "ch": "${{ item.ch }}",
14371
+ "chapter": "${{ item.chapter }}",
14372
+ "no": "${{ item.no }}",
14373
+ "title": "${{ item.title }}",
14374
+ "type": "${{ item.type }}",
14375
+ "resource_id": "${{ item.resource_id }}",
14376
+ "url": "${{ item.url }}",
14377
+ "status": "${{ item.status }}"
14378
+ }
14379
+ }
14380
+ ],
14381
+ "type": "yaml"
13518
14382
  },
13519
14383
  {
13520
- "site": "wikipedia",
13521
- "name": "random",
13522
- "description": "Get a random Wikipedia article",
13523
- "strategy": "public",
13524
- "browser": false,
14384
+ "site": "xiaoe",
14385
+ "name": "content",
14386
+ "description": "提取小鹅通图文页面内容为文本",
14387
+ "domain": "h5.xet.citv.cn",
14388
+ "strategy": "cookie",
14389
+ "browser": true,
13525
14390
  "args": [
13526
14391
  {
13527
- "name": "lang",
14392
+ "name": "url",
13528
14393
  "type": "str",
13529
- "default": "en",
13530
- "required": false,
13531
- "help": "Language code (e.g. en, zh, ja)"
14394
+ "required": true,
14395
+ "positional": true,
14396
+ "help": "页面 URL"
13532
14397
  }
13533
14398
  ],
13534
14399
  "columns": [
13535
14400
  "title",
13536
- "description",
13537
- "extract",
13538
- "url"
14401
+ "content_length",
14402
+ "image_count"
13539
14403
  ],
13540
- "type": "ts",
13541
- "modulePath": "wikipedia/random.js"
13542
- },
13543
- {
13544
- "site": "wikipedia",
13545
- "name": "search",
13546
- "description": "Search Wikipedia articles",
13547
- "strategy": "public",
13548
- "browser": false,
13549
- "args": [
14404
+ "pipeline": [
13550
14405
  {
13551
- "name": "query",
13552
- "type": "str",
13553
- "required": true,
13554
- "positional": true,
13555
- "help": "Search keyword"
14406
+ "navigate": "${{ args.url }}"
13556
14407
  },
13557
14408
  {
13558
- "name": "limit",
13559
- "type": "int",
13560
- "default": 10,
13561
- "required": false,
13562
- "help": "Max results"
14409
+ "wait": 6
13563
14410
  },
13564
14411
  {
13565
- "name": "lang",
13566
- "type": "str",
13567
- "default": "en",
13568
- "required": false,
13569
- "help": "Language code (e.g. en, zh, ja)"
14412
+ "evaluate": "(() => {\n var selectors = ['.rich-text-wrap','.content-wrap','.article-content','.text-content',\n '.course-detail','.detail-content','[class*=\"richtext\"]','[class*=\"rich-text\"]','.ql-editor'];\n var content = '';\n for (var i = 0; i < selectors.length; i++) {\n var el = document.querySelector(selectors[i]);\n if (el && el.innerText.trim().length > 50) { content = el.innerText.trim(); break; }\n }\n if (!content) content = (document.querySelector('main') || document.querySelector('#app') || document.body).innerText.trim();\n\n var images = [];\n document.querySelectorAll('img').forEach(function(img) {\n if (img.src && !img.src.startsWith('data:') && img.src.includes('xiaoe')) images.push(img.src);\n });\n return [{\n title: document.title,\n content: content,\n content_length: content.length,\n image_count: images.length,\n images: JSON.stringify(images.slice(0, 20)),\n }];\n})()\n"
13570
14413
  }
13571
14414
  ],
14415
+ "type": "yaml"
14416
+ },
14417
+ {
14418
+ "site": "xiaoe",
14419
+ "name": "courses",
14420
+ "description": "列出已购小鹅通课程(含 URL 和店铺名)",
14421
+ "domain": "study.xiaoe-tech.com",
14422
+ "strategy": "cookie",
14423
+ "browser": true,
14424
+ "args": [],
13572
14425
  "columns": [
13573
14426
  "title",
13574
- "snippet",
14427
+ "shop",
13575
14428
  "url"
13576
14429
  ],
13577
- "type": "ts",
13578
- "modulePath": "wikipedia/search.js"
14430
+ "pipeline": [
14431
+ {
14432
+ "navigate": "https://study.xiaoe-tech.com/"
14433
+ },
14434
+ {
14435
+ "wait": 8
14436
+ },
14437
+ {
14438
+ "evaluate": "(async () => {\n // 切换到「内容」tab\n var tabs = document.querySelectorAll('span, div');\n for (var i = 0; i < tabs.length; i++) {\n if (tabs[i].children.length === 0 && tabs[i].textContent.trim() === '内容') {\n tabs[i].click();\n break;\n }\n }\n await new Promise(function(r) { setTimeout(r, 2000); });\n\n // 匹配课程卡片标题与 Vue 数据\n function matchEntry(title, vm, depth) {\n if (!vm || depth > 5) return null;\n var d = vm.$data || {};\n for (var k in d) {\n if (!Array.isArray(d[k])) continue;\n for (var j = 0; j < d[k].length; j++) {\n var e = d[k][j];\n if (!e || typeof e !== 'object') continue;\n var t = e.title || e.resource_name || '';\n if (t && title.includes(t.substring(0, 10))) return e;\n }\n }\n return vm.$parent ? matchEntry(title, vm.$parent, depth + 1) : null;\n }\n\n // 构造课程 URL\n function buildUrl(entry) {\n if (entry.h5_url) return entry.h5_url;\n if (entry.url) return entry.url;\n if (entry.app_id && entry.resource_id) {\n var base = 'https://' + entry.app_id + '.h5.xet.citv.cn';\n if (entry.resource_type === 6) return base + '/v1/course/column/' + entry.resource_id + '?type=3';\n return base + '/p/course/ecourse/' + entry.resource_id;\n }\n return '';\n }\n\n var cards = document.querySelectorAll('.course-card-list');\n var results = [];\n for (var c = 0; c < cards.length; c++) {\n var titleEl = cards[c].querySelector('.card-title-box');\n var title = titleEl ? titleEl.textContent.trim() : '';\n if (!title) continue;\n var entry = matchEntry(title, cards[c].__vue__, 0);\n results.push({\n title: title,\n shop: entry ? (entry.shop_name || entry.app_name || '') : '',\n url: entry ? buildUrl(entry) : '',\n });\n }\n return results;\n})()\n"
14439
+ },
14440
+ {
14441
+ "map": {
14442
+ "title": "${{ item.title }}",
14443
+ "shop": "${{ item.shop }}",
14444
+ "url": "${{ item.url }}"
14445
+ }
14446
+ }
14447
+ ],
14448
+ "type": "yaml"
13579
14449
  },
13580
14450
  {
13581
- "site": "wikipedia",
13582
- "name": "summary",
13583
- "description": "Get Wikipedia article summary",
13584
- "strategy": "public",
13585
- "browser": false,
14451
+ "site": "xiaoe",
14452
+ "name": "detail",
14453
+ "description": "小鹅通课程详情(名称、价格、学员数、店铺)",
14454
+ "domain": "h5.xet.citv.cn",
14455
+ "strategy": "cookie",
14456
+ "browser": true,
13586
14457
  "args": [
13587
14458
  {
13588
- "name": "title",
14459
+ "name": "url",
13589
14460
  "type": "str",
13590
14461
  "required": true,
13591
14462
  "positional": true,
13592
- "help": "Article title (e.g. \"Transformer (machine learning model)\")"
13593
- },
13594
- {
13595
- "name": "lang",
13596
- "type": "str",
13597
- "default": "en",
13598
- "required": false,
13599
- "help": "Language code (e.g. en, zh, ja)"
14463
+ "help": "课程页面 URL"
13600
14464
  }
13601
14465
  ],
13602
14466
  "columns": [
13603
- "title",
13604
- "description",
13605
- "extract",
13606
- "url"
14467
+ "name",
14468
+ "price",
14469
+ "original_price",
14470
+ "user_count",
14471
+ "shop_name"
13607
14472
  ],
13608
- "type": "ts",
13609
- "modulePath": "wikipedia/summary.js"
14473
+ "pipeline": [
14474
+ {
14475
+ "navigate": "${{ args.url }}"
14476
+ },
14477
+ {
14478
+ "wait": 5
14479
+ },
14480
+ {
14481
+ "evaluate": "(() => {\n var vm = (document.querySelector('#app') || {}).__vue__;\n if (!vm || !vm.$store) return [];\n var core = vm.$store.state.coreInfo || {};\n var goods = vm.$store.state.goodsInfo || {};\n var shop = ((vm.$store.state.compositeInfo || {}).shop_conf) || {};\n return [{\n name: core.resource_name || '',\n resource_id: core.resource_id || '',\n resource_type: core.resource_type || '',\n cover: core.resource_img || '',\n user_count: core.user_count || 0,\n price: goods.price ? (goods.price / 100).toFixed(2) : '0',\n original_price: goods.line_price ? (goods.line_price / 100).toFixed(2) : '0',\n is_free: goods.is_free || 0,\n shop_name: shop.shop_name || '',\n }];\n})()\n"
14482
+ }
14483
+ ],
14484
+ "type": "yaml"
13610
14485
  },
13611
14486
  {
13612
- "site": "wikipedia",
13613
- "name": "trending",
13614
- "description": "Most-read Wikipedia articles (yesterday)",
13615
- "strategy": "public",
13616
- "browser": false,
14487
+ "site": "xiaoe",
14488
+ "name": "play-url",
14489
+ "description": "小鹅通视频/音频/直播回放 M3U8 播放地址",
14490
+ "domain": "h5.xet.citv.cn",
14491
+ "strategy": "cookie",
14492
+ "browser": true,
13617
14493
  "args": [
13618
14494
  {
13619
- "name": "limit",
13620
- "type": "int",
13621
- "default": 10,
13622
- "required": false,
13623
- "help": "Max results"
13624
- },
13625
- {
13626
- "name": "lang",
14495
+ "name": "url",
13627
14496
  "type": "str",
13628
- "default": "en",
13629
- "required": false,
13630
- "help": "Language code (e.g. en, zh, ja)"
14497
+ "required": true,
14498
+ "positional": true,
14499
+ "help": "小节页面 URL"
13631
14500
  }
13632
14501
  ],
13633
14502
  "columns": [
13634
- "rank",
13635
14503
  "title",
13636
- "description",
13637
- "views"
14504
+ "resource_id",
14505
+ "m3u8_url",
14506
+ "duration_sec",
14507
+ "method"
13638
14508
  ],
13639
- "type": "ts",
13640
- "modulePath": "wikipedia/trending.js"
14509
+ "pipeline": [
14510
+ {
14511
+ "navigate": "${{ args.url }}"
14512
+ },
14513
+ {
14514
+ "wait": 2
14515
+ },
14516
+ {
14517
+ "evaluate": "(async () => {\n var pageUrl = window.location.href;\n var origin = window.location.origin;\n var resourceId = (pageUrl.match(/[val]_[a-f0-9]+/) || [])[0] || '';\n var productId = (pageUrl.match(/product_id=([^&]+)/) || [])[1] || '';\n var appId = (origin.match(/(app[a-z0-9]+)\\./) || [])[1] || '';\n var isLive = resourceId.startsWith('l_') || pageUrl.includes('/alive/');\n var m3u8Url = '', method = '', title = document.title, duration = 0;\n\n // 深度搜索 Vue 组件树找 M3U8\n function searchVueM3u8() {\n var el = document.querySelector('#app');\n if (!el || !el.__vue__) return '';\n var walk = function(vm, d) {\n if (!vm || d > 10) return '';\n var data = vm.$data || {};\n for (var k in data) {\n if (k[0] === '_' || k[0] === '$') continue;\n var v = data[k];\n if (typeof v === 'string' && v.includes('.m3u8')) return v;\n if (typeof v === 'object' && v) {\n try {\n var s = JSON.stringify(v);\n var m = s.match(/https?:[^\"]*\\.m3u8[^\"]*/);\n if (m) return m[0].replace(/\\\\\\//g, '/');\n } catch(e) {}\n }\n }\n if (vm.$children) {\n for (var c = 0; c < vm.$children.length; c++) {\n var f = walk(vm.$children[c], d + 1);\n if (f) return f;\n }\n }\n return '';\n };\n return walk(el.__vue__, 0);\n }\n\n // ===== 视频课: detail_info → getPlayUrl =====\n if (!isLive && resourceId.startsWith('v_')) {\n try {\n var detailRes = await fetch(origin + '/xe.course.business.video.detail_info.get/2.0.0', {\n method: 'POST', credentials: 'include',\n headers: { 'Content-Type': 'application/x-www-form-urlencoded' },\n body: new URLSearchParams({\n 'bizData[resource_id]': resourceId,\n 'bizData[product_id]': productId || resourceId,\n 'bizData[opr_sys]': 'MacIntel',\n }),\n });\n var detail = await detailRes.json();\n var vi = (detail.data || {}).video_info || {};\n title = vi.file_name || title;\n duration = vi.video_length || 0;\n if (vi.play_sign) {\n var userId = (document.cookie.match(/ctx_user_id=([^;]+)/) || [])[1] || window.__user_id || '';\n var playRes = await fetch(origin + '/xe.material-center.play/getPlayUrl', {\n method: 'POST', credentials: 'include',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n org_app_id: appId, app_id: vi.material_app_id || appId,\n user_id: userId, play_sign: [vi.play_sign],\n play_line: 'A', opr_sys: 'MacIntel',\n }),\n });\n var playData = await playRes.json();\n if (playData.code === 0 && playData.data) {\n var m = JSON.stringify(playData.data).match(/https?:[^\"]*\\.m3u8[^\"]*/);\n if (m) { m3u8Url = m[0].replace(/\\\\u0026/g, '&').replace(/\\\\\\//g, '/'); method = 'api_direct'; }\n }\n }\n } catch(e) {}\n }\n\n // ===== 兜底: Performance API + Vue 搜索轮询 =====\n if (!m3u8Url) {\n for (var attempt = 0; attempt < 30; attempt++) {\n var entries = performance.getEntriesByType('resource');\n for (var i = 0; i < entries.length; i++) {\n if (entries[i].name.includes('.m3u8')) { m3u8Url = entries[i].name; method = 'perf_api'; break; }\n }\n if (!m3u8Url) { m3u8Url = searchVueM3u8(); if (m3u8Url) method = 'vue_search'; }\n if (m3u8Url) break;\n await new Promise(function(r) { setTimeout(r, 500); });\n }\n }\n\n if (!duration) {\n var vid = document.querySelector('video'), aud = document.querySelector('audio');\n if (vid && vid.duration && !isNaN(vid.duration)) duration = Math.round(vid.duration);\n if (aud && aud.duration && !isNaN(aud.duration)) duration = Math.round(aud.duration);\n }\n\n return [{ title: title, resource_id: resourceId, m3u8_url: m3u8Url, duration_sec: duration, method: method }];\n})()\n"
14518
+ },
14519
+ {
14520
+ "map": {
14521
+ "title": "${{ item.title }}",
14522
+ "resource_id": "${{ item.resource_id }}",
14523
+ "m3u8_url": "${{ item.m3u8_url }}",
14524
+ "duration_sec": "${{ item.duration_sec }}",
14525
+ "method": "${{ item.method }}"
14526
+ }
14527
+ }
14528
+ ],
14529
+ "type": "yaml"
13641
14530
  },
13642
14531
  {
13643
14532
  "site": "xiaohongshu",
@@ -15412,6 +16301,68 @@
15412
16301
  "type": "ts",
15413
16302
  "modulePath": "youtube/video.js"
15414
16303
  },
16304
+ {
16305
+ "site": "yuanbao",
16306
+ "name": "ask",
16307
+ "description": "Send a prompt to Yuanbao web chat and wait for the assistant response",
16308
+ "domain": "yuanbao.tencent.com",
16309
+ "strategy": "cookie",
16310
+ "browser": true,
16311
+ "args": [
16312
+ {
16313
+ "name": "prompt",
16314
+ "type": "str",
16315
+ "required": true,
16316
+ "positional": true,
16317
+ "help": "Prompt to send"
16318
+ },
16319
+ {
16320
+ "name": "timeout",
16321
+ "type": "str",
16322
+ "default": "60",
16323
+ "required": false,
16324
+ "help": "Max seconds to wait (default: 60)"
16325
+ },
16326
+ {
16327
+ "name": "search",
16328
+ "type": "boolean",
16329
+ "default": true,
16330
+ "required": false,
16331
+ "help": "Enable Yuanbao internet search (default: true)"
16332
+ },
16333
+ {
16334
+ "name": "think",
16335
+ "type": "boolean",
16336
+ "default": false,
16337
+ "required": false,
16338
+ "help": "Enable Yuanbao deep thinking (default: false)"
16339
+ }
16340
+ ],
16341
+ "columns": [
16342
+ "Role",
16343
+ "Text"
16344
+ ],
16345
+ "timeout": 180,
16346
+ "type": "ts",
16347
+ "modulePath": "yuanbao/ask.js",
16348
+ "navigateBefore": false
16349
+ },
16350
+ {
16351
+ "site": "yuanbao",
16352
+ "name": "new",
16353
+ "description": "Start a new conversation in Yuanbao web chat",
16354
+ "domain": "yuanbao.tencent.com",
16355
+ "strategy": "cookie",
16356
+ "browser": true,
16357
+ "args": [],
16358
+ "columns": [
16359
+ "Status",
16360
+ "Action"
16361
+ ],
16362
+ "type": "ts",
16363
+ "modulePath": "yuanbao/new.js",
16364
+ "navigateBefore": false
16365
+ },
15415
16366
  {
15416
16367
  "site": "zhihu",
15417
16368
  "name": "download",