@jackwener/opencli 1.4.0 → 1.5.0

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 (514) hide show
  1. package/.github/actions/setup-chrome/action.yml +5 -4
  2. package/.github/workflows/build-extension.yml +2 -6
  3. package/.github/workflows/ci.yml +37 -3
  4. package/.github/workflows/e2e-headed.yml +16 -3
  5. package/CHANGELOG.md +23 -0
  6. package/PRIVACY.md +57 -0
  7. package/README.md +36 -7
  8. package/README.zh-CN.md +13 -6
  9. package/SKILL.md +103 -2
  10. package/dist/browser/cdp.d.ts +2 -1
  11. package/dist/browser/discover.d.ts +4 -1
  12. package/dist/browser/discover.js +6 -2
  13. package/dist/browser/errors.d.ts +2 -2
  14. package/dist/browser/errors.js +4 -12
  15. package/dist/browser/mcp.d.ts +2 -1
  16. package/dist/build-manifest.d.ts +2 -0
  17. package/dist/build-manifest.js +39 -14
  18. package/dist/build-manifest.test.js +21 -0
  19. package/dist/capabilityRouting.d.ts +2 -0
  20. package/dist/capabilityRouting.js +2 -1
  21. package/dist/cli-manifest.json +1838 -151
  22. package/dist/cli.js +34 -3
  23. package/dist/clis/36kr/article.d.ts +1 -0
  24. package/dist/clis/36kr/article.js +62 -0
  25. package/dist/clis/36kr/hot.d.ts +3 -0
  26. package/dist/clis/36kr/hot.js +80 -0
  27. package/dist/clis/36kr/hot.test.d.ts +1 -0
  28. package/dist/clis/36kr/hot.test.js +15 -0
  29. package/dist/clis/36kr/news.d.ts +1 -0
  30. package/dist/clis/36kr/news.js +51 -0
  31. package/dist/clis/36kr/news.test.d.ts +1 -0
  32. package/dist/clis/36kr/news.test.js +85 -0
  33. package/dist/clis/36kr/search.d.ts +1 -0
  34. package/dist/clis/36kr/search.js +72 -0
  35. package/dist/clis/apple-podcasts/search.js +2 -1
  36. package/dist/clis/arxiv/search.js +2 -2
  37. package/dist/clis/bbc/news.js +0 -1
  38. package/dist/clis/bilibili/comments.d.ts +5 -0
  39. package/dist/clis/bilibili/comments.js +40 -0
  40. package/dist/clis/bilibili/comments.test.d.ts +1 -0
  41. package/dist/clis/bilibili/comments.test.js +82 -0
  42. package/dist/clis/chatgpt/ask.js +29 -14
  43. package/dist/clis/chatgpt/ax.d.ts +6 -0
  44. package/dist/clis/chatgpt/ax.js +172 -1
  45. package/dist/clis/chatgpt/model.d.ts +1 -0
  46. package/dist/clis/chatgpt/model.js +24 -0
  47. package/dist/clis/chatgpt/send.js +12 -3
  48. package/dist/clis/ctrip/search.js +0 -1
  49. package/dist/clis/douban/download.d.ts +1 -0
  50. package/dist/clis/douban/download.js +67 -0
  51. package/dist/clis/douban/download.test.d.ts +1 -0
  52. package/dist/clis/douban/download.test.js +170 -0
  53. package/dist/clis/douban/photos.d.ts +1 -0
  54. package/dist/clis/douban/photos.js +34 -0
  55. package/dist/clis/douban/utils.d.ts +25 -0
  56. package/dist/clis/douban/utils.js +190 -1
  57. package/dist/clis/douban/utils.test.d.ts +1 -0
  58. package/dist/clis/douban/utils.test.js +64 -0
  59. package/dist/clis/douyin/_shared/browser-fetch.d.ts +10 -0
  60. package/dist/clis/douyin/_shared/browser-fetch.js +30 -0
  61. package/dist/clis/douyin/_shared/browser-fetch.test.d.ts +1 -0
  62. package/dist/clis/douyin/_shared/browser-fetch.test.js +31 -0
  63. package/dist/clis/douyin/_shared/creation-id.d.ts +1 -0
  64. package/dist/clis/douyin/_shared/creation-id.js +5 -0
  65. package/dist/clis/douyin/_shared/creation-id.test.d.ts +1 -0
  66. package/dist/clis/douyin/_shared/creation-id.test.js +22 -0
  67. package/dist/clis/douyin/_shared/imagex-upload.d.ts +20 -0
  68. package/dist/clis/douyin/_shared/imagex-upload.js +53 -0
  69. package/dist/clis/douyin/_shared/imagex-upload.test.d.ts +1 -0
  70. package/dist/clis/douyin/_shared/imagex-upload.test.js +87 -0
  71. package/dist/clis/douyin/_shared/sts2.d.ts +8 -0
  72. package/dist/clis/douyin/_shared/sts2.js +15 -0
  73. package/dist/clis/douyin/_shared/text-extra.d.ts +18 -0
  74. package/dist/clis/douyin/_shared/text-extra.js +15 -0
  75. package/dist/clis/douyin/_shared/text-extra.test.d.ts +1 -0
  76. package/dist/clis/douyin/_shared/text-extra.test.js +37 -0
  77. package/dist/clis/douyin/_shared/timing.d.ts +2 -0
  78. package/dist/clis/douyin/_shared/timing.js +22 -0
  79. package/dist/clis/douyin/_shared/timing.test.d.ts +1 -0
  80. package/dist/clis/douyin/_shared/timing.test.js +28 -0
  81. package/dist/clis/douyin/_shared/tos-upload-short-read.test.d.ts +11 -0
  82. package/dist/clis/douyin/_shared/tos-upload-short-read.test.js +83 -0
  83. package/dist/clis/douyin/_shared/tos-upload.d.ts +53 -0
  84. package/dist/clis/douyin/_shared/tos-upload.js +295 -0
  85. package/dist/clis/douyin/_shared/tos-upload.test.d.ts +1 -0
  86. package/dist/clis/douyin/_shared/tos-upload.test.js +229 -0
  87. package/dist/clis/douyin/_shared/transcode.d.ts +27 -0
  88. package/dist/clis/douyin/_shared/transcode.js +45 -0
  89. package/dist/clis/douyin/_shared/transcode.test.d.ts +1 -0
  90. package/dist/clis/douyin/_shared/transcode.test.js +93 -0
  91. package/dist/clis/douyin/_shared/types.d.ts +26 -0
  92. package/dist/clis/douyin/_shared/types.js +1 -0
  93. package/dist/clis/douyin/activities.d.ts +1 -0
  94. package/dist/clis/douyin/activities.js +20 -0
  95. package/dist/clis/douyin/activities.test.d.ts +1 -0
  96. package/dist/clis/douyin/activities.test.js +22 -0
  97. package/dist/clis/douyin/collections.d.ts +1 -0
  98. package/dist/clis/douyin/collections.js +22 -0
  99. package/dist/clis/douyin/collections.test.d.ts +1 -0
  100. package/dist/clis/douyin/collections.test.js +23 -0
  101. package/dist/clis/douyin/delete.d.ts +1 -0
  102. package/dist/clis/douyin/delete.js +18 -0
  103. package/dist/clis/douyin/delete.test.d.ts +1 -0
  104. package/dist/clis/douyin/delete.test.js +11 -0
  105. package/dist/clis/douyin/draft.d.ts +14 -0
  106. package/dist/clis/douyin/draft.js +237 -0
  107. package/dist/clis/douyin/draft.test.d.ts +1 -0
  108. package/dist/clis/douyin/draft.test.js +11 -0
  109. package/dist/clis/douyin/drafts.d.ts +1 -0
  110. package/dist/clis/douyin/drafts.js +23 -0
  111. package/dist/clis/douyin/drafts.test.d.ts +1 -0
  112. package/dist/clis/douyin/drafts.test.js +11 -0
  113. package/dist/clis/douyin/hashtag.d.ts +1 -0
  114. package/dist/clis/douyin/hashtag.js +45 -0
  115. package/dist/clis/douyin/hashtag.test.d.ts +1 -0
  116. package/dist/clis/douyin/hashtag.test.js +25 -0
  117. package/dist/clis/douyin/location.d.ts +1 -0
  118. package/dist/clis/douyin/location.js +24 -0
  119. package/dist/clis/douyin/location.test.d.ts +1 -0
  120. package/dist/clis/douyin/location.test.js +23 -0
  121. package/dist/clis/douyin/profile.d.ts +1 -0
  122. package/dist/clis/douyin/profile.js +28 -0
  123. package/dist/clis/douyin/profile.test.d.ts +1 -0
  124. package/dist/clis/douyin/profile.test.js +11 -0
  125. package/dist/clis/douyin/publish.d.ts +14 -0
  126. package/dist/clis/douyin/publish.js +288 -0
  127. package/dist/clis/douyin/publish.test.d.ts +1 -0
  128. package/dist/clis/douyin/publish.test.js +38 -0
  129. package/dist/clis/douyin/stats.d.ts +1 -0
  130. package/dist/clis/douyin/stats.js +27 -0
  131. package/dist/clis/douyin/stats.test.d.ts +1 -0
  132. package/dist/clis/douyin/stats.test.js +22 -0
  133. package/dist/clis/douyin/update.d.ts +1 -0
  134. package/dist/clis/douyin/update.js +31 -0
  135. package/dist/clis/douyin/update.test.d.ts +1 -0
  136. package/dist/clis/douyin/update.test.js +11 -0
  137. package/dist/clis/douyin/videos.d.ts +1 -0
  138. package/dist/clis/douyin/videos.js +34 -0
  139. package/dist/clis/douyin/videos.test.d.ts +1 -0
  140. package/dist/clis/douyin/videos.test.js +11 -0
  141. package/dist/clis/hackernews/search.yaml +1 -1
  142. package/dist/clis/imdb/person.d.ts +1 -0
  143. package/dist/clis/imdb/person.js +203 -0
  144. package/dist/clis/imdb/reviews.d.ts +1 -0
  145. package/dist/clis/imdb/reviews.js +88 -0
  146. package/dist/clis/imdb/search.d.ts +1 -0
  147. package/dist/clis/imdb/search.js +161 -0
  148. package/dist/clis/imdb/title.d.ts +1 -0
  149. package/dist/clis/imdb/title.js +93 -0
  150. package/dist/clis/imdb/top.d.ts +1 -0
  151. package/dist/clis/imdb/top.js +53 -0
  152. package/dist/clis/imdb/trending.d.ts +1 -0
  153. package/dist/clis/imdb/trending.js +52 -0
  154. package/dist/clis/imdb/utils.d.ts +46 -0
  155. package/dist/clis/imdb/utils.js +285 -0
  156. package/dist/clis/imdb/utils.test.d.ts +1 -0
  157. package/dist/clis/imdb/utils.test.js +88 -0
  158. package/dist/clis/instagram/search.yaml +2 -1
  159. package/dist/clis/jd/item.d.ts +4 -0
  160. package/dist/clis/jd/item.js +16 -15
  161. package/dist/clis/jd/item.test.js +16 -1
  162. package/dist/clis/linux-do/categories.yaml +38 -9
  163. package/dist/clis/linux-do/category.d.ts +1 -0
  164. package/dist/clis/linux-do/category.js +36 -0
  165. package/dist/clis/linux-do/feed.d.ts +45 -0
  166. package/dist/clis/linux-do/feed.js +397 -0
  167. package/dist/clis/linux-do/feed.test.d.ts +1 -0
  168. package/dist/clis/linux-do/feed.test.js +118 -0
  169. package/dist/clis/linux-do/hot.d.ts +1 -0
  170. package/dist/clis/linux-do/hot.js +25 -0
  171. package/dist/clis/linux-do/latest.d.ts +1 -0
  172. package/dist/clis/linux-do/latest.js +18 -0
  173. package/dist/clis/linux-do/search.yaml +3 -1
  174. package/dist/clis/linux-do/tags.yaml +41 -0
  175. package/dist/clis/linux-do/topic.yaml +41 -3
  176. package/dist/clis/linux-do/user-posts.yaml +67 -0
  177. package/dist/clis/linux-do/user-topics.yaml +54 -0
  178. package/dist/clis/medium/search.js +1 -1
  179. package/dist/clis/paperreview/commands.test.d.ts +3 -0
  180. package/dist/clis/paperreview/commands.test.js +243 -0
  181. package/dist/clis/paperreview/feedback.d.ts +1 -0
  182. package/dist/clis/paperreview/feedback.js +52 -0
  183. package/dist/clis/paperreview/review.d.ts +1 -0
  184. package/dist/clis/paperreview/review.js +37 -0
  185. package/dist/clis/paperreview/submit.d.ts +1 -0
  186. package/dist/clis/paperreview/submit.js +85 -0
  187. package/dist/clis/paperreview/utils.d.ts +46 -0
  188. package/dist/clis/paperreview/utils.js +197 -0
  189. package/dist/clis/paperreview/utils.test.d.ts +1 -0
  190. package/dist/clis/paperreview/utils.test.js +49 -0
  191. package/dist/clis/producthunt/browse.d.ts +1 -0
  192. package/dist/clis/producthunt/browse.js +99 -0
  193. package/dist/clis/producthunt/hot.d.ts +1 -0
  194. package/dist/clis/producthunt/hot.js +110 -0
  195. package/dist/clis/producthunt/posts.d.ts +1 -0
  196. package/dist/clis/producthunt/posts.js +28 -0
  197. package/dist/clis/producthunt/today.d.ts +1 -0
  198. package/dist/clis/producthunt/today.js +35 -0
  199. package/dist/clis/producthunt/utils.d.ts +29 -0
  200. package/dist/clis/producthunt/utils.js +99 -0
  201. package/dist/clis/producthunt/utils.test.d.ts +1 -0
  202. package/dist/clis/producthunt/utils.test.js +64 -0
  203. package/dist/clis/reuters/search.js +0 -1
  204. package/dist/clis/twitter/article.js +4 -28
  205. package/dist/clis/twitter/likes.d.ts +24 -0
  206. package/dist/clis/twitter/likes.js +217 -0
  207. package/dist/clis/twitter/likes.test.d.ts +1 -0
  208. package/dist/clis/twitter/likes.test.js +85 -0
  209. package/dist/clis/twitter/profile.js +4 -28
  210. package/dist/clis/twitter/search.js +7 -4
  211. package/dist/clis/twitter/search.test.js +56 -2
  212. package/dist/clis/twitter/shared.d.ts +6 -0
  213. package/dist/clis/twitter/shared.js +35 -0
  214. package/dist/clis/twitter/timeline.js +2 -13
  215. package/dist/clis/weibo/comments.d.ts +1 -0
  216. package/dist/clis/weibo/comments.js +53 -0
  217. package/dist/clis/weibo/feed.d.ts +1 -0
  218. package/dist/clis/weibo/feed.js +56 -0
  219. package/dist/clis/weibo/hot.js +0 -1
  220. package/dist/clis/weibo/me.d.ts +1 -0
  221. package/dist/clis/weibo/me.js +76 -0
  222. package/dist/clis/weibo/post.d.ts +1 -0
  223. package/dist/clis/weibo/post.js +75 -0
  224. package/dist/clis/weibo/user.d.ts +1 -0
  225. package/dist/clis/weibo/user.js +63 -0
  226. package/dist/clis/weibo/utils.d.ts +6 -0
  227. package/dist/clis/weibo/utils.js +30 -0
  228. package/dist/clis/weixin/download.d.ts +17 -0
  229. package/dist/clis/weixin/download.js +88 -20
  230. package/dist/clis/weread/book.js +2 -2
  231. package/dist/clis/weread/commands.test.d.ts +3 -0
  232. package/dist/clis/weread/commands.test.js +43 -0
  233. package/dist/clis/weread/highlights.js +2 -2
  234. package/dist/clis/weread/notebooks.js +2 -2
  235. package/dist/clis/weread/notes.js +3 -3
  236. package/dist/clis/weread/search.js +3 -2
  237. package/dist/clis/weread/shelf.js +2 -2
  238. package/dist/clis/weread/utils.d.ts +4 -4
  239. package/dist/clis/weread/utils.js +32 -14
  240. package/dist/clis/weread/utils.test.js +1 -28
  241. package/dist/clis/xiaohongshu/comments.d.ts +5 -0
  242. package/dist/clis/xiaohongshu/comments.js +74 -0
  243. package/dist/clis/xiaohongshu/comments.test.d.ts +1 -0
  244. package/dist/clis/xiaohongshu/comments.test.js +79 -0
  245. package/dist/clis/xiaohongshu/publish.js +114 -18
  246. package/dist/clis/xiaohongshu/publish.test.d.ts +1 -0
  247. package/dist/clis/xiaohongshu/publish.test.js +119 -0
  248. package/dist/clis/xueqiu/search.yaml +2 -1
  249. package/dist/clis/yahoo-finance/quote.js +0 -1
  250. package/dist/clis/youtube/channel.d.ts +1 -0
  251. package/dist/clis/youtube/channel.js +150 -0
  252. package/dist/clis/youtube/comments.d.ts +1 -0
  253. package/dist/clis/youtube/comments.js +95 -0
  254. package/dist/clis/youtube/search.js +0 -1
  255. package/dist/clis/zhihu/search.yaml +2 -1
  256. package/dist/commanderAdapter.d.ts +1 -0
  257. package/dist/commanderAdapter.js +176 -29
  258. package/dist/commanderAdapter.test.d.ts +1 -0
  259. package/dist/commanderAdapter.test.js +62 -0
  260. package/dist/daemon.js +17 -1
  261. package/dist/discovery.js +8 -14
  262. package/dist/doctor.d.ts +1 -0
  263. package/dist/doctor.js +9 -2
  264. package/dist/download/index.js +63 -51
  265. package/dist/download/index.test.js +17 -4
  266. package/dist/errors.d.ts +3 -1
  267. package/dist/errors.js +15 -32
  268. package/dist/execution.d.ts +1 -3
  269. package/dist/execution.js +21 -1
  270. package/dist/external-clis.yaml +0 -17
  271. package/dist/hooks.js +2 -0
  272. package/dist/main.js +5 -0
  273. package/dist/output.js +5 -1
  274. package/dist/pipeline/executor.js +3 -4
  275. package/dist/plugin-manifest.d.ts +70 -0
  276. package/dist/plugin-manifest.js +160 -0
  277. package/dist/plugin-manifest.test.d.ts +4 -0
  278. package/dist/plugin-manifest.test.js +179 -0
  279. package/dist/plugin.d.ts +38 -5
  280. package/dist/plugin.js +267 -33
  281. package/dist/plugin.test.js +220 -3
  282. package/dist/registry.d.ts +4 -0
  283. package/dist/registry.js +2 -0
  284. package/dist/runtime-detect.d.ts +21 -0
  285. package/dist/runtime-detect.js +32 -0
  286. package/dist/runtime-detect.test.d.ts +1 -0
  287. package/dist/runtime-detect.test.js +27 -0
  288. package/dist/runtime.js +1 -1
  289. package/dist/serialization.d.ts +2 -0
  290. package/dist/serialization.js +6 -0
  291. package/dist/types.d.ts +1 -0
  292. package/dist/update-check.d.ts +22 -0
  293. package/dist/update-check.js +112 -0
  294. package/dist/weixin-download.test.d.ts +1 -0
  295. package/dist/weixin-download.test.js +30 -0
  296. package/dist/weread-private-api-regression.test.d.ts +1 -0
  297. package/dist/weread-private-api-regression.test.js +122 -0
  298. package/dist/weread-search-regression.test.d.ts +1 -0
  299. package/dist/weread-search-regression.test.js +39 -0
  300. package/dist/yaml-schema.d.ts +3 -0
  301. package/dist/yaml-schema.js +18 -1
  302. package/docs/.vitepress/config.mts +17 -0
  303. package/docs/adapters/browser/36kr.md +47 -0
  304. package/docs/adapters/browser/douban.md +14 -0
  305. package/docs/adapters/browser/douyin.md +75 -0
  306. package/docs/adapters/browser/imdb.md +47 -0
  307. package/docs/adapters/browser/jd.md +2 -2
  308. package/docs/adapters/browser/linux-do.md +181 -20
  309. package/docs/adapters/browser/paperreview.md +43 -0
  310. package/docs/adapters/browser/producthunt.md +49 -0
  311. package/docs/adapters/browser/twitter.md +6 -0
  312. package/docs/adapters/desktop/chatgpt.md +5 -0
  313. package/docs/adapters/index.md +12 -3
  314. package/docs/advanced/download.md +4 -0
  315. package/docs/advanced/rate-limiter-plugin.md +99 -0
  316. package/docs/guide/electron-app-cli.md +200 -0
  317. package/docs/guide/getting-started.md +1 -0
  318. package/docs/guide/plugins.md +87 -0
  319. package/docs/zh/guide/electron-app-cli.md +188 -0
  320. package/docs/zh/guide/getting-started.md +1 -0
  321. package/docs/zh/guide/plugins.md +65 -0
  322. package/extension/dist/background.js +508 -518
  323. package/extension/manifest.json +6 -2
  324. package/extension/package.json +2 -1
  325. package/extension/popup.html +84 -0
  326. package/extension/popup.js +25 -0
  327. package/extension/scripts/package-release.mjs +179 -0
  328. package/extension/src/background.ts +22 -1
  329. package/package.json +4 -1
  330. package/scripts/postinstall.js +10 -0
  331. package/src/browser/cdp.ts +2 -1
  332. package/src/browser/discover.ts +8 -3
  333. package/src/browser/errors.ts +13 -14
  334. package/src/browser/mcp.ts +2 -1
  335. package/src/build-manifest.test.ts +23 -0
  336. package/src/build-manifest.ts +40 -15
  337. package/src/capabilityRouting.ts +2 -1
  338. package/src/cli.ts +35 -3
  339. package/src/clis/36kr/article.ts +69 -0
  340. package/src/clis/36kr/hot.test.ts +19 -0
  341. package/src/clis/36kr/hot.ts +100 -0
  342. package/src/clis/36kr/news.test.ts +90 -0
  343. package/src/clis/36kr/news.ts +54 -0
  344. package/src/clis/36kr/search.ts +78 -0
  345. package/src/clis/apple-podcasts/search.ts +2 -1
  346. package/src/clis/arxiv/search.ts +2 -2
  347. package/src/clis/bbc/news.ts +0 -1
  348. package/src/clis/bilibili/comments.test.ts +102 -0
  349. package/src/clis/bilibili/comments.ts +44 -0
  350. package/src/clis/chatgpt/ask.ts +28 -14
  351. package/src/clis/chatgpt/ax.ts +180 -1
  352. package/src/clis/chatgpt/model.ts +27 -0
  353. package/src/clis/chatgpt/send.ts +16 -6
  354. package/src/clis/ctrip/search.ts +0 -1
  355. package/src/clis/douban/download.test.ts +196 -0
  356. package/src/clis/douban/download.ts +78 -0
  357. package/src/clis/douban/photos.ts +36 -0
  358. package/src/clis/douban/utils.test.ts +97 -0
  359. package/src/clis/douban/utils.ts +232 -1
  360. package/src/clis/douyin/_shared/browser-fetch.test.ts +38 -0
  361. package/src/clis/douyin/_shared/browser-fetch.ts +45 -0
  362. package/src/clis/douyin/_shared/creation-id.test.ts +26 -0
  363. package/src/clis/douyin/_shared/creation-id.ts +8 -0
  364. package/src/clis/douyin/_shared/imagex-upload.test.ts +113 -0
  365. package/src/clis/douyin/_shared/imagex-upload.ts +76 -0
  366. package/src/clis/douyin/_shared/sts2.ts +20 -0
  367. package/src/clis/douyin/_shared/text-extra.test.ts +42 -0
  368. package/src/clis/douyin/_shared/text-extra.ts +33 -0
  369. package/src/clis/douyin/_shared/timing.test.ts +38 -0
  370. package/src/clis/douyin/_shared/timing.ts +22 -0
  371. package/src/clis/douyin/_shared/tos-upload-short-read.test.ts +102 -0
  372. package/src/clis/douyin/_shared/tos-upload.test.ts +281 -0
  373. package/src/clis/douyin/_shared/tos-upload.ts +444 -0
  374. package/src/clis/douyin/_shared/transcode.test.ts +117 -0
  375. package/src/clis/douyin/_shared/transcode.ts +78 -0
  376. package/src/clis/douyin/_shared/types.ts +29 -0
  377. package/src/clis/douyin/activities.test.ts +25 -0
  378. package/src/clis/douyin/activities.ts +23 -0
  379. package/src/clis/douyin/collections.test.ts +26 -0
  380. package/src/clis/douyin/collections.ts +25 -0
  381. package/src/clis/douyin/delete.test.ts +12 -0
  382. package/src/clis/douyin/delete.ts +20 -0
  383. package/src/clis/douyin/draft.test.ts +12 -0
  384. package/src/clis/douyin/draft.ts +282 -0
  385. package/src/clis/douyin/drafts.test.ts +12 -0
  386. package/src/clis/douyin/drafts.ts +27 -0
  387. package/src/clis/douyin/hashtag.test.ts +28 -0
  388. package/src/clis/douyin/hashtag.ts +56 -0
  389. package/src/clis/douyin/location.test.ts +26 -0
  390. package/src/clis/douyin/location.ts +27 -0
  391. package/src/clis/douyin/profile.test.ts +12 -0
  392. package/src/clis/douyin/profile.ts +37 -0
  393. package/src/clis/douyin/publish.test.ts +45 -0
  394. package/src/clis/douyin/publish.ts +340 -0
  395. package/src/clis/douyin/stats.test.ts +25 -0
  396. package/src/clis/douyin/stats.ts +30 -0
  397. package/src/clis/douyin/update.test.ts +12 -0
  398. package/src/clis/douyin/update.ts +43 -0
  399. package/src/clis/douyin/videos.test.ts +12 -0
  400. package/src/clis/douyin/videos.ts +49 -0
  401. package/src/clis/hackernews/search.yaml +1 -1
  402. package/src/clis/imdb/person.ts +232 -0
  403. package/src/clis/imdb/reviews.ts +111 -0
  404. package/src/clis/imdb/search.ts +179 -0
  405. package/src/clis/imdb/title.ts +121 -0
  406. package/src/clis/imdb/top.ts +67 -0
  407. package/src/clis/imdb/trending.ts +66 -0
  408. package/src/clis/imdb/utils.test.ts +117 -0
  409. package/src/clis/imdb/utils.ts +305 -0
  410. package/src/clis/instagram/search.yaml +2 -1
  411. package/src/clis/jd/item.test.ts +18 -1
  412. package/src/clis/jd/item.ts +18 -15
  413. package/src/clis/linux-do/categories.yaml +38 -9
  414. package/src/clis/linux-do/category.ts +37 -0
  415. package/src/clis/linux-do/feed.test.ts +132 -0
  416. package/src/clis/linux-do/feed.ts +501 -0
  417. package/src/clis/linux-do/hot.ts +26 -0
  418. package/src/clis/linux-do/latest.ts +19 -0
  419. package/src/clis/linux-do/search.yaml +3 -1
  420. package/src/clis/linux-do/tags.yaml +41 -0
  421. package/src/clis/linux-do/topic.yaml +41 -3
  422. package/src/clis/linux-do/user-posts.yaml +67 -0
  423. package/src/clis/linux-do/user-topics.yaml +54 -0
  424. package/src/clis/medium/search.ts +1 -1
  425. package/src/clis/paperreview/commands.test.ts +283 -0
  426. package/src/clis/paperreview/feedback.ts +64 -0
  427. package/src/clis/paperreview/review.ts +47 -0
  428. package/src/clis/paperreview/submit.ts +119 -0
  429. package/src/clis/paperreview/utils.test.ts +68 -0
  430. package/src/clis/paperreview/utils.ts +276 -0
  431. package/src/clis/producthunt/browse.ts +109 -0
  432. package/src/clis/producthunt/hot.ts +127 -0
  433. package/src/clis/producthunt/posts.ts +29 -0
  434. package/src/clis/producthunt/today.ts +37 -0
  435. package/src/clis/producthunt/utils.test.ts +72 -0
  436. package/src/clis/producthunt/utils.ts +122 -0
  437. package/src/clis/reuters/search.ts +0 -1
  438. package/src/clis/twitter/article.ts +5 -28
  439. package/src/clis/twitter/likes.test.ts +91 -0
  440. package/src/clis/twitter/likes.ts +256 -0
  441. package/src/clis/twitter/profile.ts +5 -28
  442. package/src/clis/twitter/search.test.ts +71 -2
  443. package/src/clis/twitter/search.ts +8 -4
  444. package/src/clis/twitter/shared.ts +45 -0
  445. package/src/clis/twitter/timeline.ts +2 -13
  446. package/src/clis/weibo/comments.ts +54 -0
  447. package/src/clis/weibo/feed.ts +57 -0
  448. package/src/clis/weibo/hot.ts +0 -1
  449. package/src/clis/weibo/me.ts +77 -0
  450. package/src/clis/weibo/post.ts +77 -0
  451. package/src/clis/weibo/user.ts +64 -0
  452. package/src/clis/weibo/utils.ts +32 -0
  453. package/src/clis/weixin/download.ts +114 -20
  454. package/src/clis/weread/book.ts +2 -2
  455. package/src/clis/weread/commands.test.ts +57 -0
  456. package/src/clis/weread/highlights.ts +2 -2
  457. package/src/clis/weread/notebooks.ts +2 -2
  458. package/src/clis/weread/notes.ts +3 -3
  459. package/src/clis/weread/search.ts +3 -2
  460. package/src/clis/weread/shelf.ts +2 -2
  461. package/src/clis/weread/utils.test.ts +1 -32
  462. package/src/clis/weread/utils.ts +41 -16
  463. package/src/clis/xiaohongshu/comments.test.ts +96 -0
  464. package/src/clis/xiaohongshu/comments.ts +81 -0
  465. package/src/clis/xiaohongshu/publish.test.ts +137 -0
  466. package/src/clis/xiaohongshu/publish.ts +129 -18
  467. package/src/clis/xueqiu/search.yaml +2 -1
  468. package/src/clis/yahoo-finance/quote.ts +0 -1
  469. package/src/clis/youtube/channel.ts +155 -0
  470. package/src/clis/youtube/comments.ts +97 -0
  471. package/src/clis/youtube/search.ts +0 -1
  472. package/src/clis/zhihu/search.yaml +2 -1
  473. package/src/commanderAdapter.test.ts +78 -0
  474. package/src/commanderAdapter.ts +188 -24
  475. package/src/daemon.ts +19 -1
  476. package/src/discovery.ts +8 -15
  477. package/src/doctor.ts +13 -2
  478. package/src/download/index.test.ts +14 -4
  479. package/src/download/index.ts +67 -55
  480. package/src/errors.ts +25 -66
  481. package/src/execution.ts +28 -3
  482. package/src/external-clis.yaml +0 -17
  483. package/src/hooks.ts +1 -0
  484. package/src/main.ts +6 -0
  485. package/src/output.ts +3 -1
  486. package/src/pipeline/executor.ts +4 -6
  487. package/src/plugin-manifest.test.ts +223 -0
  488. package/src/plugin-manifest.ts +206 -0
  489. package/src/plugin.test.ts +246 -2
  490. package/src/plugin.ts +338 -36
  491. package/src/registry.ts +6 -1
  492. package/src/runtime-detect.test.ts +30 -0
  493. package/src/runtime-detect.ts +36 -0
  494. package/src/runtime.ts +1 -1
  495. package/src/serialization.ts +4 -0
  496. package/src/types.ts +1 -0
  497. package/src/update-check.ts +114 -0
  498. package/src/weixin-download.test.ts +64 -0
  499. package/src/weread-private-api-regression.test.ts +150 -0
  500. package/src/weread-search-regression.test.ts +44 -0
  501. package/src/yaml-schema.ts +20 -0
  502. package/tests/e2e/browser-auth.test.ts +13 -9
  503. package/tests/e2e/browser-public-extended.test.ts +162 -0
  504. package/tests/e2e/browser-public.test.ts +55 -136
  505. package/tests/e2e/helpers.ts +2 -1
  506. package/tests/e2e/public-commands.test.ts +37 -3
  507. package/tests/smoke/api-health.test.ts +1 -1
  508. package/vitest.config.ts +34 -17
  509. package/dist/clis/linux-do/category.yaml +0 -51
  510. package/dist/clis/linux-do/hot.yaml +0 -50
  511. package/dist/clis/linux-do/latest.yaml +0 -40
  512. package/src/clis/linux-do/category.yaml +0 -51
  513. package/src/clis/linux-do/hot.yaml +0 -50
  514. package/src/clis/linux-do/latest.yaml +0 -40
@@ -1,4 +1,116 @@
1
1
  [
2
+ {
3
+ "site": "36kr",
4
+ "name": "article",
5
+ "description": "获取36氪文章正文内容",
6
+ "strategy": "intercept",
7
+ "browser": true,
8
+ "args": [
9
+ {
10
+ "name": "id",
11
+ "type": "str",
12
+ "required": true,
13
+ "positional": true,
14
+ "help": "Article ID or full 36kr article URL"
15
+ }
16
+ ],
17
+ "type": "ts",
18
+ "modulePath": "36kr/article.js",
19
+ "domain": "www.36kr.com",
20
+ "columns": [
21
+ "field",
22
+ "value"
23
+ ]
24
+ },
25
+ {
26
+ "site": "36kr",
27
+ "name": "hot",
28
+ "description": "36氪热榜 — trending articles (renqi/zonghe/shoucang/catalog)",
29
+ "strategy": "intercept",
30
+ "browser": true,
31
+ "args": [
32
+ {
33
+ "name": "limit",
34
+ "type": "int",
35
+ "default": 20,
36
+ "required": false,
37
+ "help": "Number of items (max 50)"
38
+ },
39
+ {
40
+ "name": "type",
41
+ "type": "string",
42
+ "default": "catalog",
43
+ "required": false,
44
+ "help": "List type: renqi (人气), zonghe (综合), shoucang (收藏), catalog (热门资讯)"
45
+ }
46
+ ],
47
+ "type": "ts",
48
+ "modulePath": "36kr/hot.js",
49
+ "domain": "www.36kr.com",
50
+ "columns": [
51
+ "rank",
52
+ "title",
53
+ "url"
54
+ ]
55
+ },
56
+ {
57
+ "site": "36kr",
58
+ "name": "news",
59
+ "description": "Latest tech/startup news from 36kr (36氪)",
60
+ "strategy": "public",
61
+ "browser": false,
62
+ "args": [
63
+ {
64
+ "name": "limit",
65
+ "type": "int",
66
+ "default": 20,
67
+ "required": false,
68
+ "help": "Number of articles (max 50)"
69
+ }
70
+ ],
71
+ "type": "ts",
72
+ "modulePath": "36kr/news.js",
73
+ "domain": "www.36kr.com",
74
+ "columns": [
75
+ "rank",
76
+ "title",
77
+ "summary",
78
+ "date",
79
+ "url"
80
+ ]
81
+ },
82
+ {
83
+ "site": "36kr",
84
+ "name": "search",
85
+ "description": "搜索36氪文章",
86
+ "strategy": "intercept",
87
+ "browser": true,
88
+ "args": [
89
+ {
90
+ "name": "query",
91
+ "type": "str",
92
+ "required": true,
93
+ "positional": true,
94
+ "help": "Search keyword (e.g. "
95
+ },
96
+ {
97
+ "name": "limit",
98
+ "type": "int",
99
+ "default": 20,
100
+ "required": false,
101
+ "help": "Number of results (max 50)"
102
+ }
103
+ ],
104
+ "type": "ts",
105
+ "modulePath": "36kr/search.js",
106
+ "domain": "www.36kr.com",
107
+ "columns": [
108
+ "rank",
109
+ "title",
110
+ "date",
111
+ "url"
112
+ ]
113
+ },
2
114
  {
3
115
  "site": "_shared",
4
116
  "name": "desktop-commands",
@@ -219,7 +331,8 @@
219
331
  "title",
220
332
  "author",
221
333
  "episodes",
222
- "genre"
334
+ "genre",
335
+ "url"
223
336
  ]
224
337
  },
225
338
  {
@@ -307,7 +420,8 @@
307
420
  "id",
308
421
  "title",
309
422
  "authors",
310
- "published"
423
+ "published",
424
+ "url"
311
425
  ]
312
426
  },
313
427
  {
@@ -510,6 +624,40 @@
510
624
  "url"
511
625
  ]
512
626
  },
627
+ {
628
+ "site": "bilibili",
629
+ "name": "comments",
630
+ "description": "获取 B站视频评论(使用官方 API + WBI 签名)",
631
+ "strategy": "cookie",
632
+ "browser": true,
633
+ "args": [
634
+ {
635
+ "name": "bvid",
636
+ "type": "str",
637
+ "required": true,
638
+ "positional": true,
639
+ "help": "Video BV ID (e.g. BV1WtAGzYEBm)"
640
+ },
641
+ {
642
+ "name": "limit",
643
+ "type": "int",
644
+ "default": 20,
645
+ "required": false,
646
+ "help": "Number of comments (max 50)"
647
+ }
648
+ ],
649
+ "type": "ts",
650
+ "modulePath": "bilibili/comments.js",
651
+ "domain": "www.bilibili.com",
652
+ "columns": [
653
+ "rank",
654
+ "author",
655
+ "text",
656
+ "likes",
657
+ "replies",
658
+ "time"
659
+ ]
660
+ },
513
661
  {
514
662
  "site": "bilibili",
515
663
  "name": "download",
@@ -719,6 +867,7 @@
719
867
  "type": "int",
720
868
  "default": 20,
721
869
  "required": false,
870
+ "positional": false,
722
871
  "help": "Number of videos"
723
872
  }
724
873
  ],
@@ -1802,6 +1951,12 @@
1802
1951
  "positional": true,
1803
1952
  "help": "Prompt to send"
1804
1953
  },
1954
+ {
1955
+ "name": "model",
1956
+ "type": "str",
1957
+ "required": false,
1958
+ "help": "Model/mode to use: auto, instant, thinking, 5.2-instant, 5.2-thinking"
1959
+ },
1805
1960
  {
1806
1961
  "name": "timeout",
1807
1962
  "type": "str",
@@ -1818,6 +1973,29 @@
1818
1973
  "Text"
1819
1974
  ]
1820
1975
  },
1976
+ {
1977
+ "site": "chatgpt",
1978
+ "name": "model",
1979
+ "description": "Switch ChatGPT Desktop model/mode (auto, instant, thinking, 5.2-instant, 5.2-thinking)",
1980
+ "strategy": "public",
1981
+ "browser": false,
1982
+ "args": [
1983
+ {
1984
+ "name": "model",
1985
+ "type": "str",
1986
+ "required": true,
1987
+ "positional": true,
1988
+ "help": "Model to switch to"
1989
+ }
1990
+ ],
1991
+ "type": "ts",
1992
+ "modulePath": "chatgpt/model.js",
1993
+ "domain": "localhost",
1994
+ "columns": [
1995
+ "Status",
1996
+ "Model"
1997
+ ]
1998
+ },
1821
1999
  {
1822
2000
  "site": "chatgpt",
1823
2001
  "name": "new",
@@ -1860,6 +2038,12 @@
1860
2038
  "required": true,
1861
2039
  "positional": true,
1862
2040
  "help": "Message to send"
2041
+ },
2042
+ {
2043
+ "name": "model",
2044
+ "type": "str",
2045
+ "required": false,
2046
+ "help": "Model/mode to use: auto, instant, thinking, 5.2-instant, 5.2-thinking"
1863
2047
  }
1864
2048
  ],
1865
2049
  "type": "ts",
@@ -2459,6 +2643,7 @@
2459
2643
  "type": "int",
2460
2644
  "default": 20,
2461
2645
  "required": false,
2646
+ "positional": false,
2462
2647
  "help": "Number of articles"
2463
2648
  }
2464
2649
  ],
@@ -2506,6 +2691,7 @@
2506
2691
  "type": "int",
2507
2692
  "default": 20,
2508
2693
  "required": false,
2694
+ "positional": false,
2509
2695
  "help": "Number of articles"
2510
2696
  }
2511
2697
  ],
@@ -2560,6 +2746,7 @@
2560
2746
  "type": "int",
2561
2747
  "default": 20,
2562
2748
  "required": false,
2749
+ "positional": false,
2563
2750
  "help": "Number of articles"
2564
2751
  }
2565
2752
  ],
@@ -2872,6 +3059,58 @@
2872
3059
  "url"
2873
3060
  ]
2874
3061
  },
3062
+ {
3063
+ "site": "douban",
3064
+ "name": "download",
3065
+ "description": "下载电影海报/剧照图片",
3066
+ "strategy": "cookie",
3067
+ "browser": true,
3068
+ "args": [
3069
+ {
3070
+ "name": "id",
3071
+ "type": "str",
3072
+ "required": true,
3073
+ "positional": true,
3074
+ "help": "电影 subject ID"
3075
+ },
3076
+ {
3077
+ "name": "type",
3078
+ "type": "str",
3079
+ "default": "Rb",
3080
+ "required": false,
3081
+ "help": "豆瓣 photos 的 type 参数,默认 Rb(海报)"
3082
+ },
3083
+ {
3084
+ "name": "limit",
3085
+ "type": "int",
3086
+ "default": 120,
3087
+ "required": false,
3088
+ "help": "最多下载多少张图片"
3089
+ },
3090
+ {
3091
+ "name": "photo-id",
3092
+ "type": "str",
3093
+ "required": false,
3094
+ "help": "只下载指定 photo_id 的图片"
3095
+ },
3096
+ {
3097
+ "name": "output",
3098
+ "type": "str",
3099
+ "default": "./douban-downloads",
3100
+ "required": false,
3101
+ "help": "输出目录"
3102
+ }
3103
+ ],
3104
+ "type": "ts",
3105
+ "modulePath": "douban/download.js",
3106
+ "domain": "movie.douban.com",
3107
+ "columns": [
3108
+ "index",
3109
+ "title",
3110
+ "status",
3111
+ "size"
3112
+ ]
3113
+ },
2875
3114
  {
2876
3115
  "site": "douban",
2877
3116
  "name": "marks",
@@ -2948,6 +3187,45 @@
2948
3187
  "url"
2949
3188
  ]
2950
3189
  },
3190
+ {
3191
+ "site": "douban",
3192
+ "name": "photos",
3193
+ "description": "获取电影海报/剧照图片列表",
3194
+ "strategy": "cookie",
3195
+ "browser": true,
3196
+ "args": [
3197
+ {
3198
+ "name": "id",
3199
+ "type": "str",
3200
+ "required": true,
3201
+ "positional": true,
3202
+ "help": "电影 subject ID"
3203
+ },
3204
+ {
3205
+ "name": "type",
3206
+ "type": "str",
3207
+ "default": "Rb",
3208
+ "required": false,
3209
+ "help": "豆瓣 photos 的 type 参数,默认 Rb(海报)"
3210
+ },
3211
+ {
3212
+ "name": "limit",
3213
+ "type": "int",
3214
+ "default": 120,
3215
+ "required": false,
3216
+ "help": "最多返回多少张图片"
3217
+ }
3218
+ ],
3219
+ "type": "ts",
3220
+ "modulePath": "douban/photos.js",
3221
+ "domain": "movie.douban.com",
3222
+ "columns": [
3223
+ "index",
3224
+ "title",
3225
+ "image_url",
3226
+ "detail_url"
3227
+ ]
3228
+ },
2951
3229
  {
2952
3230
  "site": "douban",
2953
3231
  "name": "reviews",
@@ -3085,6 +3363,7 @@
3085
3363
  "type": "int",
3086
3364
  "default": 250,
3087
3365
  "required": false,
3366
+ "positional": false,
3088
3367
  "help": "返回结果数量"
3089
3368
  }
3090
3369
  ],
@@ -3346,27 +3625,493 @@
3346
3625
  ]
3347
3626
  },
3348
3627
  {
3349
- "site": "facebook",
3350
- "name": "add-friend",
3351
- "description": "Send a friend request on Facebook",
3352
- "domain": "www.facebook.com",
3628
+ "site": "douyin",
3629
+ "name": "activities",
3630
+ "description": "官方活动列表",
3631
+ "strategy": "cookie",
3632
+ "browser": true,
3633
+ "args": [],
3634
+ "type": "ts",
3635
+ "modulePath": "douyin/activities.js",
3636
+ "domain": "creator.douyin.com",
3637
+ "columns": [
3638
+ "activity_id",
3639
+ "title",
3640
+ "end_time"
3641
+ ]
3642
+ },
3643
+ {
3644
+ "site": "douyin",
3645
+ "name": "collections",
3646
+ "description": "合集列表",
3353
3647
  "strategy": "cookie",
3354
3648
  "browser": true,
3355
3649
  "args": [
3356
3650
  {
3357
- "name": "username",
3358
- "type": "str",
3359
- "required": true,
3360
- "positional": true,
3361
- "help": "Facebook username or profile URL"
3651
+ "name": "limit",
3652
+ "type": "int",
3653
+ "default": 20,
3654
+ "required": false,
3655
+ "help": ""
3362
3656
  }
3363
3657
  ],
3658
+ "type": "ts",
3659
+ "modulePath": "douyin/collections.js",
3660
+ "domain": "creator.douyin.com",
3364
3661
  "columns": [
3365
- "status",
3366
- "username"
3367
- ],
3368
- "pipeline": [
3369
- {
3662
+ "mix_id",
3663
+ "name",
3664
+ "item_count"
3665
+ ]
3666
+ },
3667
+ {
3668
+ "site": "douyin",
3669
+ "name": "delete",
3670
+ "description": "删除作品",
3671
+ "strategy": "cookie",
3672
+ "browser": true,
3673
+ "args": [
3674
+ {
3675
+ "name": "aweme_id",
3676
+ "type": "str",
3677
+ "required": true,
3678
+ "positional": true,
3679
+ "help": "作品 ID"
3680
+ }
3681
+ ],
3682
+ "type": "ts",
3683
+ "modulePath": "douyin/delete.js",
3684
+ "domain": "creator.douyin.com",
3685
+ "columns": [
3686
+ "status"
3687
+ ]
3688
+ },
3689
+ {
3690
+ "site": "douyin",
3691
+ "name": "draft",
3692
+ "description": "上传视频并保存为草稿",
3693
+ "strategy": "cookie",
3694
+ "browser": true,
3695
+ "args": [
3696
+ {
3697
+ "name": "video",
3698
+ "type": "str",
3699
+ "required": true,
3700
+ "positional": true,
3701
+ "help": "视频文件路径"
3702
+ },
3703
+ {
3704
+ "name": "title",
3705
+ "type": "str",
3706
+ "required": true,
3707
+ "help": "视频标题(≤30字)"
3708
+ },
3709
+ {
3710
+ "name": "caption",
3711
+ "type": "str",
3712
+ "default": "",
3713
+ "required": false,
3714
+ "help": "正文内容(≤1000字,支持 #话题)"
3715
+ },
3716
+ {
3717
+ "name": "cover",
3718
+ "type": "str",
3719
+ "default": "",
3720
+ "required": false,
3721
+ "help": "封面图片路径"
3722
+ },
3723
+ {
3724
+ "name": "visibility",
3725
+ "type": "str",
3726
+ "default": "public",
3727
+ "required": false,
3728
+ "help": "",
3729
+ "choices": [
3730
+ "public",
3731
+ "friends",
3732
+ "private"
3733
+ ]
3734
+ }
3735
+ ],
3736
+ "type": "ts",
3737
+ "modulePath": "douyin/draft.js",
3738
+ "domain": "creator.douyin.com",
3739
+ "columns": [
3740
+ "status",
3741
+ "aweme_id"
3742
+ ]
3743
+ },
3744
+ {
3745
+ "site": "douyin",
3746
+ "name": "drafts",
3747
+ "description": "获取草稿列表",
3748
+ "strategy": "cookie",
3749
+ "browser": true,
3750
+ "args": [
3751
+ {
3752
+ "name": "limit",
3753
+ "type": "int",
3754
+ "default": 20,
3755
+ "required": false,
3756
+ "help": ""
3757
+ }
3758
+ ],
3759
+ "type": "ts",
3760
+ "modulePath": "douyin/drafts.js",
3761
+ "domain": "creator.douyin.com",
3762
+ "columns": [
3763
+ "aweme_id",
3764
+ "title",
3765
+ "create_time"
3766
+ ]
3767
+ },
3768
+ {
3769
+ "site": "douyin",
3770
+ "name": "hashtag",
3771
+ "description": "话题搜索 / AI推荐 / 热点词",
3772
+ "strategy": "cookie",
3773
+ "browser": true,
3774
+ "args": [
3775
+ {
3776
+ "name": "action",
3777
+ "type": "str",
3778
+ "required": true,
3779
+ "positional": true,
3780
+ "help": "search=关键词搜索 suggest=AI推荐 hot=热点词",
3781
+ "choices": [
3782
+ "search",
3783
+ "suggest",
3784
+ "hot"
3785
+ ]
3786
+ },
3787
+ {
3788
+ "name": "keyword",
3789
+ "type": "str",
3790
+ "default": "",
3791
+ "required": false,
3792
+ "help": "搜索关键词(search/hot 使用)"
3793
+ },
3794
+ {
3795
+ "name": "cover",
3796
+ "type": "str",
3797
+ "default": "",
3798
+ "required": false,
3799
+ "help": "封面 URI(suggest 使用)"
3800
+ },
3801
+ {
3802
+ "name": "limit",
3803
+ "type": "int",
3804
+ "default": 10,
3805
+ "required": false,
3806
+ "help": ""
3807
+ }
3808
+ ],
3809
+ "type": "ts",
3810
+ "modulePath": "douyin/hashtag.js",
3811
+ "domain": "creator.douyin.com",
3812
+ "columns": [
3813
+ "name",
3814
+ "id",
3815
+ "view_count"
3816
+ ]
3817
+ },
3818
+ {
3819
+ "site": "douyin",
3820
+ "name": "location",
3821
+ "description": "地理位置 POI 搜索",
3822
+ "strategy": "cookie",
3823
+ "browser": true,
3824
+ "args": [
3825
+ {
3826
+ "name": "query",
3827
+ "type": "str",
3828
+ "required": true,
3829
+ "positional": true,
3830
+ "help": "地名关键词"
3831
+ },
3832
+ {
3833
+ "name": "limit",
3834
+ "type": "int",
3835
+ "default": 20,
3836
+ "required": false,
3837
+ "help": ""
3838
+ }
3839
+ ],
3840
+ "type": "ts",
3841
+ "modulePath": "douyin/location.js",
3842
+ "domain": "creator.douyin.com",
3843
+ "columns": [
3844
+ "poi_id",
3845
+ "name",
3846
+ "address",
3847
+ "city"
3848
+ ]
3849
+ },
3850
+ {
3851
+ "site": "douyin",
3852
+ "name": "profile",
3853
+ "description": "获取账号信息",
3854
+ "strategy": "cookie",
3855
+ "browser": true,
3856
+ "args": [],
3857
+ "type": "ts",
3858
+ "modulePath": "douyin/profile.js",
3859
+ "domain": "creator.douyin.com",
3860
+ "columns": [
3861
+ "uid",
3862
+ "nickname",
3863
+ "follower_count",
3864
+ "following_count",
3865
+ "aweme_count"
3866
+ ]
3867
+ },
3868
+ {
3869
+ "site": "douyin",
3870
+ "name": "publish",
3871
+ "description": "定时发布视频到抖音(必须设置 2h ~ 14天后的发布时间)",
3872
+ "strategy": "cookie",
3873
+ "browser": true,
3874
+ "args": [
3875
+ {
3876
+ "name": "video",
3877
+ "type": "str",
3878
+ "required": true,
3879
+ "positional": true,
3880
+ "help": "视频文件路径"
3881
+ },
3882
+ {
3883
+ "name": "title",
3884
+ "type": "str",
3885
+ "required": true,
3886
+ "help": "视频标题(≤30字)"
3887
+ },
3888
+ {
3889
+ "name": "schedule",
3890
+ "type": "str",
3891
+ "required": true,
3892
+ "help": "定时发布时间(ISO8601 或 Unix 秒,2h ~ 14天后)"
3893
+ },
3894
+ {
3895
+ "name": "caption",
3896
+ "type": "str",
3897
+ "default": "",
3898
+ "required": false,
3899
+ "help": "正文内容(≤1000字,支持 #话题)"
3900
+ },
3901
+ {
3902
+ "name": "cover",
3903
+ "type": "str",
3904
+ "default": "",
3905
+ "required": false,
3906
+ "help": "封面图片路径(不提供时使用视频截帧)"
3907
+ },
3908
+ {
3909
+ "name": "visibility",
3910
+ "type": "str",
3911
+ "default": "public",
3912
+ "required": false,
3913
+ "help": "",
3914
+ "choices": [
3915
+ "public",
3916
+ "friends",
3917
+ "private"
3918
+ ]
3919
+ },
3920
+ {
3921
+ "name": "allow_download",
3922
+ "type": "bool",
3923
+ "default": false,
3924
+ "required": false,
3925
+ "help": "允许下载"
3926
+ },
3927
+ {
3928
+ "name": "collection",
3929
+ "type": "str",
3930
+ "default": "",
3931
+ "required": false,
3932
+ "help": "合集 ID"
3933
+ },
3934
+ {
3935
+ "name": "activity",
3936
+ "type": "str",
3937
+ "default": "",
3938
+ "required": false,
3939
+ "help": "活动 ID"
3940
+ },
3941
+ {
3942
+ "name": "poi_id",
3943
+ "type": "str",
3944
+ "default": "",
3945
+ "required": false,
3946
+ "help": "地理位置 ID"
3947
+ },
3948
+ {
3949
+ "name": "poi_name",
3950
+ "type": "str",
3951
+ "default": "",
3952
+ "required": false,
3953
+ "help": "地理位置名称"
3954
+ },
3955
+ {
3956
+ "name": "hotspot",
3957
+ "type": "str",
3958
+ "default": "",
3959
+ "required": false,
3960
+ "help": "关联热点词"
3961
+ },
3962
+ {
3963
+ "name": "no_safety_check",
3964
+ "type": "bool",
3965
+ "default": false,
3966
+ "required": false,
3967
+ "help": "跳过内容安全检测"
3968
+ },
3969
+ {
3970
+ "name": "sync_toutiao",
3971
+ "type": "bool",
3972
+ "default": false,
3973
+ "required": false,
3974
+ "help": "同步发布到头条"
3975
+ }
3976
+ ],
3977
+ "type": "ts",
3978
+ "modulePath": "douyin/publish.js",
3979
+ "domain": "creator.douyin.com",
3980
+ "columns": [
3981
+ "status",
3982
+ "aweme_id",
3983
+ "url",
3984
+ "publish_time"
3985
+ ]
3986
+ },
3987
+ {
3988
+ "site": "douyin",
3989
+ "name": "stats",
3990
+ "description": "作品数据分析",
3991
+ "strategy": "cookie",
3992
+ "browser": true,
3993
+ "args": [
3994
+ {
3995
+ "name": "aweme_id",
3996
+ "type": "str",
3997
+ "required": true,
3998
+ "positional": true,
3999
+ "help": ""
4000
+ }
4001
+ ],
4002
+ "type": "ts",
4003
+ "modulePath": "douyin/stats.js",
4004
+ "domain": "creator.douyin.com",
4005
+ "columns": [
4006
+ "metric",
4007
+ "value"
4008
+ ]
4009
+ },
4010
+ {
4011
+ "site": "douyin",
4012
+ "name": "update",
4013
+ "description": "更新视频信息",
4014
+ "strategy": "cookie",
4015
+ "browser": true,
4016
+ "args": [
4017
+ {
4018
+ "name": "aweme_id",
4019
+ "type": "str",
4020
+ "required": true,
4021
+ "positional": true,
4022
+ "help": ""
4023
+ },
4024
+ {
4025
+ "name": "reschedule",
4026
+ "type": "str",
4027
+ "default": "",
4028
+ "required": false,
4029
+ "help": "新的发布时间(ISO8601 或 Unix 秒)"
4030
+ },
4031
+ {
4032
+ "name": "caption",
4033
+ "type": "str",
4034
+ "default": "",
4035
+ "required": false,
4036
+ "help": "新的正文内容"
4037
+ }
4038
+ ],
4039
+ "type": "ts",
4040
+ "modulePath": "douyin/update.js",
4041
+ "domain": "creator.douyin.com",
4042
+ "columns": [
4043
+ "status"
4044
+ ]
4045
+ },
4046
+ {
4047
+ "site": "douyin",
4048
+ "name": "videos",
4049
+ "description": "获取作品列表",
4050
+ "strategy": "cookie",
4051
+ "browser": true,
4052
+ "args": [
4053
+ {
4054
+ "name": "limit",
4055
+ "type": "int",
4056
+ "default": 20,
4057
+ "required": false,
4058
+ "help": "每页数量"
4059
+ },
4060
+ {
4061
+ "name": "page",
4062
+ "type": "int",
4063
+ "default": 1,
4064
+ "required": false,
4065
+ "help": "页码"
4066
+ },
4067
+ {
4068
+ "name": "status",
4069
+ "type": "str",
4070
+ "default": "all",
4071
+ "required": false,
4072
+ "help": "",
4073
+ "choices": [
4074
+ "all",
4075
+ "published",
4076
+ "reviewing",
4077
+ "scheduled"
4078
+ ]
4079
+ }
4080
+ ],
4081
+ "type": "ts",
4082
+ "modulePath": "douyin/videos.js",
4083
+ "domain": "creator.douyin.com",
4084
+ "columns": [
4085
+ "aweme_id",
4086
+ "title",
4087
+ "status",
4088
+ "play_count",
4089
+ "digg_count",
4090
+ "create_time"
4091
+ ]
4092
+ },
4093
+ {
4094
+ "site": "facebook",
4095
+ "name": "add-friend",
4096
+ "description": "Send a friend request on Facebook",
4097
+ "domain": "www.facebook.com",
4098
+ "strategy": "cookie",
4099
+ "browser": true,
4100
+ "args": [
4101
+ {
4102
+ "name": "username",
4103
+ "type": "str",
4104
+ "required": true,
4105
+ "positional": true,
4106
+ "help": "Facebook username or profile URL"
4107
+ }
4108
+ ],
4109
+ "columns": [
4110
+ "status",
4111
+ "username"
4112
+ ],
4113
+ "pipeline": [
4114
+ {
3370
4115
  "navigate": {
3371
4116
  "url": "https://www.facebook.com/${{ args.username }}",
3372
4117
  "settleMs": 3000
@@ -3391,6 +4136,7 @@
3391
4136
  "type": "int",
3392
4137
  "default": 15,
3393
4138
  "required": false,
4139
+ "positional": false,
3394
4140
  "help": "Number of categories"
3395
4141
  }
3396
4142
  ],
@@ -3424,6 +4170,7 @@
3424
4170
  "type": "int",
3425
4171
  "default": 10,
3426
4172
  "required": false,
4173
+ "positional": false,
3427
4174
  "help": "Number of posts"
3428
4175
  }
3429
4176
  ],
@@ -3461,6 +4208,7 @@
3461
4208
  "type": "int",
3462
4209
  "default": 10,
3463
4210
  "required": false,
4211
+ "positional": false,
3464
4212
  "help": "Number of friend suggestions"
3465
4213
  }
3466
4214
  ],
@@ -3495,6 +4243,7 @@
3495
4243
  "type": "int",
3496
4244
  "default": 20,
3497
4245
  "required": false,
4246
+ "positional": false,
3498
4247
  "help": "Number of groups"
3499
4248
  }
3500
4249
  ],
@@ -3563,6 +4312,7 @@
3563
4312
  "type": "int",
3564
4313
  "default": 10,
3565
4314
  "required": false,
4315
+ "positional": false,
3566
4316
  "help": "Number of memories"
3567
4317
  }
3568
4318
  ],
@@ -3598,6 +4348,7 @@
3598
4348
  "type": "int",
3599
4349
  "default": 15,
3600
4350
  "required": false,
4351
+ "positional": false,
3601
4352
  "help": "Number of notifications"
3602
4353
  }
3603
4354
  ],
@@ -3675,6 +4426,7 @@
3675
4426
  "type": "int",
3676
4427
  "default": 10,
3677
4428
  "required": false,
4429
+ "positional": false,
3678
4430
  "help": "Number of results"
3679
4431
  }
3680
4432
  ],
@@ -3892,6 +4644,7 @@
3892
4644
  "type": "int",
3893
4645
  "default": 20,
3894
4646
  "required": false,
4647
+ "positional": false,
3895
4648
  "help": "Number of stories"
3896
4649
  }
3897
4650
  ],
@@ -3953,6 +4706,7 @@
3953
4706
  "type": "int",
3954
4707
  "default": 20,
3955
4708
  "required": false,
4709
+ "positional": false,
3956
4710
  "help": "Number of stories"
3957
4711
  }
3958
4712
  ],
@@ -4014,6 +4768,7 @@
4014
4768
  "type": "int",
4015
4769
  "default": 20,
4016
4770
  "required": false,
4771
+ "positional": false,
4017
4772
  "help": "Number of job postings"
4018
4773
  }
4019
4774
  ],
@@ -4072,6 +4827,7 @@
4072
4827
  "type": "int",
4073
4828
  "default": 20,
4074
4829
  "required": false,
4830
+ "positional": false,
4075
4831
  "help": "Number of stories"
4076
4832
  }
4077
4833
  ],
@@ -4140,6 +4896,7 @@
4140
4896
  "type": "int",
4141
4897
  "default": 20,
4142
4898
  "required": false,
4899
+ "positional": false,
4143
4900
  "help": "Number of results"
4144
4901
  },
4145
4902
  {
@@ -4147,6 +4904,7 @@
4147
4904
  "type": "str",
4148
4905
  "default": "relevance",
4149
4906
  "required": false,
4907
+ "positional": false,
4150
4908
  "help": "Sort by relevance or date",
4151
4909
  "choices": [
4152
4910
  "relevance",
@@ -4159,7 +4917,8 @@
4159
4917
  "title",
4160
4918
  "score",
4161
4919
  "author",
4162
- "comments"
4920
+ "comments",
4921
+ "url"
4163
4922
  ],
4164
4923
  "pipeline": [
4165
4924
  {
@@ -4204,6 +4963,7 @@
4204
4963
  "type": "int",
4205
4964
  "default": 20,
4206
4965
  "required": false,
4966
+ "positional": false,
4207
4967
  "help": "Number of stories"
4208
4968
  }
4209
4969
  ],
@@ -4265,6 +5025,7 @@
4265
5025
  "type": "int",
4266
5026
  "default": 20,
4267
5027
  "required": false,
5028
+ "positional": false,
4268
5029
  "help": "Number of stories"
4269
5030
  }
4270
5031
  ],
@@ -4342,59 +5103,233 @@
4342
5103
  }
4343
5104
  },
4344
5105
  {
4345
- "map": {
4346
- "username": "${{ item.id }}",
4347
- "karma": "${{ item.karma }}",
4348
- "created": "${{ item.created ? new Date(item.created * 1000).toISOString().slice(0, 10) : '' }}",
4349
- "about": "${{ item.about }}"
4350
- }
5106
+ "map": {
5107
+ "username": "${{ item.id }}",
5108
+ "karma": "${{ item.karma }}",
5109
+ "created": "${{ item.created ? new Date(item.created * 1000).toISOString().slice(0, 10) : '' }}",
5110
+ "about": "${{ item.about }}"
5111
+ }
5112
+ }
5113
+ ],
5114
+ "type": "yaml"
5115
+ },
5116
+ {
5117
+ "site": "hf",
5118
+ "name": "top",
5119
+ "description": "Top upvoted Hugging Face papers",
5120
+ "strategy": "public",
5121
+ "browser": false,
5122
+ "args": [
5123
+ {
5124
+ "name": "limit",
5125
+ "type": "int",
5126
+ "default": 20,
5127
+ "required": false,
5128
+ "help": "Number of papers"
5129
+ },
5130
+ {
5131
+ "name": "all",
5132
+ "type": "bool",
5133
+ "default": false,
5134
+ "required": false,
5135
+ "help": "Return all papers (ignore limit)"
5136
+ },
5137
+ {
5138
+ "name": "date",
5139
+ "type": "str",
5140
+ "required": false,
5141
+ "help": "Date (YYYY-MM-DD), defaults to most recent"
5142
+ },
5143
+ {
5144
+ "name": "period",
5145
+ "type": "str",
5146
+ "default": "daily",
5147
+ "required": false,
5148
+ "help": "Time period: daily, weekly, or monthly",
5149
+ "choices": [
5150
+ "daily",
5151
+ "weekly",
5152
+ "monthly"
5153
+ ]
5154
+ }
5155
+ ],
5156
+ "type": "ts",
5157
+ "modulePath": "hf/top.js",
5158
+ "domain": "huggingface.co"
5159
+ },
5160
+ {
5161
+ "site": "imdb",
5162
+ "name": "person",
5163
+ "description": "Get actor or director info",
5164
+ "strategy": "public",
5165
+ "browser": true,
5166
+ "args": [
5167
+ {
5168
+ "name": "id",
5169
+ "type": "str",
5170
+ "required": true,
5171
+ "positional": true,
5172
+ "help": "IMDb person ID (nm0634240) or URL"
5173
+ },
5174
+ {
5175
+ "name": "limit",
5176
+ "type": "int",
5177
+ "default": 10,
5178
+ "required": false,
5179
+ "help": "Max filmography entries"
5180
+ }
5181
+ ],
5182
+ "type": "ts",
5183
+ "modulePath": "imdb/person.js",
5184
+ "domain": "www.imdb.com",
5185
+ "columns": [
5186
+ "field",
5187
+ "value"
5188
+ ]
5189
+ },
5190
+ {
5191
+ "site": "imdb",
5192
+ "name": "reviews",
5193
+ "description": "Get user reviews for a movie or TV show",
5194
+ "strategy": "public",
5195
+ "browser": true,
5196
+ "args": [
5197
+ {
5198
+ "name": "id",
5199
+ "type": "str",
5200
+ "required": true,
5201
+ "positional": true,
5202
+ "help": "IMDb title ID (tt1375666) or URL"
5203
+ },
5204
+ {
5205
+ "name": "limit",
5206
+ "type": "int",
5207
+ "default": 10,
5208
+ "required": false,
5209
+ "help": "Number of reviews"
5210
+ }
5211
+ ],
5212
+ "type": "ts",
5213
+ "modulePath": "imdb/reviews.js",
5214
+ "domain": "www.imdb.com",
5215
+ "columns": [
5216
+ "rank",
5217
+ "title",
5218
+ "rating",
5219
+ "author",
5220
+ "date",
5221
+ "text"
5222
+ ]
5223
+ },
5224
+ {
5225
+ "site": "imdb",
5226
+ "name": "search",
5227
+ "description": "Search IMDb for movies, TV shows, and people",
5228
+ "strategy": "public",
5229
+ "browser": true,
5230
+ "args": [
5231
+ {
5232
+ "name": "query",
5233
+ "type": "str",
5234
+ "required": true,
5235
+ "positional": true,
5236
+ "help": "Search query"
5237
+ },
5238
+ {
5239
+ "name": "limit",
5240
+ "type": "int",
5241
+ "default": 20,
5242
+ "required": false,
5243
+ "help": "Number of results"
5244
+ }
5245
+ ],
5246
+ "type": "ts",
5247
+ "modulePath": "imdb/search.js",
5248
+ "domain": "www.imdb.com",
5249
+ "columns": [
5250
+ "rank",
5251
+ "id",
5252
+ "title",
5253
+ "year",
5254
+ "type",
5255
+ "url"
5256
+ ]
5257
+ },
5258
+ {
5259
+ "site": "imdb",
5260
+ "name": "title",
5261
+ "description": "Get movie or TV show details",
5262
+ "strategy": "public",
5263
+ "browser": true,
5264
+ "args": [
5265
+ {
5266
+ "name": "id",
5267
+ "type": "str",
5268
+ "required": true,
5269
+ "positional": true,
5270
+ "help": "IMDb title ID (tt1375666) or URL"
4351
5271
  }
4352
5272
  ],
4353
- "type": "yaml"
5273
+ "type": "ts",
5274
+ "modulePath": "imdb/title.js",
5275
+ "domain": "www.imdb.com",
5276
+ "columns": [
5277
+ "field",
5278
+ "value"
5279
+ ]
4354
5280
  },
4355
5281
  {
4356
- "site": "hf",
5282
+ "site": "imdb",
4357
5283
  "name": "top",
4358
- "description": "Top upvoted Hugging Face papers",
5284
+ "description": "IMDb Top 250 Movies",
4359
5285
  "strategy": "public",
4360
- "browser": false,
5286
+ "browser": true,
4361
5287
  "args": [
4362
5288
  {
4363
5289
  "name": "limit",
4364
5290
  "type": "int",
4365
5291
  "default": 20,
4366
5292
  "required": false,
4367
- "help": "Number of papers"
4368
- },
4369
- {
4370
- "name": "all",
4371
- "type": "bool",
4372
- "default": false,
4373
- "required": false,
4374
- "help": "Return all papers (ignore limit)"
4375
- },
4376
- {
4377
- "name": "date",
4378
- "type": "str",
4379
- "required": false,
4380
- "help": "Date (YYYY-MM-DD), defaults to most recent"
4381
- },
5293
+ "help": "Number of results"
5294
+ }
5295
+ ],
5296
+ "type": "ts",
5297
+ "modulePath": "imdb/top.js",
5298
+ "domain": "www.imdb.com",
5299
+ "columns": [
5300
+ "rank",
5301
+ "title",
5302
+ "rating",
5303
+ "votes",
5304
+ "genre",
5305
+ "url"
5306
+ ]
5307
+ },
5308
+ {
5309
+ "site": "imdb",
5310
+ "name": "trending",
5311
+ "description": "IMDb Most Popular Movies",
5312
+ "strategy": "public",
5313
+ "browser": true,
5314
+ "args": [
4382
5315
  {
4383
- "name": "period",
4384
- "type": "str",
4385
- "default": "daily",
5316
+ "name": "limit",
5317
+ "type": "int",
5318
+ "default": 20,
4386
5319
  "required": false,
4387
- "help": "Time period: daily, weekly, or monthly",
4388
- "choices": [
4389
- "daily",
4390
- "weekly",
4391
- "monthly"
4392
- ]
5320
+ "help": "Number of results"
4393
5321
  }
4394
5322
  ],
4395
5323
  "type": "ts",
4396
- "modulePath": "hf/top.js",
4397
- "domain": "huggingface.co"
5324
+ "modulePath": "imdb/trending.js",
5325
+ "domain": "www.imdb.com",
5326
+ "columns": [
5327
+ "rank",
5328
+ "title",
5329
+ "rating",
5330
+ "genre",
5331
+ "url"
5332
+ ]
4398
5333
  },
4399
5334
  {
4400
5335
  "site": "instagram",
@@ -4423,6 +5358,7 @@
4423
5358
  "type": "int",
4424
5359
  "default": 1,
4425
5360
  "required": false,
5361
+ "positional": false,
4426
5362
  "help": "Post index (1 = most recent)"
4427
5363
  }
4428
5364
  ],
@@ -4454,6 +5390,7 @@
4454
5390
  "type": "int",
4455
5391
  "default": 20,
4456
5392
  "required": false,
5393
+ "positional": false,
4457
5394
  "help": "Number of posts"
4458
5395
  }
4459
5396
  ],
@@ -4525,6 +5462,7 @@
4525
5462
  "type": "int",
4526
5463
  "default": 20,
4527
5464
  "required": false,
5465
+ "positional": false,
4528
5466
  "help": "Number of followers"
4529
5467
  }
4530
5468
  ],
@@ -4565,6 +5503,7 @@
4565
5503
  "type": "int",
4566
5504
  "default": 20,
4567
5505
  "required": false,
5506
+ "positional": false,
4568
5507
  "help": "Number of accounts"
4569
5508
  }
4570
5509
  ],
@@ -4605,6 +5544,7 @@
4605
5544
  "type": "int",
4606
5545
  "default": 1,
4607
5546
  "required": false,
5547
+ "positional": false,
4608
5548
  "help": "Post index (1 = most recent)"
4609
5549
  }
4610
5550
  ],
@@ -4678,6 +5618,7 @@
4678
5618
  "type": "int",
4679
5619
  "default": 1,
4680
5620
  "required": false,
5621
+ "positional": false,
4681
5622
  "help": "Post index (1 = most recent)"
4682
5623
  }
4683
5624
  ],
@@ -4709,6 +5650,7 @@
4709
5650
  "type": "int",
4710
5651
  "default": 20,
4711
5652
  "required": false,
5653
+ "positional": false,
4712
5654
  "help": "Number of saved posts"
4713
5655
  }
4714
5656
  ],
@@ -4750,6 +5692,7 @@
4750
5692
  "type": "int",
4751
5693
  "default": 10,
4752
5694
  "required": false,
5695
+ "positional": false,
4753
5696
  "help": "Number of results"
4754
5697
  }
4755
5698
  ],
@@ -4758,14 +5701,15 @@
4758
5701
  "username",
4759
5702
  "name",
4760
5703
  "verified",
4761
- "private"
5704
+ "private",
5705
+ "url"
4762
5706
  ],
4763
5707
  "pipeline": [
4764
5708
  {
4765
5709
  "navigate": "https://www.instagram.com"
4766
5710
  },
4767
5711
  {
4768
- "evaluate": "(async () => {\n const query = ${{ args.query | json }};\n const limit = ${{ args.limit }};\n const res = await fetch(\n 'https://www.instagram.com/web/search/topsearch/?query=' + encodeURIComponent(query) + '&context=user',\n {\n credentials: 'include',\n headers: { 'X-IG-App-ID': '936619743392459' }\n }\n );\n if (!res.ok) throw new Error('HTTP ' + res.status + ' - make sure you are logged in to Instagram');\n const data = await res.json();\n const users = (data?.users || []).slice(0, limit);\n return users.map((item, i) => ({\n rank: i + 1,\n username: item.user?.username || '',\n name: item.user?.full_name || '',\n verified: item.user?.is_verified ? 'Yes' : 'No',\n private: item.user?.is_private ? 'Yes' : 'No',\n }));\n})()\n"
5712
+ "evaluate": "(async () => {\n const query = ${{ args.query | json }};\n const limit = ${{ args.limit }};\n const res = await fetch(\n 'https://www.instagram.com/web/search/topsearch/?query=' + encodeURIComponent(query) + '&context=user',\n {\n credentials: 'include',\n headers: { 'X-IG-App-ID': '936619743392459' }\n }\n );\n if (!res.ok) throw new Error('HTTP ' + res.status + ' - make sure you are logged in to Instagram');\n const data = await res.json();\n const users = (data?.users || []).slice(0, limit);\n return users.map((item, i) => ({\n rank: i + 1,\n username: item.user?.username || '',\n name: item.user?.full_name || '',\n verified: item.user?.is_verified ? 'Yes' : 'No',\n private: item.user?.is_private ? 'Yes' : 'No',\n url: 'https://www.instagram.com/' + (item.user?.username || ''),\n }));\n})()\n"
4769
5713
  }
4770
5714
  ],
4771
5715
  "type": "yaml"
@@ -4820,6 +5764,7 @@
4820
5764
  "type": "int",
4821
5765
  "default": 1,
4822
5766
  "required": false,
5767
+ "positional": false,
4823
5768
  "help": "Post index (1 = most recent)"
4824
5769
  }
4825
5770
  ],
@@ -4858,6 +5803,7 @@
4858
5803
  "type": "int",
4859
5804
  "default": 1,
4860
5805
  "required": false,
5806
+ "positional": false,
4861
5807
  "help": "Post index (1 = most recent)"
4862
5808
  }
4863
5809
  ],
@@ -4896,6 +5842,7 @@
4896
5842
  "type": "int",
4897
5843
  "default": 12,
4898
5844
  "required": false,
5845
+ "positional": false,
4899
5846
  "help": "Number of posts"
4900
5847
  }
4901
5848
  ],
@@ -4920,7 +5867,7 @@
4920
5867
  {
4921
5868
  "site": "jd",
4922
5869
  "name": "item",
4923
- "description": "京东商品详情(价格、主图、详情图、规格参数)",
5870
+ "description": "京东商品详情(价格、店铺、规格参数、AVIF 图片)",
4924
5871
  "strategy": "cookie",
4925
5872
  "browser": true,
4926
5873
  "args": [
@@ -4936,7 +5883,7 @@
4936
5883
  "type": "int",
4937
5884
  "default": 10,
4938
5885
  "required": false,
4939
- "help": "详情图数量(默认10)"
5886
+ "help": "AVIF 图片数量上限(默认10)"
4940
5887
  }
4941
5888
  ],
4942
5889
  "type": "ts",
@@ -4947,8 +5894,7 @@
4947
5894
  "price",
4948
5895
  "shop",
4949
5896
  "specs",
4950
- "mainImages",
4951
- "detailImages"
5897
+ "avifImages"
4952
5898
  ]
4953
5899
  },
4954
5900
  {
@@ -5205,6 +6151,7 @@
5205
6151
  "type": "int",
5206
6152
  "default": 20,
5207
6153
  "required": false,
6154
+ "positional": false,
5208
6155
  "help": "Number of posts"
5209
6156
  }
5210
6157
  ],
@@ -5259,6 +6206,7 @@
5259
6206
  "type": "int",
5260
6207
  "default": 20,
5261
6208
  "required": false,
6209
+ "positional": false,
5262
6210
  "help": "Number of posts"
5263
6211
  }
5264
6212
  ],
@@ -5313,6 +6261,7 @@
5313
6261
  "type": "string",
5314
6262
  "default": "high_aes_general_v50",
5315
6263
  "required": false,
6264
+ "positional": false,
5316
6265
  "help": "模型: high_aes_general_v50 (5.0 Lite), high_aes_general_v42 (4.6), high_aes_general_v40 (4.0)"
5317
6266
  },
5318
6267
  {
@@ -5320,6 +6269,7 @@
5320
6269
  "type": "int",
5321
6270
  "default": 40,
5322
6271
  "required": false,
6272
+ "positional": false,
5323
6273
  "help": "等待生成完成的秒数"
5324
6274
  }
5325
6275
  ],
@@ -5363,6 +6313,7 @@
5363
6313
  "type": "int",
5364
6314
  "default": 5,
5365
6315
  "required": false,
6316
+ "positional": false,
5366
6317
  "help": ""
5367
6318
  }
5368
6319
  ],
@@ -5518,11 +6469,20 @@
5518
6469
  "strategy": "cookie",
5519
6470
  "browser": true,
5520
6471
  "args": [
6472
+ {
6473
+ "name": "subcategories",
6474
+ "type": "boolean",
6475
+ "default": false,
6476
+ "required": false,
6477
+ "positional": false,
6478
+ "help": "Include subcategories"
6479
+ },
5521
6480
  {
5522
6481
  "name": "limit",
5523
6482
  "type": "int",
5524
6483
  "default": 20,
5525
6484
  "required": false,
6485
+ "positional": false,
5526
6486
  "help": "Number of categories"
5527
6487
  }
5528
6488
  ],
@@ -5538,7 +6498,7 @@
5538
6498
  "navigate": "https://linux.do"
5539
6499
  },
5540
6500
  {
5541
- "evaluate": "(async () => {\n const res = await fetch('/categories.json', { credentials: 'include' });\n if (!res.ok) throw new Error('HTTP ' + res.status + ' - 请先登录 linux.do');\n let data;\n try { data = await res.json(); } catch { throw new Error('响应不是有效 JSON - 请先登录 linux.do'); }\n const cats = data?.category_list?.categories || [];\n return cats.slice(0, ${{ args.limit }}).map(c => ({\n name: c.name,\n slug: c.slug,\n id: c.id,\n topics: c.topic_count,\n description: (c.description_text || '').slice(0, 80),\n }));\n})()\n"
6501
+ "evaluate": "(async () => {\n const res = await fetch('/categories.json', { credentials: 'include' });\n if (!res.ok) throw new Error('HTTP ' + res.status + ' - 请先登录 linux.do');\n let data;\n try { data = await res.json(); } catch { throw new Error('响应不是有效 JSON - 请先登录 linux.do'); }\n const cats = data?.category_list?.categories || [];\n const showSub = ${{ args.subcategories }};\n const results = [];\n const limit = ${{ args.limit }};\n for (const c of cats.slice(0, ${{ args.limit }})) {\n results.push({\n name: c.name,\n slug: c.slug,\n id: c.id,\n topics: c.topic_count,\n description: (c.description_text || '').slice(0, 80),\n });\n if (results.length >= limit) break;\n if (showSub && c.subcategory_ids && c.subcategory_ids.length > 0) {\n const subRes = await fetch('/categories.json?parent_category_id=' + c.id, { credentials: 'include' });\n if (subRes.ok) {\n let subData;\n try { subData = await subRes.json(); } catch { continue; }\n const subCats = subData?.category_list?.categories || [];\n for (const sc of subCats) {\n results.push({\n name: c.name + ' / ' + sc.name,\n slug: sc.slug,\n id: sc.id,\n topics: sc.topic_count,\n description: (sc.description_text || '').slice(0, 80),\n });\n if (results.length >= limit) break;\n }\n }\n }\n if (results.length >= limit) break;\n }\n return results;\n})()\n"
5542
6502
  },
5543
6503
  {
5544
6504
  "map": {
@@ -5548,9 +6508,6 @@
5548
6508
  "topics": "${{ item.topics }}",
5549
6509
  "description": "${{ item.description }}"
5550
6510
  }
5551
- },
5552
- {
5553
- "limit": "${{ args.limit }}"
5554
6511
  }
5555
6512
  ],
5556
6513
  "type": "yaml"
@@ -5559,7 +6516,6 @@
5559
6516
  "site": "linux-do",
5560
6517
  "name": "category",
5561
6518
  "description": "linux.do 分类内话题",
5562
- "domain": "linux.do",
5563
6519
  "strategy": "cookie",
5564
6520
  "browser": true,
5565
6521
  "args": [
@@ -5568,57 +6524,60 @@
5568
6524
  "type": "str",
5569
6525
  "required": true,
5570
6526
  "positional": true,
5571
- "help": "Category slug (use 'categories' command to find)"
6527
+ "help": "Category slug (legacy compatibility argument)"
5572
6528
  },
5573
6529
  {
5574
6530
  "name": "id",
5575
6531
  "type": "int",
5576
6532
  "required": true,
5577
6533
  "positional": true,
5578
- "help": "Category ID (use 'categories' command to find)"
6534
+ "help": "Category ID"
5579
6535
  },
5580
6536
  {
5581
6537
  "name": "limit",
5582
6538
  "type": "int",
5583
6539
  "default": 20,
5584
6540
  "required": false,
5585
- "help": "Number of topics"
6541
+ "help": "Number of items (per_page)"
5586
6542
  }
5587
6543
  ],
6544
+ "type": "ts",
6545
+ "modulePath": "linux-do/category.js",
6546
+ "domain": "linux.do",
5588
6547
  "columns": [
5589
- "rank",
5590
6548
  "title",
5591
6549
  "replies",
6550
+ "created",
6551
+ "likes",
5592
6552
  "views",
5593
- "likes"
5594
- ],
5595
- "pipeline": [
5596
- {
5597
- "navigate": "https://linux.do"
5598
- },
5599
- {
5600
- "evaluate": "(async () => {\n const slug = ${{ args.slug | json }};\n const res = await fetch('/c/' + encodeURIComponent(slug) + '/${{ args.id }}.json', { credentials: 'include' });\n if (!res.ok) throw new Error('HTTP ' + res.status + ' - 请先登录 linux.do');\n let data;\n try { data = await res.json(); } catch { throw new Error('响应不是有效 JSON - 请先登录 linux.do'); }\n const topics = data?.topic_list?.topics || [];\n return topics.slice(0, ${{ args.limit }}).map(t => ({\n title: t.title,\n replies: (t.posts_count || 1) - 1,\n views: t.views,\n likes: t.like_count,\n }));\n})()\n"
5601
- },
5602
- {
5603
- "map": {
5604
- "rank": "${{ index + 1 }}",
5605
- "title": "${{ item.title }}",
5606
- "replies": "${{ item.replies }}",
5607
- "views": "${{ item.views }}",
5608
- "likes": "${{ item.likes }}"
5609
- }
5610
- },
5611
- {
5612
- "limit": "${{ args.limit }}"
5613
- }
6553
+ "url"
5614
6554
  ],
5615
- "type": "yaml"
6555
+ "deprecated": "opencli linux-do category is kept for backward compatibility.",
6556
+ "replacedBy": "opencli linux-do feed --category <id-or-name>"
6557
+ },
6558
+ {
6559
+ "site": "linux-do",
6560
+ "name": "feed",
6561
+ "description": "linux.do 话题列表(需登录;支持全站、标签、分类)",
6562
+ "strategy": "cookie",
6563
+ "browser": true,
6564
+ "args": [],
6565
+ "type": "ts",
6566
+ "modulePath": "linux-do/feed.js",
6567
+ "domain": "linux.do",
6568
+ "columns": [
6569
+ "title",
6570
+ "replies",
6571
+ "created",
6572
+ "likes",
6573
+ "views",
6574
+ "url"
6575
+ ]
5616
6576
  },
5617
6577
  {
5618
6578
  "site": "linux-do",
5619
6579
  "name": "hot",
5620
6580
  "description": "linux.do 热门话题",
5621
- "domain": "linux.do",
5622
6581
  "strategy": "cookie",
5623
6582
  "browser": true,
5624
6583
  "args": [
@@ -5627,7 +6586,7 @@
5627
6586
  "type": "int",
5628
6587
  "default": 20,
5629
6588
  "required": false,
5630
- "help": "Number of topics"
6589
+ "help": "Number of items (per_page)"
5631
6590
  },
5632
6591
  {
5633
6592
  "name": "period",
@@ -5640,33 +6599,101 @@
5640
6599
  "daily",
5641
6600
  "weekly",
5642
6601
  "monthly",
6602
+ "quarterly",
5643
6603
  "yearly"
5644
6604
  ]
5645
6605
  }
5646
6606
  ],
6607
+ "type": "ts",
6608
+ "modulePath": "linux-do/hot.js",
6609
+ "domain": "linux.do",
5647
6610
  "columns": [
5648
- "rank",
5649
6611
  "title",
5650
6612
  "replies",
6613
+ "created",
6614
+ "likes",
5651
6615
  "views",
6616
+ "url"
6617
+ ],
6618
+ "deprecated": "opencli linux-do hot is kept for backward compatibility.",
6619
+ "replacedBy": "opencli linux-do feed --view top --period <period>"
6620
+ },
6621
+ {
6622
+ "site": "linux-do",
6623
+ "name": "latest",
6624
+ "description": "linux.do 最新话题",
6625
+ "strategy": "cookie",
6626
+ "browser": true,
6627
+ "args": [
6628
+ {
6629
+ "name": "limit",
6630
+ "type": "int",
6631
+ "default": 20,
6632
+ "required": false,
6633
+ "help": "Number of items (per_page)"
6634
+ }
6635
+ ],
6636
+ "type": "ts",
6637
+ "modulePath": "linux-do/latest.js",
6638
+ "domain": "linux.do",
6639
+ "columns": [
6640
+ "title",
6641
+ "replies",
6642
+ "created",
5652
6643
  "likes",
5653
- "category"
6644
+ "views",
6645
+ "url"
6646
+ ],
6647
+ "deprecated": "opencli linux-do latest is kept for backward compatibility.",
6648
+ "replacedBy": "opencli linux-do feed --view latest"
6649
+ },
6650
+ {
6651
+ "site": "linux-do",
6652
+ "name": "search",
6653
+ "description": "搜索 linux.do",
6654
+ "domain": "linux.do",
6655
+ "strategy": "cookie",
6656
+ "browser": true,
6657
+ "args": [
6658
+ {
6659
+ "name": "query",
6660
+ "type": "str",
6661
+ "required": true,
6662
+ "positional": true,
6663
+ "help": "Search query"
6664
+ },
6665
+ {
6666
+ "name": "limit",
6667
+ "type": "int",
6668
+ "default": 20,
6669
+ "required": false,
6670
+ "positional": false,
6671
+ "help": "Number of results"
6672
+ }
6673
+ ],
6674
+ "columns": [
6675
+ "rank",
6676
+ "title",
6677
+ "views",
6678
+ "likes",
6679
+ "replies",
6680
+ "url"
5654
6681
  ],
5655
6682
  "pipeline": [
5656
6683
  {
5657
6684
  "navigate": "https://linux.do"
5658
6685
  },
5659
6686
  {
5660
- "evaluate": "(async () => {\n const period = ${{ args.period | json }};\n const res = await fetch('/top.json?period=' + encodeURIComponent(period), { credentials: 'include' });\n if (!res.ok) throw new Error('HTTP ' + res.status + ' - 请先登录 linux.do');\n let data;\n try { data = await res.json(); } catch { throw new Error('响应不是有效 JSON - 请先登录 linux.do'); }\n const topics = data?.topic_list?.topics || [];\n const cats = data?.topic_list?.categories || data?.categories || [];\n const catMap = Object.fromEntries(cats.map(c => [c.id, c.name]));\n return topics.slice(0, ${{ args.limit }}).map(t => ({\n title: t.title,\n replies: (t.posts_count || 1) - 1,\n views: t.views,\n likes: t.like_count,\n category: catMap[t.category_id] || String(t.category_id),\n }));\n})()\n"
6687
+ "evaluate": "(async () => {\n const keyword = ${{ args.query | json }};\n const res = await fetch('/search.json?q=' + encodeURIComponent(keyword), { credentials: 'include' });\n if (!res.ok) throw new Error('HTTP ' + res.status + ' - 请先登录 linux.do');\n let data;\n try { data = await res.json(); } catch { throw new Error('响应不是有效 JSON - 请先登录 linux.do'); }\n const topics = data?.topics || [];\n return topics.slice(0, ${{ args.limit }}).map(t => ({\n title: t.title,\n views: t.views,\n likes: t.like_count,\n replies: (t.posts_count || 1) - 1,\n url: 'https://linux.do/t/topic/' + t.id,\n }));\n})()\n"
5661
6688
  },
5662
6689
  {
5663
6690
  "map": {
5664
6691
  "rank": "${{ index + 1 }}",
5665
6692
  "title": "${{ item.title }}",
5666
- "replies": "${{ item.replies }}",
5667
6693
  "views": "${{ item.views }}",
5668
6694
  "likes": "${{ item.likes }}",
5669
- "category": "${{ item.category }}"
6695
+ "replies": "${{ item.replies }}",
6696
+ "url": "${{ item.url }}"
5670
6697
  }
5671
6698
  },
5672
6699
  {
@@ -5677,136 +6704,204 @@
5677
6704
  },
5678
6705
  {
5679
6706
  "site": "linux-do",
5680
- "name": "latest",
5681
- "description": "linux.do 最新话题",
6707
+ "name": "tags",
6708
+ "description": "linux.do 标签列表",
6709
+ "domain": "linux.do",
6710
+ "strategy": "cookie",
6711
+ "browser": true,
6712
+ "args": [
6713
+ {
6714
+ "name": "limit",
6715
+ "type": "int",
6716
+ "default": 30,
6717
+ "required": false,
6718
+ "positional": false,
6719
+ "help": "Number of tags"
6720
+ }
6721
+ ],
6722
+ "columns": [
6723
+ "rank",
6724
+ "name",
6725
+ "count",
6726
+ "url"
6727
+ ],
6728
+ "pipeline": [
6729
+ {
6730
+ "navigate": "https://linux.do"
6731
+ },
6732
+ {
6733
+ "evaluate": "(async () => {\n const res = await fetch('/tags.json', { credentials: 'include' });\n if (!res.ok) throw new Error('HTTP ' + res.status + ' - 请先登录 linux.do');\n let data;\n try { data = await res.json(); } catch { throw new Error('响应不是有效 JSON - 请先登录 linux.do'); }\n let tags = data?.tags || [];\n tags.sort((a, b) => (b.count || 0) - (a.count || 0));\n return tags.slice(0, ${{ args.limit }}).map(t => ({\n id: t.id,\n name: t.name || t.id,\n slug: t.slug,\n count: t.count || 0,\n }));\n})()\n"
6734
+ },
6735
+ {
6736
+ "map": {
6737
+ "rank": "${{ index + 1 }}",
6738
+ "name": "${{ item.name }}",
6739
+ "count": "${{ item.count }}",
6740
+ "slug": "${{ item.slug }}",
6741
+ "id": "${{ item.id }}",
6742
+ "url": "https://linux.do/tag/${{ item.slug }}"
6743
+ }
6744
+ }
6745
+ ],
6746
+ "type": "yaml"
6747
+ },
6748
+ {
6749
+ "site": "linux-do",
6750
+ "name": "topic",
6751
+ "description": "linux.do 帖子详情和回复(首页)",
5682
6752
  "domain": "linux.do",
5683
6753
  "strategy": "cookie",
5684
6754
  "browser": true,
5685
6755
  "args": [
6756
+ {
6757
+ "name": "id",
6758
+ "type": "int",
6759
+ "required": true,
6760
+ "positional": true,
6761
+ "help": "Topic ID"
6762
+ },
5686
6763
  {
5687
6764
  "name": "limit",
5688
6765
  "type": "int",
5689
6766
  "default": 20,
5690
6767
  "required": false,
5691
- "help": "Number of topics"
6768
+ "positional": false,
6769
+ "help": "Number of posts"
6770
+ },
6771
+ {
6772
+ "name": "main_only",
6773
+ "type": "bool",
6774
+ "default": false,
6775
+ "required": false,
6776
+ "positional": false,
6777
+ "help": "Only return the main post body without truncation"
5692
6778
  }
5693
6779
  ],
5694
6780
  "columns": [
5695
- "rank",
5696
- "title",
5697
- "replies",
5698
- "views",
5699
- "likes"
6781
+ "author",
6782
+ "content",
6783
+ "likes",
6784
+ "created_at"
5700
6785
  ],
5701
6786
  "pipeline": [
5702
6787
  {
5703
6788
  "navigate": "https://linux.do"
5704
6789
  },
5705
6790
  {
5706
- "evaluate": "(async () => {\n const res = await fetch('/latest.json', { credentials: 'include' });\n if (!res.ok) throw new Error('HTTP ' + res.status + ' - 请先登录 linux.do');\n let data;\n try { data = await res.json(); } catch { throw new Error('响应不是有效 JSON - 请先登录 linux.do'); }\n const topics = data?.topic_list?.topics || [];\n return topics.slice(0, ${{ args.limit }}).map(t => ({\n title: t.title,\n replies: (t.posts_count || 1) - 1,\n views: t.views,\n likes: t.like_count,\n }));\n})()\n"
6791
+ "evaluate": "(async () => {\n const mainOnly = ${{ args.main_only }};\n const toLocalTime = (utcStr) => {\n if (!utcStr) return '';\n const date = new Date(utcStr);\n return Number.isNaN(date.getTime()) ? utcStr : date.toLocaleString();\n };\n const res = await fetch('/t/${{ args.id }}.json', { credentials: 'include' });\n if (!res.ok) throw new Error('HTTP ' + res.status + ' - 请先登录 linux.do');\n let data;\n try { data = await res.json(); } catch { throw new Error('响应不是有效 JSON - 请先登录 linux.do'); }\n const strip = (html) => (html || '')\n .replace(/<br\\s*\\/?>/gi, ' ')\n .replace(/<\\/(p|div|li|blockquote|h[1-6])>/gi, ' ')\n .replace(/<[^>]+>/g, '')\n .replace(/&nbsp;/g, ' ')\n .replace(/&amp;/g, '&')\n .replace(/&lt;/g, '<')\n .replace(/&gt;/g, '>')\n .replace(/&quot;/g, '\"')\n .replace(/&#(?:(\\d+)|x([0-9a-fA-F]+));/g, (_, dec, hex) => {\n try { return String.fromCodePoint(dec !== undefined ? Number(dec) : parseInt(hex, 16)); } catch { return ''; }\n })\n .replace(/\\s+/g, ' ')\n .trim();\n const posts = data?.post_stream?.posts || [];\n if (mainOnly) {\n const mainPost = posts.find(p => p.post_number === 1);\n if (!mainPost) return [];\n return [{\n author: mainPost.username || '',\n content: mainPost.cooked || '',\n likes: mainPost.like_count || 0,\n created_at: toLocalTime(mainPost.created_at),\n }];\n }\n return posts.slice(0, ${{ args.limit }}).map(p => ({\n author: p.username,\n content: strip(p.cooked).slice(0, 200),\n likes: p.like_count,\n created_at: toLocalTime(p.created_at),\n }));\n})()\n"
5707
6792
  },
5708
6793
  {
5709
6794
  "map": {
5710
- "rank": "${{ index + 1 }}",
5711
- "title": "${{ item.title }}",
5712
- "replies": "${{ item.replies }}",
5713
- "views": "${{ item.views }}",
5714
- "likes": "${{ item.likes }}"
6795
+ "author": "${{ item.author }}",
6796
+ "content": "${{ item.content }}",
6797
+ "likes": "${{ item.likes }}",
6798
+ "created_at": "${{ item.created_at }}"
5715
6799
  }
5716
- },
5717
- {
5718
- "limit": "${{ args.limit }}"
5719
6800
  }
5720
6801
  ],
5721
6802
  "type": "yaml"
5722
6803
  },
5723
6804
  {
5724
6805
  "site": "linux-do",
5725
- "name": "search",
5726
- "description": "搜索 linux.do",
6806
+ "name": "user-posts",
6807
+ "description": "linux.do 用户的帖子",
5727
6808
  "domain": "linux.do",
5728
6809
  "strategy": "cookie",
5729
6810
  "browser": true,
5730
6811
  "args": [
5731
6812
  {
5732
- "name": "query",
6813
+ "name": "username",
5733
6814
  "type": "str",
5734
6815
  "required": true,
5735
6816
  "positional": true,
5736
- "help": "Search query"
6817
+ "help": "Username"
5737
6818
  },
5738
6819
  {
5739
6820
  "name": "limit",
5740
6821
  "type": "int",
5741
6822
  "default": 20,
5742
6823
  "required": false,
5743
- "help": "Number of results"
6824
+ "positional": false,
6825
+ "help": "Number of posts"
5744
6826
  }
5745
6827
  ],
5746
6828
  "columns": [
5747
- "rank",
5748
- "title",
5749
- "views",
5750
- "likes",
5751
- "replies"
6829
+ "index",
6830
+ "topic_user",
6831
+ "topic",
6832
+ "reply",
6833
+ "time",
6834
+ "url"
5752
6835
  ],
5753
6836
  "pipeline": [
5754
6837
  {
5755
6838
  "navigate": "https://linux.do"
5756
6839
  },
5757
6840
  {
5758
- "evaluate": "(async () => {\n const keyword = ${{ args.query | json }};\n const res = await fetch('/search.json?q=' + encodeURIComponent(keyword), { credentials: 'include' });\n if (!res.ok) throw new Error('HTTP ' + res.status + ' - 请先登录 linux.do');\n let data;\n try { data = await res.json(); } catch { throw new Error('响应不是有效 JSON - 请先登录 linux.do'); }\n const topics = data?.topics || [];\n return topics.slice(0, ${{ args.limit }}).map(t => ({\n title: t.title,\n views: t.views,\n likes: t.like_count,\n replies: (t.posts_count || 1) - 1,\n }));\n})()\n"
6841
+ "evaluate": "(async () => {\n const username = ${{ args.username | json }};\n const toLocalTime = (utcStr) => {\n if (!utcStr) return '';\n const date = new Date(utcStr);\n return Number.isNaN(date.getTime()) ? utcStr : date.toLocaleString();\n };\n const strip = (html) => (html || '')\n .replace(/<br\\s*\\/?>/gi, ' ')\n .replace(/<\\/(p|div|li|blockquote|h[1-6])>/gi, ' ')\n .replace(/<[^>]+>/g, '')\n .replace(/&nbsp;/g, ' ')\n .replace(/&amp;/g, '&')\n .replace(/&lt;/g, '<')\n .replace(/&gt;/g, '>')\n .replace(/&quot;/g, '\"')\n .replace(/&#(?:(\\d+)|x([0-9a-fA-F]+));/g, (_, dec, hex) => {\n try { return String.fromCodePoint(dec !== undefined ? Number(dec) : parseInt(hex, 16)); } catch { return ''; }\n })\n .replace(/\\s+/g, ' ')\n .trim();\n const limit = ${{ args.limit | default(20) }};\n const res = await fetch('/user_actions.json?username=' + encodeURIComponent(username) + '&filter=5&offset=0&limit=' + limit, { credentials: 'include' });\n if (!res.ok) throw new Error('HTTP ' + res.status + ' - 请先登录 linux.do');\n let data;\n try { data = await res.json(); } catch { throw new Error('响应不是有效 JSON - 请先登录 linux.do'); }\n const actions = data?.user_actions || [];\n return actions.slice(0, limit).map(a => ({\n author: a.acting_username || a.username || '',\n title: a.title || '',\n content: strip(a.excerpt).slice(0, 200),\n created_at: toLocalTime(a.created_at),\n url: 'https://linux.do/t/topic/' + a.topic_id + '/' + a.post_number,\n }));\n})()\n"
5759
6842
  },
5760
6843
  {
5761
6844
  "map": {
5762
- "rank": "${{ index + 1 }}",
5763
- "title": "${{ item.title }}",
5764
- "views": "${{ item.views }}",
5765
- "likes": "${{ item.likes }}",
5766
- "replies": "${{ item.replies }}"
6845
+ "index": "${{ index + 1 }}",
6846
+ "topic_user": "${{ item.author }}",
6847
+ "topic": "${{ item.title }}",
6848
+ "reply": "${{ item.content }}",
6849
+ "time": "${{ item.created_at }}",
6850
+ "url": "${{ item.url }}"
5767
6851
  }
5768
- },
5769
- {
5770
- "limit": "${{ args.limit }}"
5771
6852
  }
5772
6853
  ],
5773
6854
  "type": "yaml"
5774
6855
  },
5775
6856
  {
5776
6857
  "site": "linux-do",
5777
- "name": "topic",
5778
- "description": "linux.do 帖子详情和回复(首页)",
6858
+ "name": "user-topics",
6859
+ "description": "linux.do 用户创建的话题",
5779
6860
  "domain": "linux.do",
5780
6861
  "strategy": "cookie",
5781
6862
  "browser": true,
5782
6863
  "args": [
5783
6864
  {
5784
- "name": "id",
5785
- "type": "int",
6865
+ "name": "username",
6866
+ "type": "str",
5786
6867
  "required": true,
5787
6868
  "positional": true,
5788
- "help": "Topic ID"
6869
+ "help": "Username"
6870
+ },
6871
+ {
6872
+ "name": "limit",
6873
+ "type": "int",
6874
+ "default": 20,
6875
+ "required": false,
6876
+ "positional": false,
6877
+ "help": "Number of topics"
5789
6878
  }
5790
6879
  ],
5791
6880
  "columns": [
5792
- "author",
5793
- "content",
6881
+ "rank",
6882
+ "title",
6883
+ "replies",
6884
+ "created_at",
5794
6885
  "likes",
5795
- "created_at"
6886
+ "views",
6887
+ "url"
5796
6888
  ],
5797
6889
  "pipeline": [
5798
6890
  {
5799
6891
  "navigate": "https://linux.do"
5800
6892
  },
5801
6893
  {
5802
- "evaluate": "(async () => {\n const res = await fetch('/t/${{ args.id }}.json', { credentials: 'include' });\n if (!res.ok) throw new Error('HTTP ' + res.status + ' - 请先登录 linux.do');\n let data;\n try { data = await res.json(); } catch { throw new Error('响应不是有效 JSON - 请先登录 linux.do'); }\n const strip = (html) => (html || '').replace(/<br\\s*\\/?>/gi, ' ').replace(/<\\/(p|div|li|blockquote|h[1-6])>/gi, ' ').replace(/<[^>]+>/g, '').replace(/&nbsp;/g, ' ').replace(/&amp;/g, '&').replace(/&lt;/g, '<').replace(/&gt;/g, '>').replace(/&quot;/g, '\"').replace(/&#(?:(\\d+)|x([0-9a-fA-F]+));/g, (_, dec, hex) => { try { return String.fromCodePoint(dec !== undefined ? Number(dec) : parseInt(hex, 16)); } catch { return ''; } }).replace(/\\s+/g, ' ').trim();\n const posts = data?.post_stream?.posts || [];\n return posts.map(p => ({\n author: p.username,\n content: strip(p.cooked).slice(0, 200),\n likes: p.like_count,\n created_at: p.created_at,\n }));\n})()\n"
6894
+ "evaluate": "(async () => {\n const username = ${{ args.username | json }};\n const toLocalTime = (utcStr) => {\n if (!utcStr) return '';\n const date = new Date(utcStr);\n return Number.isNaN(date.getTime()) ? utcStr : date.toLocaleString();\n };\n const res = await fetch('/topics/created-by/' + encodeURIComponent(username) + '.json', { credentials: 'include' });\n if (!res.ok) throw new Error('HTTP ' + res.status + ' - 请先登录 linux.do');\n let data;\n try { data = await res.json(); } catch { throw new Error('响应不是有效 JSON - 请先登录 linux.do'); }\n const topics = data?.topic_list?.topics || [];\n return topics.slice(0, ${{ args.limit }}).map(t => ({\n title: t.fancy_title || t.title || '',\n replies: t.posts_count || 0,\n created_at: toLocalTime(t.created_at),\n likes: t.like_count || 0,\n views: t.views || 0,\n url: 'https://linux.do/t/topic/' + t.id,\n }));\n})()\n"
5803
6895
  },
5804
6896
  {
5805
6897
  "map": {
5806
- "author": "${{ item.author }}",
5807
- "content": "${{ item.content }}",
6898
+ "rank": "${{ index + 1 }}",
6899
+ "title": "${{ item.title }}",
6900
+ "replies": "${{ item.replies }}",
6901
+ "created_at": "${{ item.created_at }}",
5808
6902
  "likes": "${{ item.likes }}",
5809
- "created_at": "${{ item.created_at }}"
6903
+ "views": "${{ item.views }}",
6904
+ "url": "${{ item.url }}"
5810
6905
  }
5811
6906
  }
5812
6907
  ],
@@ -5825,6 +6920,7 @@
5825
6920
  "type": "int",
5826
6921
  "default": 20,
5827
6922
  "required": false,
6923
+ "positional": false,
5828
6924
  "help": "Number of stories"
5829
6925
  }
5830
6926
  ],
@@ -5872,6 +6968,7 @@
5872
6968
  "type": "int",
5873
6969
  "default": 20,
5874
6970
  "required": false,
6971
+ "positional": false,
5875
6972
  "help": "Number of stories"
5876
6973
  }
5877
6974
  ],
@@ -5919,6 +7016,7 @@
5919
7016
  "type": "int",
5920
7017
  "default": 20,
5921
7018
  "required": false,
7019
+ "positional": false,
5922
7020
  "help": "Number of stories"
5923
7021
  }
5924
7022
  ],
@@ -5973,6 +7071,7 @@
5973
7071
  "type": "int",
5974
7072
  "default": 20,
5975
7073
  "required": false,
7074
+ "positional": false,
5976
7075
  "help": "Number of stories"
5977
7076
  }
5978
7077
  ],
@@ -6072,7 +7171,8 @@
6072
7171
  "author",
6073
7172
  "date",
6074
7173
  "readTime",
6075
- "claps"
7174
+ "claps",
7175
+ "url"
6076
7176
  ]
6077
7177
  },
6078
7178
  {
@@ -6261,6 +7361,143 @@
6261
7361
  "Status"
6262
7362
  ]
6263
7363
  },
7364
+ {
7365
+ "site": "paperreview",
7366
+ "name": "feedback",
7367
+ "description": "Submit feedback for a paperreview.ai review token",
7368
+ "strategy": "public",
7369
+ "browser": false,
7370
+ "args": [
7371
+ {
7372
+ "name": "token",
7373
+ "type": "str",
7374
+ "required": true,
7375
+ "positional": true,
7376
+ "help": "Review token returned by paperreview.ai"
7377
+ },
7378
+ {
7379
+ "name": "helpfulness",
7380
+ "type": "int",
7381
+ "required": true,
7382
+ "help": "Helpfulness score from 1 to 5"
7383
+ },
7384
+ {
7385
+ "name": "critical-error",
7386
+ "type": "str",
7387
+ "required": true,
7388
+ "help": "Whether the review contains a critical error",
7389
+ "choices": [
7390
+ "yes",
7391
+ "no"
7392
+ ]
7393
+ },
7394
+ {
7395
+ "name": "actionable-suggestions",
7396
+ "type": "str",
7397
+ "required": true,
7398
+ "help": "Whether the review contains actionable suggestions",
7399
+ "choices": [
7400
+ "yes",
7401
+ "no"
7402
+ ]
7403
+ },
7404
+ {
7405
+ "name": "additional-comments",
7406
+ "type": "str",
7407
+ "required": false,
7408
+ "help": "Optional free-text feedback"
7409
+ }
7410
+ ],
7411
+ "type": "ts",
7412
+ "modulePath": "paperreview/feedback.js",
7413
+ "columns": [
7414
+ "status",
7415
+ "token",
7416
+ "helpfulness",
7417
+ "critical_error",
7418
+ "actionable_suggestions",
7419
+ "message"
7420
+ ]
7421
+ },
7422
+ {
7423
+ "site": "paperreview",
7424
+ "name": "review",
7425
+ "description": "Fetch a paperreview.ai review by token",
7426
+ "strategy": "public",
7427
+ "browser": false,
7428
+ "args": [
7429
+ {
7430
+ "name": "token",
7431
+ "type": "str",
7432
+ "required": true,
7433
+ "positional": true,
7434
+ "help": "Review token returned by paperreview.ai"
7435
+ }
7436
+ ],
7437
+ "type": "ts",
7438
+ "modulePath": "paperreview/review.js",
7439
+ "columns": [
7440
+ "status",
7441
+ "title",
7442
+ "venue",
7443
+ "numerical_score",
7444
+ "has_feedback",
7445
+ "review_url"
7446
+ ]
7447
+ },
7448
+ {
7449
+ "site": "paperreview",
7450
+ "name": "submit",
7451
+ "description": "Submit a PDF to paperreview.ai for review",
7452
+ "strategy": "public",
7453
+ "browser": false,
7454
+ "args": [
7455
+ {
7456
+ "name": "pdf",
7457
+ "type": "str",
7458
+ "required": true,
7459
+ "positional": true,
7460
+ "help": "Path to the paper PDF"
7461
+ },
7462
+ {
7463
+ "name": "email",
7464
+ "type": "str",
7465
+ "required": true,
7466
+ "help": "Email address for the submission"
7467
+ },
7468
+ {
7469
+ "name": "venue",
7470
+ "type": "str",
7471
+ "required": false,
7472
+ "help": "Optional target venue such as ICLR or NeurIPS"
7473
+ },
7474
+ {
7475
+ "name": "dry-run",
7476
+ "type": "bool",
7477
+ "default": false,
7478
+ "required": false,
7479
+ "help": "Validate the input and stop before remote submission"
7480
+ },
7481
+ {
7482
+ "name": "prepare-only",
7483
+ "type": "bool",
7484
+ "default": false,
7485
+ "required": false,
7486
+ "help": "Request an upload slot but stop before uploading the PDF"
7487
+ }
7488
+ ],
7489
+ "type": "ts",
7490
+ "modulePath": "paperreview/submit.js",
7491
+ "columns": [
7492
+ "status",
7493
+ "file",
7494
+ "email",
7495
+ "venue",
7496
+ "token",
7497
+ "review_url",
7498
+ "message"
7499
+ ]
7500
+ },
6264
7501
  {
6265
7502
  "site": "pixiv",
6266
7503
  "name": "detail",
@@ -6380,6 +7617,7 @@
6380
7617
  "type": "str",
6381
7618
  "default": "daily",
6382
7619
  "required": false,
7620
+ "positional": false,
6383
7621
  "help": "Ranking mode",
6384
7622
  "choices": [
6385
7623
  "daily",
@@ -6398,6 +7636,7 @@
6398
7636
  "type": "int",
6399
7637
  "default": 1,
6400
7638
  "required": false,
7639
+ "positional": false,
6401
7640
  "help": "Page number"
6402
7641
  },
6403
7642
  {
@@ -6405,6 +7644,7 @@
6405
7644
  "type": "int",
6406
7645
  "default": 20,
6407
7646
  "required": false,
7647
+ "positional": false,
6408
7648
  "help": "Number of results"
6409
7649
  }
6410
7650
  ],
@@ -6530,6 +7770,124 @@
6530
7770
  ],
6531
7771
  "type": "yaml"
6532
7772
  },
7773
+ {
7774
+ "site": "producthunt",
7775
+ "name": "browse",
7776
+ "description": "Best products in a Product Hunt category",
7777
+ "strategy": "intercept",
7778
+ "browser": true,
7779
+ "args": [
7780
+ {
7781
+ "name": "category",
7782
+ "type": "string",
7783
+ "required": true,
7784
+ "positional": true,
7785
+ "help": "Category slug, e.g. vibe-coding, ai-agents, developer-tools"
7786
+ },
7787
+ {
7788
+ "name": "limit",
7789
+ "type": "int",
7790
+ "default": 20,
7791
+ "required": false,
7792
+ "help": "Number of results (max 50)"
7793
+ }
7794
+ ],
7795
+ "type": "ts",
7796
+ "modulePath": "producthunt/browse.js",
7797
+ "domain": "www.producthunt.com",
7798
+ "columns": [
7799
+ "rank",
7800
+ "name",
7801
+ "tagline",
7802
+ "reviews",
7803
+ "url"
7804
+ ]
7805
+ },
7806
+ {
7807
+ "site": "producthunt",
7808
+ "name": "hot",
7809
+ "description": "Today",
7810
+ "strategy": "intercept",
7811
+ "browser": true,
7812
+ "args": [
7813
+ {
7814
+ "name": "limit",
7815
+ "type": "int",
7816
+ "default": 20,
7817
+ "required": false,
7818
+ "help": "Number of results (max 50)"
7819
+ }
7820
+ ],
7821
+ "type": "ts",
7822
+ "modulePath": "producthunt/hot.js",
7823
+ "domain": "www.producthunt.com",
7824
+ "columns": [
7825
+ "rank",
7826
+ "name",
7827
+ "votes",
7828
+ "url"
7829
+ ]
7830
+ },
7831
+ {
7832
+ "site": "producthunt",
7833
+ "name": "posts",
7834
+ "description": "Latest Product Hunt launches (optional category filter)",
7835
+ "strategy": "public",
7836
+ "browser": false,
7837
+ "args": [
7838
+ {
7839
+ "name": "limit",
7840
+ "type": "int",
7841
+ "default": 20,
7842
+ "required": false,
7843
+ "help": "Number of results (max 50)"
7844
+ },
7845
+ {
7846
+ "name": "category",
7847
+ "type": "string",
7848
+ "default": "",
7849
+ "required": false,
7850
+ "help": "Category filter: ${PRODUCTHUNT_CATEGORY_SLUGS.join("
7851
+ }
7852
+ ],
7853
+ "type": "ts",
7854
+ "modulePath": "producthunt/posts.js",
7855
+ "domain": "www.producthunt.com",
7856
+ "columns": [
7857
+ "rank",
7858
+ "name",
7859
+ "tagline",
7860
+ "author",
7861
+ "date",
7862
+ "url"
7863
+ ]
7864
+ },
7865
+ {
7866
+ "site": "producthunt",
7867
+ "name": "today",
7868
+ "description": "Today",
7869
+ "strategy": "public",
7870
+ "browser": false,
7871
+ "args": [
7872
+ {
7873
+ "name": "limit",
7874
+ "type": "int",
7875
+ "default": 20,
7876
+ "required": false,
7877
+ "help": "Max results"
7878
+ }
7879
+ ],
7880
+ "type": "ts",
7881
+ "modulePath": "producthunt/today.js",
7882
+ "domain": "www.producthunt.com",
7883
+ "columns": [
7884
+ "rank",
7885
+ "name",
7886
+ "tagline",
7887
+ "author",
7888
+ "url"
7889
+ ]
7890
+ },
6533
7891
  {
6534
7892
  "site": "reddit",
6535
7893
  "name": "comment",
@@ -6573,6 +7931,7 @@
6573
7931
  "type": "int",
6574
7932
  "default": 15,
6575
7933
  "required": false,
7934
+ "positional": false,
6576
7935
  "help": ""
6577
7936
  }
6578
7937
  ],
@@ -6620,6 +7979,7 @@
6620
7979
  "type": "str",
6621
7980
  "default": "",
6622
7981
  "required": false,
7982
+ "positional": false,
6623
7983
  "help": "Subreddit name (e.g. programming). Empty for frontpage"
6624
7984
  },
6625
7985
  {
@@ -6627,6 +7987,7 @@
6627
7987
  "type": "int",
6628
7988
  "default": 20,
6629
7989
  "required": false,
7990
+ "positional": false,
6630
7991
  "help": "Number of posts"
6631
7992
  }
6632
7993
  ],
@@ -6672,6 +8033,7 @@
6672
8033
  "type": "int",
6673
8034
  "default": 20,
6674
8035
  "required": false,
8036
+ "positional": false,
6675
8037
  "help": ""
6676
8038
  }
6677
8039
  ],
@@ -6842,6 +8204,7 @@
6842
8204
  "type": "string",
6843
8205
  "default": "",
6844
8206
  "required": false,
8207
+ "positional": false,
6845
8208
  "help": "Search within a specific subreddit"
6846
8209
  },
6847
8210
  {
@@ -6849,6 +8212,7 @@
6849
8212
  "type": "string",
6850
8213
  "default": "relevance",
6851
8214
  "required": false,
8215
+ "positional": false,
6852
8216
  "help": "Sort order: relevance, hot, top, new, comments"
6853
8217
  },
6854
8218
  {
@@ -6856,6 +8220,7 @@
6856
8220
  "type": "string",
6857
8221
  "default": "all",
6858
8222
  "required": false,
8223
+ "positional": false,
6859
8224
  "help": "Time filter: hour, day, week, month, year, all"
6860
8225
  },
6861
8226
  {
@@ -6863,6 +8228,7 @@
6863
8228
  "type": "int",
6864
8229
  "default": 15,
6865
8230
  "required": false,
8231
+ "positional": false,
6866
8232
  "help": ""
6867
8233
  }
6868
8234
  ],
@@ -6917,6 +8283,7 @@
6917
8283
  "type": "string",
6918
8284
  "default": "hot",
6919
8285
  "required": false,
8286
+ "positional": false,
6920
8287
  "help": "Sorting method: hot, new, top, rising, controversial"
6921
8288
  },
6922
8289
  {
@@ -6924,6 +8291,7 @@
6924
8291
  "type": "string",
6925
8292
  "default": "all",
6926
8293
  "required": false,
8294
+ "positional": false,
6927
8295
  "help": "Time filter for top/controversial: hour, day, week, month, year, all"
6928
8296
  },
6929
8297
  {
@@ -6931,6 +8299,7 @@
6931
8299
  "type": "int",
6932
8300
  "default": 15,
6933
8301
  "required": false,
8302
+ "positional": false,
6934
8303
  "help": ""
6935
8304
  }
6936
8305
  ],
@@ -7069,6 +8438,7 @@
7069
8438
  "type": "int",
7070
8439
  "default": 15,
7071
8440
  "required": false,
8441
+ "positional": false,
7072
8442
  "help": ""
7073
8443
  }
7074
8444
  ],
@@ -7119,6 +8489,7 @@
7119
8489
  "type": "int",
7120
8490
  "default": 15,
7121
8491
  "required": false,
8492
+ "positional": false,
7122
8493
  "help": ""
7123
8494
  }
7124
8495
  ],
@@ -7421,6 +8792,7 @@
7421
8792
  "type": "int",
7422
8793
  "default": 10,
7423
8794
  "required": false,
8795
+ "positional": false,
7424
8796
  "help": "Max number of results"
7425
8797
  }
7426
8798
  ],
@@ -7468,6 +8840,7 @@
7468
8840
  "type": "int",
7469
8841
  "default": 10,
7470
8842
  "required": false,
8843
+ "positional": false,
7471
8844
  "help": "Max number of results"
7472
8845
  }
7473
8846
  ],
@@ -7520,6 +8893,7 @@
7520
8893
  "type": "int",
7521
8894
  "default": 10,
7522
8895
  "required": false,
8896
+ "positional": false,
7523
8897
  "help": "Max number of results"
7524
8898
  }
7525
8899
  ],
@@ -7565,6 +8939,7 @@
7565
8939
  "type": "int",
7566
8940
  "default": 10,
7567
8941
  "required": false,
8942
+ "positional": false,
7568
8943
  "help": "Max number of results"
7569
8944
  }
7570
8945
  ],
@@ -7610,6 +8985,7 @@
7610
8985
  "type": "int",
7611
8986
  "default": 10,
7612
8987
  "required": false,
8988
+ "positional": false,
7613
8989
  "help": "Number of games"
7614
8990
  }
7615
8991
  ],
@@ -7810,6 +9186,7 @@
7810
9186
  "type": "int",
7811
9187
  "default": 20,
7812
9188
  "required": false,
9189
+ "positional": false,
7813
9190
  "help": "Number of videos"
7814
9191
  }
7815
9192
  ],
@@ -7878,6 +9255,7 @@
7878
9255
  "type": "int",
7879
9256
  "default": 20,
7880
9257
  "required": false,
9258
+ "positional": false,
7881
9259
  "help": "Number of accounts"
7882
9260
  }
7883
9261
  ],
@@ -7912,6 +9290,7 @@
7912
9290
  "type": "int",
7913
9291
  "default": 20,
7914
9292
  "required": false,
9293
+ "positional": false,
7915
9294
  "help": "Number of suggestions"
7916
9295
  }
7917
9296
  ],
@@ -7980,6 +9359,7 @@
7980
9359
  "type": "int",
7981
9360
  "default": 10,
7982
9361
  "required": false,
9362
+ "positional": false,
7983
9363
  "help": "Number of streams"
7984
9364
  }
7985
9365
  ],
@@ -8015,6 +9395,7 @@
8015
9395
  "type": "int",
8016
9396
  "default": 15,
8017
9397
  "required": false,
9398
+ "positional": false,
8018
9399
  "help": "Number of notifications"
8019
9400
  },
8020
9401
  {
@@ -8022,6 +9403,7 @@
8022
9403
  "type": "str",
8023
9404
  "default": "all",
8024
9405
  "required": false,
9406
+ "positional": false,
8025
9407
  "help": "Notification type",
8026
9408
  "choices": [
8027
9409
  "all",
@@ -8141,6 +9523,7 @@
8141
9523
  "type": "int",
8142
9524
  "default": 10,
8143
9525
  "required": false,
9526
+ "positional": false,
8144
9527
  "help": "Number of results"
8145
9528
  }
8146
9529
  ],
@@ -8287,6 +9670,7 @@
8287
9670
  "type": "int",
8288
9671
  "default": 10,
8289
9672
  "required": false,
9673
+ "positional": false,
8290
9674
  "help": "Number of videos"
8291
9675
  }
8292
9676
  ],
@@ -8637,6 +10021,39 @@
8637
10021
  "message"
8638
10022
  ]
8639
10023
  },
10024
+ {
10025
+ "site": "twitter",
10026
+ "name": "likes",
10027
+ "description": "Fetch liked tweets of a Twitter user",
10028
+ "strategy": "cookie",
10029
+ "browser": true,
10030
+ "args": [
10031
+ {
10032
+ "name": "username",
10033
+ "type": "string",
10034
+ "required": false,
10035
+ "positional": true,
10036
+ "help": "Twitter screen name (without @). Defaults to logged-in user."
10037
+ },
10038
+ {
10039
+ "name": "limit",
10040
+ "type": "int",
10041
+ "default": 20,
10042
+ "required": false,
10043
+ "help": ""
10044
+ }
10045
+ ],
10046
+ "type": "ts",
10047
+ "modulePath": "twitter/likes.js",
10048
+ "domain": "x.com",
10049
+ "columns": [
10050
+ "author",
10051
+ "name",
10052
+ "text",
10053
+ "likes",
10054
+ "url"
10055
+ ]
10056
+ },
8640
10057
  {
8641
10058
  "site": "twitter",
8642
10059
  "name": "notifications",
@@ -8803,6 +10220,17 @@
8803
10220
  "positional": true,
8804
10221
  "help": ""
8805
10222
  },
10223
+ {
10224
+ "name": "filter",
10225
+ "type": "string",
10226
+ "default": "top",
10227
+ "required": false,
10228
+ "help": "",
10229
+ "choices": [
10230
+ "top",
10231
+ "live"
10232
+ ]
10233
+ },
8806
10234
  {
8807
10235
  "name": "limit",
8808
10236
  "type": "int",
@@ -8818,6 +10246,7 @@
8818
10246
  "id",
8819
10247
  "author",
8820
10248
  "text",
10249
+ "created_at",
8821
10250
  "likes",
8822
10251
  "views",
8823
10252
  "url"
@@ -9020,6 +10449,7 @@
9020
10449
  "type": "int",
9021
10450
  "default": 20,
9022
10451
  "required": false,
10452
+ "positional": false,
9023
10453
  "help": "Number of topics"
9024
10454
  }
9025
10455
  ],
@@ -9060,6 +10490,7 @@
9060
10490
  "type": "int",
9061
10491
  "default": 20,
9062
10492
  "required": false,
10493
+ "positional": false,
9063
10494
  "help": "Number of topics"
9064
10495
  }
9065
10496
  ],
@@ -9170,6 +10601,7 @@
9170
10601
  "type": "int",
9171
10602
  "default": 10,
9172
10603
  "required": false,
10604
+ "positional": false,
9173
10605
  "help": "Number of topics (API returns max 20)"
9174
10606
  }
9175
10607
  ],
@@ -9217,6 +10649,7 @@
9217
10649
  "type": "int",
9218
10650
  "default": 30,
9219
10651
  "required": false,
10652
+ "positional": false,
9220
10653
  "help": "Number of nodes"
9221
10654
  }
9222
10655
  ],
@@ -9298,6 +10731,7 @@
9298
10731
  "type": "int",
9299
10732
  "default": 20,
9300
10733
  "required": false,
10734
+ "positional": false,
9301
10735
  "help": "Number of replies"
9302
10736
  }
9303
10737
  ],
@@ -9391,6 +10825,7 @@
9391
10825
  "type": "int",
9392
10826
  "default": 10,
9393
10827
  "required": false,
10828
+ "positional": false,
9394
10829
  "help": "Number of topics (API returns max 20)"
9395
10830
  }
9396
10831
  ],
@@ -9471,6 +10906,68 @@
9471
10906
  ],
9472
10907
  "navigateBefore": false
9473
10908
  },
10909
+ {
10910
+ "site": "weibo",
10911
+ "name": "comments",
10912
+ "description": "Get comments on a Weibo post",
10913
+ "strategy": "cookie",
10914
+ "browser": true,
10915
+ "args": [
10916
+ {
10917
+ "name": "id",
10918
+ "type": "str",
10919
+ "required": true,
10920
+ "positional": true,
10921
+ "help": "Post ID (numeric idstr)"
10922
+ },
10923
+ {
10924
+ "name": "limit",
10925
+ "type": "int",
10926
+ "default": 20,
10927
+ "required": false,
10928
+ "help": "Number of comments (max 50)"
10929
+ }
10930
+ ],
10931
+ "type": "ts",
10932
+ "modulePath": "weibo/comments.js",
10933
+ "domain": "weibo.com",
10934
+ "columns": [
10935
+ "rank",
10936
+ "author",
10937
+ "text",
10938
+ "likes",
10939
+ "replies",
10940
+ "time"
10941
+ ]
10942
+ },
10943
+ {
10944
+ "site": "weibo",
10945
+ "name": "feed",
10946
+ "description": "Weibo home timeline (posts from followed users)",
10947
+ "strategy": "cookie",
10948
+ "browser": true,
10949
+ "args": [
10950
+ {
10951
+ "name": "limit",
10952
+ "type": "int",
10953
+ "default": 15,
10954
+ "required": false,
10955
+ "help": "Number of posts (max 50)"
10956
+ }
10957
+ ],
10958
+ "type": "ts",
10959
+ "modulePath": "weibo/feed.js",
10960
+ "domain": "weibo.com",
10961
+ "columns": [
10962
+ "author",
10963
+ "text",
10964
+ "reposts",
10965
+ "comments",
10966
+ "likes",
10967
+ "time",
10968
+ "url"
10969
+ ]
10970
+ },
9474
10971
  {
9475
10972
  "site": "weibo",
9476
10973
  "name": "hot",
@@ -9498,6 +10995,49 @@
9498
10995
  "url"
9499
10996
  ]
9500
10997
  },
10998
+ {
10999
+ "site": "weibo",
11000
+ "name": "me",
11001
+ "description": "My Weibo profile info",
11002
+ "strategy": "cookie",
11003
+ "browser": true,
11004
+ "args": [],
11005
+ "type": "ts",
11006
+ "modulePath": "weibo/me.js",
11007
+ "domain": "weibo.com",
11008
+ "columns": [
11009
+ "screen_name",
11010
+ "uid",
11011
+ "followers",
11012
+ "following",
11013
+ "statuses",
11014
+ "verified",
11015
+ "location"
11016
+ ]
11017
+ },
11018
+ {
11019
+ "site": "weibo",
11020
+ "name": "post",
11021
+ "description": "Get a single Weibo post",
11022
+ "strategy": "cookie",
11023
+ "browser": true,
11024
+ "args": [
11025
+ {
11026
+ "name": "id",
11027
+ "type": "str",
11028
+ "required": true,
11029
+ "positional": true,
11030
+ "help": "Post ID (numeric idstr or mblogid from URL)"
11031
+ }
11032
+ ],
11033
+ "type": "ts",
11034
+ "modulePath": "weibo/post.js",
11035
+ "domain": "weibo.com",
11036
+ "columns": [
11037
+ "field",
11038
+ "value"
11039
+ ]
11040
+ },
9501
11041
  {
9502
11042
  "site": "weibo",
9503
11043
  "name": "search",
@@ -9531,6 +11071,36 @@
9531
11071
  "url"
9532
11072
  ]
9533
11073
  },
11074
+ {
11075
+ "site": "weibo",
11076
+ "name": "user",
11077
+ "description": "Get Weibo user profile",
11078
+ "strategy": "cookie",
11079
+ "browser": true,
11080
+ "args": [
11081
+ {
11082
+ "name": "id",
11083
+ "type": "str",
11084
+ "required": true,
11085
+ "positional": true,
11086
+ "help": "User ID (numeric uid) or screen name"
11087
+ }
11088
+ ],
11089
+ "type": "ts",
11090
+ "modulePath": "weibo/user.js",
11091
+ "domain": "weibo.com",
11092
+ "columns": [
11093
+ "screen_name",
11094
+ "uid",
11095
+ "followers",
11096
+ "following",
11097
+ "statuses",
11098
+ "verified",
11099
+ "description",
11100
+ "location",
11101
+ "url"
11102
+ ]
11103
+ },
9534
11104
  {
9535
11105
  "site": "weixin",
9536
11106
  "name": "download",
@@ -9741,7 +11311,8 @@
9741
11311
  "rank",
9742
11312
  "title",
9743
11313
  "author",
9744
- "bookId"
11314
+ "bookId",
11315
+ "url"
9745
11316
  ]
9746
11317
  },
9747
11318
  {
@@ -9892,6 +11463,39 @@
9892
11463
  "views"
9893
11464
  ]
9894
11465
  },
11466
+ {
11467
+ "site": "xiaohongshu",
11468
+ "name": "comments",
11469
+ "description": "获取小红书笔记评论(仅主评论,不含楼中楼)",
11470
+ "strategy": "cookie",
11471
+ "browser": true,
11472
+ "args": [
11473
+ {
11474
+ "name": "note-id",
11475
+ "type": "str",
11476
+ "required": true,
11477
+ "positional": true,
11478
+ "help": "Note ID or full /explore/<id> URL"
11479
+ },
11480
+ {
11481
+ "name": "limit",
11482
+ "type": "int",
11483
+ "default": 20,
11484
+ "required": false,
11485
+ "help": "Number of comments (max 50)"
11486
+ }
11487
+ ],
11488
+ "type": "ts",
11489
+ "modulePath": "xiaohongshu/comments.js",
11490
+ "domain": "www.xiaohongshu.com",
11491
+ "columns": [
11492
+ "rank",
11493
+ "author",
11494
+ "text",
11495
+ "likes",
11496
+ "time"
11497
+ ]
11498
+ },
9895
11499
  {
9896
11500
  "site": "xiaohongshu",
9897
11501
  "name": "creator-note-detail",
@@ -10069,6 +11673,7 @@
10069
11673
  "type": "int",
10070
11674
  "default": 20,
10071
11675
  "required": false,
11676
+ "positional": false,
10072
11677
  "help": "Number of items to return"
10073
11678
  }
10074
11679
  ],
@@ -10121,6 +11726,7 @@
10121
11726
  "type": "str",
10122
11727
  "default": "mentions",
10123
11728
  "required": false,
11729
+ "positional": false,
10124
11730
  "help": "Notification type: mentions, likes, or connections"
10125
11731
  },
10126
11732
  {
@@ -10128,6 +11734,7 @@
10128
11734
  "type": "int",
10129
11735
  "default": 20,
10130
11736
  "required": false,
11737
+ "positional": false,
10131
11738
  "help": "Number of notifications to return"
10132
11739
  }
10133
11740
  ],
@@ -10393,6 +12000,7 @@
10393
12000
  "type": "bool",
10394
12001
  "default": false,
10395
12002
  "required": false,
12003
+ "positional": false,
10396
12004
  "help": "仅返回最近一次未发布的财报日期"
10397
12005
  },
10398
12006
  {
@@ -10400,6 +12008,7 @@
10400
12008
  "type": "int",
10401
12009
  "default": 10,
10402
12010
  "required": false,
12011
+ "positional": false,
10403
12012
  "help": "返回数量,默认 10"
10404
12013
  }
10405
12014
  ],
@@ -10441,6 +12050,7 @@
10441
12050
  "type": "int",
10442
12051
  "default": 1,
10443
12052
  "required": false,
12053
+ "positional": false,
10444
12054
  "help": "页码,默认 1"
10445
12055
  },
10446
12056
  {
@@ -10448,6 +12058,7 @@
10448
12058
  "type": "int",
10449
12059
  "default": 20,
10450
12060
  "required": false,
12061
+ "positional": false,
10451
12062
  "help": "每页数量,默认 20"
10452
12063
  }
10453
12064
  ],
@@ -10543,6 +12154,7 @@
10543
12154
  "type": "int",
10544
12155
  "default": 20,
10545
12156
  "required": false,
12157
+ "positional": false,
10546
12158
  "help": "返回数量,默认 20,最大 50"
10547
12159
  },
10548
12160
  {
@@ -10550,6 +12162,7 @@
10550
12162
  "type": "str",
10551
12163
  "default": "10",
10552
12164
  "required": false,
12165
+ "positional": false,
10553
12166
  "help": "榜单类型 10=人气榜(默认) 12=关注榜"
10554
12167
  }
10555
12168
  ],
@@ -10597,6 +12210,7 @@
10597
12210
  "type": "int",
10598
12211
  "default": 20,
10599
12212
  "required": false,
12213
+ "positional": false,
10600
12214
  "help": "返回数量,默认 20,最大 50"
10601
12215
  }
10602
12216
  ],
@@ -10649,6 +12263,7 @@
10649
12263
  "type": "int",
10650
12264
  "default": 10,
10651
12265
  "required": false,
12266
+ "positional": false,
10652
12267
  "help": "返回数量,默认 10"
10653
12268
  }
10654
12269
  ],
@@ -10657,7 +12272,8 @@
10657
12272
  "name",
10658
12273
  "exchange",
10659
12274
  "price",
10660
- "changePercent"
12275
+ "changePercent",
12276
+ "url"
10661
12277
  ],
10662
12278
  "pipeline": [
10663
12279
  {
@@ -10672,7 +12288,8 @@
10672
12288
  "name": "${{ item.name }}",
10673
12289
  "exchange": "${{ item.exchange }}",
10674
12290
  "price": "${{ item.price }}",
10675
- "changePercent": "${{ item.changePercent }}"
12291
+ "changePercent": "${{ item.changePercent }}",
12292
+ "url": "${{ item.url }}"
10676
12293
  }
10677
12294
  },
10678
12295
  {
@@ -10736,6 +12353,7 @@
10736
12353
  "type": "str",
10737
12354
  "default": "1",
10738
12355
  "required": false,
12356
+ "positional": false,
10739
12357
  "help": "分类:1=自选(默认) 2=持仓 3=关注"
10740
12358
  },
10741
12359
  {
@@ -10743,6 +12361,7 @@
10743
12361
  "type": "int",
10744
12362
  "default": 100,
10745
12363
  "required": false,
12364
+ "positional": false,
10746
12365
  "help": "默认 100"
10747
12366
  }
10748
12367
  ],
@@ -11361,6 +12980,70 @@
11361
12980
  "url"
11362
12981
  ]
11363
12982
  },
12983
+ {
12984
+ "site": "youtube",
12985
+ "name": "channel",
12986
+ "description": "Get YouTube channel info and recent videos",
12987
+ "strategy": "cookie",
12988
+ "browser": true,
12989
+ "args": [
12990
+ {
12991
+ "name": "id",
12992
+ "type": "str",
12993
+ "required": true,
12994
+ "positional": true,
12995
+ "help": "Channel ID (UCxxxx) or handle (@name)"
12996
+ },
12997
+ {
12998
+ "name": "limit",
12999
+ "type": "int",
13000
+ "default": 10,
13001
+ "required": false,
13002
+ "help": "Max recent videos (max 30)"
13003
+ }
13004
+ ],
13005
+ "type": "ts",
13006
+ "modulePath": "youtube/channel.js",
13007
+ "domain": "www.youtube.com",
13008
+ "columns": [
13009
+ "field",
13010
+ "value"
13011
+ ]
13012
+ },
13013
+ {
13014
+ "site": "youtube",
13015
+ "name": "comments",
13016
+ "description": "Get YouTube video comments",
13017
+ "strategy": "cookie",
13018
+ "browser": true,
13019
+ "args": [
13020
+ {
13021
+ "name": "url",
13022
+ "type": "str",
13023
+ "required": true,
13024
+ "positional": true,
13025
+ "help": "YouTube video URL or video ID"
13026
+ },
13027
+ {
13028
+ "name": "limit",
13029
+ "type": "int",
13030
+ "default": 20,
13031
+ "required": false,
13032
+ "help": "Max comments (max 100)"
13033
+ }
13034
+ ],
13035
+ "type": "ts",
13036
+ "modulePath": "youtube/comments.js",
13037
+ "domain": "www.youtube.com",
13038
+ "columns": [
13039
+ "rank",
13040
+ "author",
13041
+ "text",
13042
+ "likes",
13043
+ "replies",
13044
+ "time"
13045
+ ]
13046
+ },
11364
13047
  {
11365
13048
  "site": "youtube",
11366
13049
  "name": "search",
@@ -11502,6 +13185,7 @@
11502
13185
  "type": "int",
11503
13186
  "default": 20,
11504
13187
  "required": false,
13188
+ "positional": false,
11505
13189
  "help": "Number of items to return"
11506
13190
  }
11507
13191
  ],
@@ -11585,6 +13269,7 @@
11585
13269
  "type": "int",
11586
13270
  "default": 10,
11587
13271
  "required": false,
13272
+ "positional": false,
11588
13273
  "help": "Number of results"
11589
13274
  }
11590
13275
  ],
@@ -11593,7 +13278,8 @@
11593
13278
  "title",
11594
13279
  "type",
11595
13280
  "author",
11596
- "votes"
13281
+ "votes",
13282
+ "url"
11597
13283
  ],
11598
13284
  "pipeline": [
11599
13285
  {
@@ -11608,7 +13294,8 @@
11608
13294
  "title": "${{ item.title }}",
11609
13295
  "type": "${{ item.type }}",
11610
13296
  "author": "${{ item.author }}",
11611
- "votes": "${{ item.votes }}"
13297
+ "votes": "${{ item.votes }}",
13298
+ "url": "${{ item.url }}"
11612
13299
  }
11613
13300
  },
11614
13301
  {