@jackwener/opencli 1.5.6 → 1.5.7

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 (334) hide show
  1. package/CHANGELOG.md +26 -0
  2. package/README.md +4 -2
  3. package/README.zh-CN.md +4 -1
  4. package/SKILL.md +879 -0
  5. package/dist/browser/cdp.d.ts +1 -0
  6. package/dist/browser/cdp.js +30 -27
  7. package/dist/browser/daemon-client.d.ts +7 -1
  8. package/dist/browser/daemon-client.js +3 -0
  9. package/dist/browser/dom-helpers.js +1 -0
  10. package/dist/browser/dom-helpers.test.js +14 -1
  11. package/dist/browser/mcp.js +18 -13
  12. package/dist/browser/page.js +22 -2
  13. package/dist/browser/page.test.d.ts +1 -0
  14. package/dist/browser/page.test.js +44 -0
  15. package/dist/browser/stealth.js +198 -0
  16. package/dist/browser/stealth.test.d.ts +1 -0
  17. package/dist/browser/stealth.test.js +134 -0
  18. package/dist/browser.test.js +1 -1
  19. package/dist/build-manifest.d.ts +1 -0
  20. package/dist/build-manifest.js +5 -1
  21. package/dist/build-manifest.test.js +2 -0
  22. package/dist/cli-manifest.json +544 -137
  23. package/dist/cli.js +20 -3
  24. package/dist/clis/antigravity/serve.d.ts +1 -1
  25. package/dist/clis/antigravity/serve.js +5 -8
  26. package/dist/clis/bilibili/subtitle.js +4 -0
  27. package/dist/clis/bilibili/subtitle.test.d.ts +1 -0
  28. package/dist/clis/bilibili/subtitle.test.js +48 -0
  29. package/dist/clis/chatwise/ask.js +0 -2
  30. package/dist/clis/chatwise/export.js +0 -2
  31. package/dist/clis/chatwise/history.js +0 -2
  32. package/dist/clis/chatwise/model.js +0 -2
  33. package/dist/clis/chatwise/new.js +1 -2
  34. package/dist/clis/chatwise/read.js +0 -2
  35. package/dist/clis/chatwise/screenshot.js +1 -2
  36. package/dist/clis/chatwise/send.js +0 -2
  37. package/dist/clis/chatwise/status.js +1 -2
  38. package/dist/clis/ctrip/search.d.ts +13 -0
  39. package/dist/clis/ctrip/search.js +73 -48
  40. package/dist/clis/ctrip/search.test.d.ts +1 -0
  41. package/dist/clis/ctrip/search.test.js +64 -0
  42. package/dist/clis/douyin/_shared/sts2.js +8 -2
  43. package/dist/clis/douyin/_shared/sts2.test.d.ts +1 -0
  44. package/dist/clis/douyin/_shared/sts2.test.js +27 -0
  45. package/dist/clis/douyin/activities.js +4 -2
  46. package/dist/clis/douyin/activities.test.js +34 -1
  47. package/dist/clis/douyin/collections.js +1 -1
  48. package/dist/clis/douyin/collections.test.js +24 -2
  49. package/dist/clis/douyin/draft.d.ts +8 -11
  50. package/dist/clis/douyin/draft.js +302 -185
  51. package/dist/clis/douyin/draft.test.d.ts +1 -1
  52. package/dist/clis/douyin/draft.test.js +357 -2
  53. package/dist/clis/douyin/hashtag.js +9 -2
  54. package/dist/clis/douyin/hashtag.test.js +35 -2
  55. package/dist/clis/douyin/profile.js +1 -1
  56. package/dist/clis/douyin/profile.test.js +36 -1
  57. package/dist/clis/douyin/videos.js +22 -5
  58. package/dist/clis/douyin/videos.test.js +45 -2
  59. package/dist/clis/facebook/search.test.d.ts +5 -0
  60. package/dist/clis/facebook/search.test.js +60 -0
  61. package/dist/clis/facebook/search.yaml +4 -3
  62. package/dist/clis/instagram/download.d.ts +16 -0
  63. package/dist/clis/instagram/download.js +225 -0
  64. package/dist/clis/instagram/download.test.d.ts +1 -0
  65. package/dist/clis/instagram/download.test.js +118 -0
  66. package/dist/clis/notebooklm/bind-current.d.ts +1 -0
  67. package/dist/clis/notebooklm/bind-current.js +29 -0
  68. package/dist/clis/notebooklm/bind-current.test.d.ts +1 -0
  69. package/dist/clis/notebooklm/bind-current.test.js +35 -0
  70. package/dist/clis/notebooklm/binding.test.d.ts +1 -0
  71. package/dist/clis/notebooklm/binding.test.js +44 -0
  72. package/dist/clis/notebooklm/compat.test.d.ts +3 -0
  73. package/dist/clis/notebooklm/compat.test.js +16 -0
  74. package/dist/clis/notebooklm/current.d.ts +1 -0
  75. package/dist/clis/notebooklm/current.js +28 -0
  76. package/dist/clis/notebooklm/get.d.ts +1 -0
  77. package/dist/clis/notebooklm/get.js +37 -0
  78. package/dist/clis/notebooklm/history.d.ts +1 -0
  79. package/dist/clis/notebooklm/history.js +25 -0
  80. package/dist/clis/notebooklm/history.test.d.ts +1 -0
  81. package/dist/clis/notebooklm/history.test.js +58 -0
  82. package/dist/clis/notebooklm/list.d.ts +1 -0
  83. package/dist/clis/notebooklm/list.js +35 -0
  84. package/dist/clis/notebooklm/note-list.d.ts +1 -0
  85. package/dist/clis/notebooklm/note-list.js +28 -0
  86. package/dist/clis/notebooklm/note-list.test.d.ts +1 -0
  87. package/dist/clis/notebooklm/note-list.test.js +56 -0
  88. package/dist/clis/notebooklm/notes-get.d.ts +1 -0
  89. package/dist/clis/notebooklm/notes-get.js +47 -0
  90. package/dist/clis/notebooklm/notes-get.test.d.ts +1 -0
  91. package/dist/clis/notebooklm/notes-get.test.js +72 -0
  92. package/dist/clis/notebooklm/rpc.d.ts +36 -0
  93. package/dist/clis/notebooklm/rpc.js +189 -0
  94. package/dist/clis/notebooklm/rpc.test.d.ts +1 -0
  95. package/dist/clis/notebooklm/rpc.test.js +105 -0
  96. package/dist/clis/notebooklm/shared.d.ts +87 -0
  97. package/dist/clis/notebooklm/shared.js +3 -0
  98. package/dist/clis/notebooklm/source-fulltext.d.ts +1 -0
  99. package/dist/clis/notebooklm/source-fulltext.js +44 -0
  100. package/dist/clis/notebooklm/source-fulltext.test.d.ts +1 -0
  101. package/dist/clis/notebooklm/source-fulltext.test.js +106 -0
  102. package/dist/clis/notebooklm/source-get.d.ts +1 -0
  103. package/dist/clis/notebooklm/source-get.js +40 -0
  104. package/dist/clis/notebooklm/source-get.test.d.ts +1 -0
  105. package/dist/clis/notebooklm/source-get.test.js +84 -0
  106. package/dist/clis/notebooklm/source-guide.d.ts +1 -0
  107. package/dist/clis/notebooklm/source-guide.js +44 -0
  108. package/dist/clis/notebooklm/source-guide.test.d.ts +1 -0
  109. package/dist/clis/notebooklm/source-guide.test.js +104 -0
  110. package/dist/clis/notebooklm/source-list.d.ts +1 -0
  111. package/dist/clis/notebooklm/source-list.js +30 -0
  112. package/dist/clis/notebooklm/status.d.ts +1 -0
  113. package/dist/clis/notebooklm/status.js +31 -0
  114. package/dist/clis/notebooklm/summary.d.ts +1 -0
  115. package/dist/clis/notebooklm/summary.js +30 -0
  116. package/dist/clis/notebooklm/summary.test.d.ts +1 -0
  117. package/dist/clis/notebooklm/summary.test.js +78 -0
  118. package/dist/clis/notebooklm/utils.d.ts +37 -0
  119. package/dist/clis/notebooklm/utils.js +739 -0
  120. package/dist/clis/notebooklm/utils.test.d.ts +1 -0
  121. package/dist/clis/notebooklm/utils.test.js +390 -0
  122. package/dist/clis/substack/utils.d.ts +4 -0
  123. package/dist/clis/substack/utils.js +8 -2
  124. package/dist/clis/substack/utils.test.d.ts +1 -0
  125. package/dist/clis/substack/utils.test.js +46 -0
  126. package/dist/clis/v2ex/hot.yaml +4 -1
  127. package/dist/clis/v2ex/latest.yaml +4 -1
  128. package/dist/clis/v2ex/topic.yaml +6 -1
  129. package/dist/clis/weixin/download.d.ts +9 -0
  130. package/dist/clis/weixin/download.js +76 -6
  131. package/dist/clis/weread/book.js +108 -2
  132. package/dist/clis/weread/commands.test.js +262 -152
  133. package/dist/clis/weread/utils.d.ts +10 -0
  134. package/dist/clis/weread/utils.js +27 -7
  135. package/dist/clis/xiaohongshu/comments.d.ts +3 -0
  136. package/dist/clis/xiaohongshu/comments.js +76 -17
  137. package/dist/clis/xiaohongshu/comments.test.js +70 -9
  138. package/dist/clis/xiaohongshu/download.d.ts +4 -1
  139. package/dist/clis/xiaohongshu/download.js +83 -22
  140. package/dist/clis/xiaohongshu/download.test.d.ts +1 -0
  141. package/dist/clis/xiaohongshu/download.test.js +75 -0
  142. package/dist/clis/xiaohongshu/note-helpers.d.ts +12 -0
  143. package/dist/clis/xiaohongshu/note-helpers.js +23 -0
  144. package/dist/clis/xiaohongshu/note.d.ts +7 -0
  145. package/dist/clis/xiaohongshu/note.js +76 -0
  146. package/dist/clis/xiaohongshu/note.test.d.ts +1 -0
  147. package/dist/clis/xiaohongshu/note.test.js +136 -0
  148. package/dist/clis/xiaohongshu/search.js +9 -0
  149. package/dist/clis/xiaohongshu/search.test.js +10 -4
  150. package/dist/clis/youtube/search.js +57 -17
  151. package/dist/clis/zhihu/question.js +19 -17
  152. package/dist/clis/zhihu/question.test.d.ts +1 -0
  153. package/dist/clis/zhihu/question.test.js +54 -0
  154. package/dist/commanderAdapter.js +9 -0
  155. package/dist/commanderAdapter.test.js +25 -0
  156. package/dist/commands/daemon.d.ts +9 -0
  157. package/dist/commands/daemon.js +124 -0
  158. package/dist/commands/daemon.test.d.ts +1 -0
  159. package/dist/commands/daemon.test.js +185 -0
  160. package/dist/completion.js +3 -1
  161. package/dist/constants.d.ts +2 -0
  162. package/dist/constants.js +2 -0
  163. package/dist/daemon.d.ts +1 -1
  164. package/dist/daemon.js +25 -14
  165. package/dist/daemon.test.d.ts +1 -0
  166. package/dist/daemon.test.js +65 -0
  167. package/dist/discovery.d.ts +9 -0
  168. package/dist/discovery.js +47 -2
  169. package/dist/electron-apps.d.ts +29 -0
  170. package/dist/electron-apps.js +65 -0
  171. package/dist/electron-apps.test.d.ts +1 -0
  172. package/dist/electron-apps.test.js +43 -0
  173. package/dist/engine.test.js +41 -9
  174. package/dist/execution.js +20 -16
  175. package/dist/idle-manager.d.ts +19 -0
  176. package/dist/idle-manager.js +54 -0
  177. package/dist/launcher.d.ts +36 -0
  178. package/dist/launcher.js +152 -0
  179. package/dist/launcher.test.d.ts +1 -0
  180. package/dist/launcher.test.js +57 -0
  181. package/dist/main.js +3 -3
  182. package/dist/registry.d.ts +1 -0
  183. package/dist/registry.js +31 -3
  184. package/dist/registry.test.js +13 -0
  185. package/dist/runtime.d.ts +5 -3
  186. package/dist/runtime.js +12 -5
  187. package/dist/serialization.d.ts +1 -0
  188. package/dist/serialization.js +3 -0
  189. package/dist/serialization.test.js +17 -1
  190. package/dist/tui.d.ts +7 -0
  191. package/dist/tui.js +52 -0
  192. package/dist/tui.test.d.ts +1 -0
  193. package/dist/tui.test.js +19 -0
  194. package/dist/weixin-download.test.js +14 -0
  195. package/docs/.vitepress/config.mts +1 -0
  196. package/docs/adapters/browser/notebooklm.md +69 -0
  197. package/docs/adapters/browser/xiaohongshu.md +19 -10
  198. package/docs/adapters/index.md +67 -66
  199. package/docs/guide/browser-bridge.md +12 -0
  200. package/docs/guide/troubleshooting.md +9 -4
  201. package/docs/superpowers/plans/2026-03-31-daemon-lifecycle-redesign.md +857 -0
  202. package/docs/superpowers/specs/2026-03-31-daemon-lifecycle-redesign.md +208 -0
  203. package/docs/zh/guide/browser-bridge.md +12 -0
  204. package/extension/dist/background.js +794 -513
  205. package/extension/src/background.test.ts +202 -2
  206. package/extension/src/background.ts +174 -10
  207. package/extension/src/cdp.ts +12 -0
  208. package/extension/src/protocol.ts +7 -5
  209. package/package.json +1 -1
  210. package/src/browser/cdp.ts +24 -17
  211. package/src/browser/daemon-client.ts +7 -1
  212. package/src/browser/dom-helpers.test.ts +15 -1
  213. package/src/browser/dom-helpers.ts +1 -0
  214. package/src/browser/mcp.ts +18 -13
  215. package/src/browser/page.test.ts +58 -0
  216. package/src/browser/page.ts +18 -2
  217. package/src/browser/stealth.test.ts +153 -0
  218. package/src/browser/stealth.ts +198 -0
  219. package/src/browser.test.ts +1 -1
  220. package/src/build-manifest.test.ts +2 -0
  221. package/src/build-manifest.ts +6 -1
  222. package/src/cli.ts +21 -3
  223. package/src/clis/antigravity/SKILL.md +3 -12
  224. package/src/clis/antigravity/serve.ts +5 -10
  225. package/src/clis/bilibili/subtitle.test.ts +60 -0
  226. package/src/clis/bilibili/subtitle.ts +4 -0
  227. package/src/clis/chatwise/ask.ts +0 -2
  228. package/src/clis/chatwise/export.ts +0 -2
  229. package/src/clis/chatwise/history.ts +0 -2
  230. package/src/clis/chatwise/model.ts +0 -2
  231. package/src/clis/chatwise/new.ts +1 -2
  232. package/src/clis/chatwise/read.ts +0 -2
  233. package/src/clis/chatwise/screenshot.ts +1 -2
  234. package/src/clis/chatwise/send.ts +0 -2
  235. package/src/clis/chatwise/status.ts +1 -2
  236. package/src/clis/ctrip/search.test.ts +73 -0
  237. package/src/clis/ctrip/search.ts +97 -47
  238. package/src/clis/douyin/_shared/sts2.test.ts +31 -0
  239. package/src/clis/douyin/_shared/sts2.ts +11 -3
  240. package/src/clis/douyin/activities.test.ts +41 -1
  241. package/src/clis/douyin/activities.ts +12 -3
  242. package/src/clis/douyin/collections.test.ts +35 -2
  243. package/src/clis/douyin/collections.ts +1 -1
  244. package/src/clis/douyin/draft.test.ts +444 -2
  245. package/src/clis/douyin/draft.ts +382 -218
  246. package/src/clis/douyin/hashtag.test.ts +42 -2
  247. package/src/clis/douyin/hashtag.ts +11 -3
  248. package/src/clis/douyin/profile.test.ts +43 -1
  249. package/src/clis/douyin/profile.ts +9 -2
  250. package/src/clis/douyin/videos.test.ts +52 -2
  251. package/src/clis/douyin/videos.ts +49 -15
  252. package/src/clis/facebook/search.test.ts +70 -0
  253. package/src/clis/facebook/search.yaml +4 -3
  254. package/src/clis/instagram/download.test.ts +159 -0
  255. package/src/clis/instagram/download.ts +286 -0
  256. package/src/clis/notebooklm/bind-current.test.ts +43 -0
  257. package/src/clis/notebooklm/bind-current.ts +36 -0
  258. package/src/clis/notebooklm/binding.test.ts +53 -0
  259. package/src/clis/notebooklm/compat.test.ts +19 -0
  260. package/src/clis/notebooklm/current.ts +38 -0
  261. package/src/clis/notebooklm/get.ts +53 -0
  262. package/src/clis/notebooklm/history.test.ts +70 -0
  263. package/src/clis/notebooklm/history.ts +36 -0
  264. package/src/clis/notebooklm/list.ts +40 -0
  265. package/src/clis/notebooklm/note-list.test.ts +64 -0
  266. package/src/clis/notebooklm/note-list.ts +42 -0
  267. package/src/clis/notebooklm/notes-get.test.ts +88 -0
  268. package/src/clis/notebooklm/notes-get.ts +67 -0
  269. package/src/clis/notebooklm/rpc.test.ts +126 -0
  270. package/src/clis/notebooklm/rpc.ts +286 -0
  271. package/src/clis/notebooklm/shared.ts +98 -0
  272. package/src/clis/notebooklm/source-fulltext.test.ts +123 -0
  273. package/src/clis/notebooklm/source-fulltext.ts +69 -0
  274. package/src/clis/notebooklm/source-get.test.ts +100 -0
  275. package/src/clis/notebooklm/source-get.ts +60 -0
  276. package/src/clis/notebooklm/source-guide.test.ts +121 -0
  277. package/src/clis/notebooklm/source-guide.ts +69 -0
  278. package/src/clis/notebooklm/source-list.ts +45 -0
  279. package/src/clis/notebooklm/status.ts +34 -0
  280. package/src/clis/notebooklm/summary.test.ts +94 -0
  281. package/src/clis/notebooklm/summary.ts +45 -0
  282. package/src/clis/notebooklm/utils.test.ts +446 -0
  283. package/src/clis/notebooklm/utils.ts +893 -0
  284. package/src/clis/substack/utils.test.ts +54 -0
  285. package/src/clis/substack/utils.ts +10 -2
  286. package/src/clis/v2ex/hot.yaml +4 -1
  287. package/src/clis/v2ex/latest.yaml +4 -1
  288. package/src/clis/v2ex/topic.yaml +6 -1
  289. package/src/clis/weixin/download.ts +95 -6
  290. package/src/clis/weread/book.ts +142 -2
  291. package/src/clis/weread/commands.test.ts +314 -154
  292. package/src/clis/weread/utils.ts +33 -4
  293. package/src/clis/xiaohongshu/comments.test.ts +85 -9
  294. package/src/clis/xiaohongshu/comments.ts +76 -17
  295. package/src/clis/xiaohongshu/download.test.ts +96 -0
  296. package/src/clis/xiaohongshu/download.ts +83 -22
  297. package/src/clis/xiaohongshu/note-helpers.ts +25 -0
  298. package/src/clis/xiaohongshu/note.test.ts +164 -0
  299. package/src/clis/xiaohongshu/note.ts +86 -0
  300. package/src/clis/xiaohongshu/search.test.ts +11 -4
  301. package/src/clis/xiaohongshu/search.ts +13 -0
  302. package/src/clis/youtube/search.ts +57 -17
  303. package/src/clis/zhihu/question.test.ts +71 -0
  304. package/src/clis/zhihu/question.ts +27 -15
  305. package/src/commanderAdapter.test.ts +30 -0
  306. package/src/commanderAdapter.ts +7 -0
  307. package/src/commands/daemon.test.ts +238 -0
  308. package/src/commands/daemon.ts +135 -0
  309. package/src/completion.ts +2 -1
  310. package/src/constants.ts +3 -0
  311. package/src/daemon.test.ts +88 -0
  312. package/src/daemon.ts +26 -14
  313. package/src/discovery.ts +52 -2
  314. package/src/electron-apps.test.ts +50 -0
  315. package/src/electron-apps.ts +89 -0
  316. package/src/engine.test.ts +45 -9
  317. package/src/execution.ts +24 -19
  318. package/src/idle-manager.ts +60 -0
  319. package/src/launcher.test.ts +67 -0
  320. package/src/launcher.ts +185 -0
  321. package/src/main.ts +3 -2
  322. package/src/registry.test.ts +15 -0
  323. package/src/registry.ts +32 -3
  324. package/src/runtime.ts +13 -7
  325. package/src/serialization.test.ts +19 -1
  326. package/src/serialization.ts +2 -0
  327. package/src/tui.test.ts +23 -0
  328. package/src/tui.ts +65 -0
  329. package/src/weixin-download.test.ts +27 -0
  330. package/tests/e2e/browser-public-extended.test.ts +6 -2
  331. package/chatwise-opencli.ps1 +0 -82
  332. package/dist/clis/chatwise/shared.d.ts +0 -2
  333. package/dist/clis/chatwise/shared.js +0 -6
  334. package/src/clis/chatwise/shared.ts +0 -8
@@ -3026,10 +3026,9 @@
3026
3026
  {
3027
3027
  "site": "ctrip",
3028
3028
  "name": "search",
3029
- "description": "携程旅行搜索",
3030
- "domain": "www.ctrip.com",
3031
- "strategy": "cookie",
3032
- "browser": true,
3029
+ "description": "搜索携程目的地、景区和酒店联想结果",
3030
+ "strategy": "public",
3031
+ "browser": false,
3033
3032
  "args": [
3034
3033
  {
3035
3034
  "name": "query",
@@ -4453,10 +4452,11 @@
4453
4452
  ],
4454
4453
  "columns": [
4455
4454
  "status",
4456
- "aweme_id"
4455
+ "draft_id"
4457
4456
  ],
4458
4457
  "type": "ts",
4459
- "modulePath": "douyin/draft.js"
4458
+ "modulePath": "douyin/draft.js",
4459
+ "navigateBefore": false
4460
4460
  },
4461
4461
  {
4462
4462
  "site": "douyin",
@@ -5207,7 +5207,13 @@
5207
5207
  "navigate": "https://www.facebook.com"
5208
5208
  },
5209
5209
  {
5210
- "evaluate": "(async () => {\n const query = ${{ args.query | json }};\n const limit = ${{ args.limit }};\n window.location.href = 'https://www.facebook.com/search/top?q=' + encodeURIComponent(query);\n await new Promise(r => setTimeout(r, 4000));\n // Search results are typically in role=\"article\" or role=\"listitem\"\n let items = document.querySelectorAll('[role=\"article\"]');\n if (items.length === 0) {\n items = document.querySelectorAll('[role=\"listitem\"]');\n }\n return Array.from(items)\n .filter(el => el.textContent.trim().length > 20)\n .slice(0, limit)\n .map((el, i) => {\n const link = el.querySelector('a[href*=\"facebook.com/\"]');\n const heading = el.querySelector('h2, h3, h4, strong');\n return {\n index: i + 1,\n title: heading ? heading.textContent.trim().substring(0, 80) : '',\n text: el.textContent.trim().replace(/\\s+/g, ' ').substring(0, 150),\n url: link ? link.href.split('?')[0] : '',\n };\n });\n})()\n"
5210
+ "navigate": {
5211
+ "url": "https://www.facebook.com/search/top?q=${{ args.query | urlencode }}",
5212
+ "settleMs": 4000
5213
+ }
5214
+ },
5215
+ {
5216
+ "evaluate": "(async () => {\n const limit = ${{ args.limit }};\n // Search results are typically in role=\"article\" or role=\"listitem\"\n let items = document.querySelectorAll('[role=\"article\"]');\n if (items.length === 0) {\n items = document.querySelectorAll('[role=\"listitem\"]');\n }\n return Array.from(items)\n .filter(el => el.textContent.trim().length > 20)\n .slice(0, limit)\n .map((el, i) => {\n const link = el.querySelector('a[href*=\"facebook.com/\"]');\n const heading = el.querySelector('h2, h3, h4, strong');\n return {\n index: i + 1,\n title: heading ? heading.textContent.trim().substring(0, 80) : '',\n text: el.textContent.trim().replace(/\\s+/g, ' ').substring(0, 150),\n url: link ? link.href.split('?')[0] : '',\n };\n });\n})()\n"
5211
5217
  }
5212
5218
  ],
5213
5219
  "type": "yaml"
@@ -6143,6 +6149,33 @@
6143
6149
  ],
6144
6150
  "type": "yaml"
6145
6151
  },
6152
+ {
6153
+ "site": "instagram",
6154
+ "name": "download",
6155
+ "description": "Download images and videos from Instagram posts and reels",
6156
+ "domain": "www.instagram.com",
6157
+ "strategy": "cookie",
6158
+ "browser": true,
6159
+ "args": [
6160
+ {
6161
+ "name": "url",
6162
+ "type": "str",
6163
+ "required": true,
6164
+ "positional": true,
6165
+ "help": "Instagram post / reel / tv URL"
6166
+ },
6167
+ {
6168
+ "name": "path",
6169
+ "type": "str",
6170
+ "default": "/home/runner/Downloads/Instagram",
6171
+ "required": false,
6172
+ "help": "Download directory"
6173
+ }
6174
+ ],
6175
+ "type": "ts",
6176
+ "modulePath": "instagram/download.js",
6177
+ "navigateBefore": false
6178
+ },
6146
6179
  {
6147
6180
  "site": "instagram",
6148
6181
  "name": "explore",
@@ -8046,6 +8079,304 @@
8046
8079
  "type": "ts",
8047
8080
  "modulePath": "medium/user.js"
8048
8081
  },
8082
+ {
8083
+ "site": "notebooklm",
8084
+ "name": "bind-current",
8085
+ "aliases": [
8086
+ "use"
8087
+ ],
8088
+ "description": "Bind the current active NotebookLM notebook tab into the site:notebooklm workspace",
8089
+ "domain": "notebooklm.google.com",
8090
+ "strategy": "cookie",
8091
+ "browser": true,
8092
+ "args": [],
8093
+ "columns": [
8094
+ "workspace",
8095
+ "tab_id",
8096
+ "notebook_id",
8097
+ "title",
8098
+ "url"
8099
+ ],
8100
+ "type": "ts",
8101
+ "modulePath": "notebooklm/bind-current.js",
8102
+ "navigateBefore": false
8103
+ },
8104
+ {
8105
+ "site": "notebooklm",
8106
+ "name": "current",
8107
+ "description": "Show metadata for the currently opened NotebookLM notebook tab",
8108
+ "domain": "notebooklm.google.com",
8109
+ "strategy": "cookie",
8110
+ "browser": true,
8111
+ "args": [],
8112
+ "columns": [
8113
+ "id",
8114
+ "title",
8115
+ "url",
8116
+ "source"
8117
+ ],
8118
+ "type": "ts",
8119
+ "modulePath": "notebooklm/current.js",
8120
+ "navigateBefore": false
8121
+ },
8122
+ {
8123
+ "site": "notebooklm",
8124
+ "name": "get",
8125
+ "aliases": [
8126
+ "metadata"
8127
+ ],
8128
+ "description": "Get rich metadata for the currently opened NotebookLM notebook",
8129
+ "domain": "notebooklm.google.com",
8130
+ "strategy": "cookie",
8131
+ "browser": true,
8132
+ "args": [],
8133
+ "columns": [
8134
+ "id",
8135
+ "title",
8136
+ "emoji",
8137
+ "source_count",
8138
+ "created_at",
8139
+ "updated_at",
8140
+ "url",
8141
+ "source"
8142
+ ],
8143
+ "type": "ts",
8144
+ "modulePath": "notebooklm/get.js",
8145
+ "navigateBefore": false
8146
+ },
8147
+ {
8148
+ "site": "notebooklm",
8149
+ "name": "history",
8150
+ "description": "List NotebookLM conversation history threads in the current notebook",
8151
+ "domain": "notebooklm.google.com",
8152
+ "strategy": "cookie",
8153
+ "browser": true,
8154
+ "args": [],
8155
+ "columns": [
8156
+ "thread_id",
8157
+ "item_count",
8158
+ "preview",
8159
+ "source",
8160
+ "notebook_id",
8161
+ "url"
8162
+ ],
8163
+ "type": "ts",
8164
+ "modulePath": "notebooklm/history.js",
8165
+ "navigateBefore": false
8166
+ },
8167
+ {
8168
+ "site": "notebooklm",
8169
+ "name": "list",
8170
+ "description": "List NotebookLM notebooks via in-page batchexecute RPC in the current logged-in session",
8171
+ "domain": "notebooklm.google.com",
8172
+ "strategy": "cookie",
8173
+ "browser": true,
8174
+ "args": [],
8175
+ "columns": [
8176
+ "title",
8177
+ "id",
8178
+ "is_owner",
8179
+ "created_at",
8180
+ "source",
8181
+ "url"
8182
+ ],
8183
+ "type": "ts",
8184
+ "modulePath": "notebooklm/list.js",
8185
+ "navigateBefore": false
8186
+ },
8187
+ {
8188
+ "site": "notebooklm",
8189
+ "name": "note-list",
8190
+ "aliases": [
8191
+ "notes-list"
8192
+ ],
8193
+ "description": "List saved notes from the Studio panel of the current NotebookLM notebook",
8194
+ "domain": "notebooklm.google.com",
8195
+ "strategy": "cookie",
8196
+ "browser": true,
8197
+ "args": [],
8198
+ "columns": [
8199
+ "title",
8200
+ "created_at",
8201
+ "source",
8202
+ "url"
8203
+ ],
8204
+ "type": "ts",
8205
+ "modulePath": "notebooklm/note-list.js",
8206
+ "navigateBefore": false
8207
+ },
8208
+ {
8209
+ "site": "notebooklm",
8210
+ "name": "notes-get",
8211
+ "description": "Get one note from the current NotebookLM notebook by title from the visible note editor",
8212
+ "domain": "notebooklm.google.com",
8213
+ "strategy": "cookie",
8214
+ "browser": true,
8215
+ "args": [
8216
+ {
8217
+ "name": "note",
8218
+ "type": "str",
8219
+ "required": true,
8220
+ "positional": true,
8221
+ "help": "Note title or id from the current notebook"
8222
+ }
8223
+ ],
8224
+ "columns": [
8225
+ "title",
8226
+ "content",
8227
+ "source",
8228
+ "url"
8229
+ ],
8230
+ "type": "ts",
8231
+ "modulePath": "notebooklm/notes-get.js",
8232
+ "navigateBefore": false
8233
+ },
8234
+ {
8235
+ "site": "notebooklm",
8236
+ "name": "source-fulltext",
8237
+ "description": "Get the extracted fulltext for one source in the currently opened NotebookLM notebook",
8238
+ "domain": "notebooklm.google.com",
8239
+ "strategy": "cookie",
8240
+ "browser": true,
8241
+ "args": [
8242
+ {
8243
+ "name": "source",
8244
+ "type": "str",
8245
+ "required": true,
8246
+ "positional": true,
8247
+ "help": "Source id or title from the current notebook"
8248
+ }
8249
+ ],
8250
+ "columns": [
8251
+ "title",
8252
+ "kind",
8253
+ "char_count",
8254
+ "url",
8255
+ "source"
8256
+ ],
8257
+ "type": "ts",
8258
+ "modulePath": "notebooklm/source-fulltext.js",
8259
+ "navigateBefore": false
8260
+ },
8261
+ {
8262
+ "site": "notebooklm",
8263
+ "name": "source-get",
8264
+ "description": "Get one source from the currently opened NotebookLM notebook by id or title",
8265
+ "domain": "notebooklm.google.com",
8266
+ "strategy": "cookie",
8267
+ "browser": true,
8268
+ "args": [
8269
+ {
8270
+ "name": "source",
8271
+ "type": "str",
8272
+ "required": true,
8273
+ "positional": true,
8274
+ "help": "Source id or title from the current notebook"
8275
+ }
8276
+ ],
8277
+ "columns": [
8278
+ "title",
8279
+ "id",
8280
+ "type",
8281
+ "size",
8282
+ "created_at",
8283
+ "updated_at",
8284
+ "url",
8285
+ "source"
8286
+ ],
8287
+ "type": "ts",
8288
+ "modulePath": "notebooklm/source-get.js",
8289
+ "navigateBefore": false
8290
+ },
8291
+ {
8292
+ "site": "notebooklm",
8293
+ "name": "source-guide",
8294
+ "description": "Get the guide summary and keywords for one source in the currently opened NotebookLM notebook",
8295
+ "domain": "notebooklm.google.com",
8296
+ "strategy": "cookie",
8297
+ "browser": true,
8298
+ "args": [
8299
+ {
8300
+ "name": "source",
8301
+ "type": "str",
8302
+ "required": true,
8303
+ "positional": true,
8304
+ "help": "Source id or title from the current notebook"
8305
+ }
8306
+ ],
8307
+ "columns": [
8308
+ "source_id",
8309
+ "notebook_id",
8310
+ "title",
8311
+ "type",
8312
+ "summary",
8313
+ "keywords",
8314
+ "source"
8315
+ ],
8316
+ "type": "ts",
8317
+ "modulePath": "notebooklm/source-guide.js",
8318
+ "navigateBefore": false
8319
+ },
8320
+ {
8321
+ "site": "notebooklm",
8322
+ "name": "source-list",
8323
+ "description": "List sources for the currently opened NotebookLM notebook",
8324
+ "domain": "notebooklm.google.com",
8325
+ "strategy": "cookie",
8326
+ "browser": true,
8327
+ "args": [],
8328
+ "columns": [
8329
+ "title",
8330
+ "id",
8331
+ "type",
8332
+ "size",
8333
+ "created_at",
8334
+ "updated_at",
8335
+ "url",
8336
+ "source"
8337
+ ],
8338
+ "type": "ts",
8339
+ "modulePath": "notebooklm/source-list.js",
8340
+ "navigateBefore": false
8341
+ },
8342
+ {
8343
+ "site": "notebooklm",
8344
+ "name": "status",
8345
+ "description": "Check NotebookLM page availability and login state in the current Chrome session",
8346
+ "domain": "notebooklm.google.com",
8347
+ "strategy": "cookie",
8348
+ "browser": true,
8349
+ "args": [],
8350
+ "columns": [
8351
+ "status",
8352
+ "login",
8353
+ "page",
8354
+ "url",
8355
+ "title",
8356
+ "notebooks"
8357
+ ],
8358
+ "type": "ts",
8359
+ "modulePath": "notebooklm/status.js",
8360
+ "navigateBefore": false
8361
+ },
8362
+ {
8363
+ "site": "notebooklm",
8364
+ "name": "summary",
8365
+ "description": "Get the summary block from the currently opened NotebookLM notebook",
8366
+ "domain": "notebooklm.google.com",
8367
+ "strategy": "cookie",
8368
+ "browser": true,
8369
+ "args": [],
8370
+ "columns": [
8371
+ "title",
8372
+ "summary",
8373
+ "source",
8374
+ "url"
8375
+ ],
8376
+ "type": "ts",
8377
+ "modulePath": "notebooklm/summary.js",
8378
+ "navigateBefore": false
8379
+ },
8049
8380
  {
8050
8381
  "site": "notion",
8051
8382
  "name": "export",
@@ -9542,8 +9873,8 @@
9542
9873
  },
9543
9874
  {
9544
9875
  "site": "reddit",
9545
- "name": "user-comments",
9546
- "description": "View a Reddit user's comment history",
9876
+ "name": "user",
9877
+ "description": "View a Reddit user profile",
9547
9878
  "domain": "reddit.com",
9548
9879
  "strategy": "cookie",
9549
9880
  "browser": true,
@@ -9554,47 +9885,32 @@
9554
9885
  "required": true,
9555
9886
  "positional": true,
9556
9887
  "help": ""
9557
- },
9558
- {
9559
- "name": "limit",
9560
- "type": "int",
9561
- "default": 15,
9562
- "required": false,
9563
- "positional": false,
9564
- "help": ""
9565
9888
  }
9566
9889
  ],
9567
9890
  "columns": [
9568
- "subreddit",
9569
- "score",
9570
- "body",
9571
- "url"
9891
+ "field",
9892
+ "value"
9572
9893
  ],
9573
9894
  "pipeline": [
9574
9895
  {
9575
9896
  "navigate": "https://www.reddit.com"
9576
9897
  },
9577
9898
  {
9578
- "evaluate": "(async () => {\n const username = ${{ args.username | json }};\n const name = username.startsWith('u/') ? username.slice(2) : username;\n const limit = ${{ args.limit }};\n const res = await fetch('/user/' + name + '/comments.json?limit=' + limit + '&raw_json=1', {\n credentials: 'include'\n });\n const d = await res.json();\n return (d?.data?.children || []).map(c => {\n let body = c.data.body || '';\n if (body.length > 300) body = body.slice(0, 300) + '...';\n return {\n subreddit: c.data.subreddit_name_prefixed,\n score: c.data.score,\n body: body,\n url: 'https://www.reddit.com' + c.data.permalink,\n };\n });\n})()\n"
9899
+ "evaluate": "(async () => {\n const username = ${{ args.username | json }};\n const name = username.startsWith('u/') ? username.slice(2) : username;\n const res = await fetch('/user/' + name + '/about.json?raw_json=1', {\n credentials: 'include'\n });\n const d = await res.json();\n const u = d?.data || d || {};\n const created = u.created_utc ? new Date(u.created_utc * 1000).toISOString().split('T')[0] : '-';\n return [\n { field: 'Username', value: 'u/' + (u.name || name) },\n { field: 'Post Karma', value: String(u.link_karma || 0) },\n { field: 'Comment Karma', value: String(u.comment_karma || 0) },\n { field: 'Total Karma', value: String(u.total_karma || (u.link_karma||0) + (u.comment_karma||0)) },\n { field: 'Account Created', value: created },\n { field: 'Gold', value: u.is_gold ? ' Yes' : 'No' },\n { field: 'Verified', value: u.verified ? '✅ Yes' : 'No' },\n ];\n})()\n"
9579
9900
  },
9580
9901
  {
9581
9902
  "map": {
9582
- "subreddit": "${{ item.subreddit }}",
9583
- "score": "${{ item.score }}",
9584
- "body": "${{ item.body }}",
9585
- "url": "${{ item.url }}"
9903
+ "field": "${{ item.field }}",
9904
+ "value": "${{ item.value }}"
9586
9905
  }
9587
- },
9588
- {
9589
- "limit": "${{ args.limit }}"
9590
9906
  }
9591
9907
  ],
9592
9908
  "type": "yaml"
9593
9909
  },
9594
9910
  {
9595
9911
  "site": "reddit",
9596
- "name": "user-posts",
9597
- "description": "View a Reddit user's submitted posts",
9912
+ "name": "user-comments",
9913
+ "description": "View a Reddit user's comment history",
9598
9914
  "domain": "reddit.com",
9599
9915
  "strategy": "cookie",
9600
9916
  "browser": true,
@@ -9616,10 +9932,9 @@
9616
9932
  }
9617
9933
  ],
9618
9934
  "columns": [
9619
- "title",
9620
9935
  "subreddit",
9621
9936
  "score",
9622
- "comments",
9937
+ "body",
9623
9938
  "url"
9624
9939
  ],
9625
9940
  "pipeline": [
@@ -9627,14 +9942,13 @@
9627
9942
  "navigate": "https://www.reddit.com"
9628
9943
  },
9629
9944
  {
9630
- "evaluate": "(async () => {\n const username = ${{ args.username | json }};\n const name = username.startsWith('u/') ? username.slice(2) : username;\n const limit = ${{ args.limit }};\n const res = await fetch('/user/' + name + '/submitted.json?limit=' + limit + '&raw_json=1', {\n credentials: 'include'\n });\n const d = await res.json();\n return (d?.data?.children || []).map(c => ({\n title: c.data.title,\n subreddit: c.data.subreddit_name_prefixed,\n score: c.data.score,\n comments: c.data.num_comments,\n url: 'https://www.reddit.com' + c.data.permalink,\n }));\n})()\n"
9945
+ "evaluate": "(async () => {\n const username = ${{ args.username | json }};\n const name = username.startsWith('u/') ? username.slice(2) : username;\n const limit = ${{ args.limit }};\n const res = await fetch('/user/' + name + '/comments.json?limit=' + limit + '&raw_json=1', {\n credentials: 'include'\n });\n const d = await res.json();\n return (d?.data?.children || []).map(c => {\n let body = c.data.body || '';\n if (body.length > 300) body = body.slice(0, 300) + '...';\n return {\n subreddit: c.data.subreddit_name_prefixed,\n score: c.data.score,\n body: body,\n url: 'https://www.reddit.com' + c.data.permalink,\n };\n });\n})()\n"
9631
9946
  },
9632
9947
  {
9633
9948
  "map": {
9634
- "title": "${{ item.title }}",
9635
9949
  "subreddit": "${{ item.subreddit }}",
9636
9950
  "score": "${{ item.score }}",
9637
- "comments": "${{ item.comments }}",
9951
+ "body": "${{ item.body }}",
9638
9952
  "url": "${{ item.url }}"
9639
9953
  }
9640
9954
  },
@@ -9646,8 +9960,8 @@
9646
9960
  },
9647
9961
  {
9648
9962
  "site": "reddit",
9649
- "name": "user",
9650
- "description": "View a Reddit user profile",
9963
+ "name": "user-posts",
9964
+ "description": "View a Reddit user's submitted posts",
9651
9965
  "domain": "reddit.com",
9652
9966
  "strategy": "cookie",
9653
9967
  "browser": true,
@@ -9658,24 +9972,41 @@
9658
9972
  "required": true,
9659
9973
  "positional": true,
9660
9974
  "help": ""
9975
+ },
9976
+ {
9977
+ "name": "limit",
9978
+ "type": "int",
9979
+ "default": 15,
9980
+ "required": false,
9981
+ "positional": false,
9982
+ "help": ""
9661
9983
  }
9662
9984
  ],
9663
9985
  "columns": [
9664
- "field",
9665
- "value"
9986
+ "title",
9987
+ "subreddit",
9988
+ "score",
9989
+ "comments",
9990
+ "url"
9666
9991
  ],
9667
9992
  "pipeline": [
9668
9993
  {
9669
9994
  "navigate": "https://www.reddit.com"
9670
9995
  },
9671
9996
  {
9672
- "evaluate": "(async () => {\n const username = ${{ args.username | json }};\n const name = username.startsWith('u/') ? username.slice(2) : username;\n const res = await fetch('/user/' + name + '/about.json?raw_json=1', {\n credentials: 'include'\n });\n const d = await res.json();\n const u = d?.data || d || {};\n const created = u.created_utc ? new Date(u.created_utc * 1000).toISOString().split('T')[0] : '-';\n return [\n { field: 'Username', value: 'u/' + (u.name || name) },\n { field: 'Post Karma', value: String(u.link_karma || 0) },\n { field: 'Comment Karma', value: String(u.comment_karma || 0) },\n { field: 'Total Karma', value: String(u.total_karma || (u.link_karma||0) + (u.comment_karma||0)) },\n { field: 'Account Created', value: created },\n { field: 'Gold', value: u.is_gold ? ' Yes' : 'No' },\n { field: 'Verified', value: u.verified ? '✅ Yes' : 'No' },\n ];\n})()\n"
9997
+ "evaluate": "(async () => {\n const username = ${{ args.username | json }};\n const name = username.startsWith('u/') ? username.slice(2) : username;\n const limit = ${{ args.limit }};\n const res = await fetch('/user/' + name + '/submitted.json?limit=' + limit + '&raw_json=1', {\n credentials: 'include'\n });\n const d = await res.json();\n return (d?.data?.children || []).map(c => ({\n title: c.data.title,\n subreddit: c.data.subreddit_name_prefixed,\n score: c.data.score,\n comments: c.data.num_comments,\n url: 'https://www.reddit.com' + c.data.permalink,\n }));\n})()\n"
9673
9998
  },
9674
9999
  {
9675
10000
  "map": {
9676
- "field": "${{ item.field }}",
9677
- "value": "${{ item.value }}"
10001
+ "title": "${{ item.title }}",
10002
+ "subreddit": "${{ item.subreddit }}",
10003
+ "score": "${{ item.score }}",
10004
+ "comments": "${{ item.comments }}",
10005
+ "url": "${{ item.url }}"
9678
10006
  }
10007
+ },
10008
+ {
10009
+ "limit": "${{ args.limit }}"
9679
10010
  }
9680
10011
  ],
9681
10012
  "type": "yaml"
@@ -11686,6 +12017,37 @@
11686
12017
  "type": "ts",
11687
12018
  "modulePath": "twitter/profile.js"
11688
12019
  },
12020
+ {
12021
+ "site": "twitter",
12022
+ "name": "reply",
12023
+ "description": "Reply to a specific tweet",
12024
+ "domain": "x.com",
12025
+ "strategy": "ui",
12026
+ "browser": true,
12027
+ "args": [
12028
+ {
12029
+ "name": "url",
12030
+ "type": "string",
12031
+ "required": true,
12032
+ "positional": true,
12033
+ "help": "The URL of the tweet to reply to"
12034
+ },
12035
+ {
12036
+ "name": "text",
12037
+ "type": "string",
12038
+ "required": true,
12039
+ "positional": true,
12040
+ "help": "The text content of your reply"
12041
+ }
12042
+ ],
12043
+ "columns": [
12044
+ "status",
12045
+ "message",
12046
+ "text"
12047
+ ],
12048
+ "type": "ts",
12049
+ "modulePath": "twitter/reply.js"
12050
+ },
11689
12051
  {
11690
12052
  "site": "twitter",
11691
12053
  "name": "reply-dm",
@@ -11726,37 +12088,6 @@
11726
12088
  "type": "ts",
11727
12089
  "modulePath": "twitter/reply-dm.js"
11728
12090
  },
11729
- {
11730
- "site": "twitter",
11731
- "name": "reply",
11732
- "description": "Reply to a specific tweet",
11733
- "domain": "x.com",
11734
- "strategy": "ui",
11735
- "browser": true,
11736
- "args": [
11737
- {
11738
- "name": "url",
11739
- "type": "string",
11740
- "required": true,
11741
- "positional": true,
11742
- "help": "The URL of the tweet to reply to"
11743
- },
11744
- {
11745
- "name": "text",
11746
- "type": "string",
11747
- "required": true,
11748
- "positional": true,
11749
- "help": "The text content of your reply"
11750
- }
11751
- ],
11752
- "columns": [
11753
- "status",
11754
- "message",
11755
- "text"
11756
- ],
11757
- "type": "ts",
11758
- "modulePath": "twitter/reply.js"
11759
- },
11760
12091
  {
11761
12092
  "site": "twitter",
11762
12093
  "name": "search",
@@ -12005,9 +12336,12 @@
12005
12336
  }
12006
12337
  ],
12007
12338
  "columns": [
12339
+ "id",
12008
12340
  "rank",
12009
12341
  "title",
12010
- "replies"
12342
+ "node",
12343
+ "replies",
12344
+ "url"
12011
12345
  ],
12012
12346
  "pipeline": [
12013
12347
  {
@@ -12017,9 +12351,12 @@
12017
12351
  },
12018
12352
  {
12019
12353
  "map": {
12354
+ "id": "${{ item.id }}",
12020
12355
  "rank": "${{ index + 1 }}",
12021
12356
  "title": "${{ item.title }}",
12022
- "replies": "${{ item.replies }}"
12357
+ "node": "${{ item.node.title }}",
12358
+ "replies": "${{ item.replies }}",
12359
+ "url": "${{ item.url }}"
12023
12360
  }
12024
12361
  },
12025
12362
  {
@@ -12046,9 +12383,12 @@
12046
12383
  }
12047
12384
  ],
12048
12385
  "columns": [
12386
+ "id",
12049
12387
  "rank",
12050
12388
  "title",
12051
- "replies"
12389
+ "node",
12390
+ "replies",
12391
+ "url"
12052
12392
  ],
12053
12393
  "pipeline": [
12054
12394
  {
@@ -12058,9 +12398,12 @@
12058
12398
  },
12059
12399
  {
12060
12400
  "map": {
12401
+ "id": "${{ item.id }}",
12061
12402
  "rank": "${{ index + 1 }}",
12062
12403
  "title": "${{ item.title }}",
12063
- "replies": "${{ item.replies }}"
12404
+ "node": "${{ item.node.title }}",
12405
+ "replies": "${{ item.replies }}",
12406
+ "url": "${{ item.url }}"
12064
12407
  }
12065
12408
  },
12066
12409
  {
@@ -12330,7 +12673,12 @@
12330
12673
  }
12331
12674
  ],
12332
12675
  "columns": [
12676
+ "id",
12333
12677
  "title",
12678
+ "content",
12679
+ "member",
12680
+ "created",
12681
+ "node",
12334
12682
  "replies",
12335
12683
  "url"
12336
12684
  ],
@@ -12345,7 +12693,12 @@
12345
12693
  },
12346
12694
  {
12347
12695
  "map": {
12696
+ "id": "${{ item.id }}",
12348
12697
  "title": "${{ item.title }}",
12698
+ "content": "${{ item.content }}",
12699
+ "member": "${{ item.member.username }}",
12700
+ "created": "${{ item.created }}",
12701
+ "node": "${{ item.node.title }}",
12349
12702
  "replies": "${{ item.replies }}",
12350
12703
  "url": "${{ item.url }}"
12351
12704
  }
@@ -13017,7 +13370,7 @@
13017
13370
  {
13018
13371
  "site": "xiaohongshu",
13019
13372
  "name": "comments",
13020
- "description": "获取小红书笔记评论(仅主评论,不含楼中楼)",
13373
+ "description": "获取小红书笔记评论(支持楼中楼子回复)",
13021
13374
  "domain": "www.xiaohongshu.com",
13022
13375
  "strategy": "cookie",
13023
13376
  "browser": true,
@@ -13027,14 +13380,21 @@
13027
13380
  "type": "str",
13028
13381
  "required": true,
13029
13382
  "positional": true,
13030
- "help": "Note ID or full /explore/<id> URL"
13383
+ "help": "Note ID or full URL (preserves xsec_token for access)"
13031
13384
  },
13032
13385
  {
13033
13386
  "name": "limit",
13034
13387
  "type": "int",
13035
13388
  "default": 20,
13036
13389
  "required": false,
13037
- "help": "Number of comments (max 50)"
13390
+ "help": "Number of top-level comments (max 50)"
13391
+ },
13392
+ {
13393
+ "name": "with-replies",
13394
+ "type": "boolean",
13395
+ "default": false,
13396
+ "required": false,
13397
+ "help": "Include nested replies (楼中楼)"
13038
13398
  }
13039
13399
  ],
13040
13400
  "columns": [
@@ -13042,7 +13402,9 @@
13042
13402
  "author",
13043
13403
  "text",
13044
13404
  "likes",
13045
- "time"
13405
+ "time",
13406
+ "is_reply",
13407
+ "reply_to"
13046
13408
  ],
13047
13409
  "type": "ts",
13048
13410
  "modulePath": "xiaohongshu/comments.js"
@@ -13193,7 +13555,7 @@
13193
13555
  "type": "str",
13194
13556
  "required": true,
13195
13557
  "positional": true,
13196
- "help": "Note ID (from URL)"
13558
+ "help": "Note ID, full URL, or short link"
13197
13559
  },
13198
13560
  {
13199
13561
  "name": "output",
@@ -13265,6 +13627,29 @@
13265
13627
  ],
13266
13628
  "type": "yaml"
13267
13629
  },
13630
+ {
13631
+ "site": "xiaohongshu",
13632
+ "name": "note",
13633
+ "description": "获取小红书笔记正文和互动数据",
13634
+ "domain": "www.xiaohongshu.com",
13635
+ "strategy": "cookie",
13636
+ "browser": true,
13637
+ "args": [
13638
+ {
13639
+ "name": "note-id",
13640
+ "type": "str",
13641
+ "required": true,
13642
+ "positional": true,
13643
+ "help": "Note ID or full URL (preserves xsec_token for access)"
13644
+ }
13645
+ ],
13646
+ "columns": [
13647
+ "field",
13648
+ "value"
13649
+ ],
13650
+ "type": "ts",
13651
+ "modulePath": "xiaohongshu/note.js"
13652
+ },
13268
13653
  {
13269
13654
  "site": "xiaohongshu",
13270
13655
  "name": "notifications",
@@ -13475,8 +13860,8 @@
13475
13860
  },
13476
13861
  {
13477
13862
  "site": "xiaoyuzhou",
13478
- "name": "podcast-episodes",
13479
- "description": "List recent episodes of a Xiaoyuzhou podcast (up to 15, SSR limit)",
13863
+ "name": "podcast",
13864
+ "description": "View a Xiaoyuzhou podcast profile",
13480
13865
  "domain": "www.xiaoyuzhoufm.com",
13481
13866
  "strategy": "public",
13482
13867
  "browser": false,
@@ -13487,29 +13872,23 @@
13487
13872
  "required": true,
13488
13873
  "positional": true,
13489
13874
  "help": "Podcast ID (from xiaoyuzhoufm.com URL)"
13490
- },
13491
- {
13492
- "name": "limit",
13493
- "type": "int",
13494
- "default": 15,
13495
- "required": false,
13496
- "help": "Max episodes to show (up to 15, SSR limit)"
13497
13875
  }
13498
13876
  ],
13499
13877
  "columns": [
13500
- "eid",
13501
13878
  "title",
13502
- "duration",
13503
- "plays",
13504
- "date"
13879
+ "author",
13880
+ "description",
13881
+ "subscribers",
13882
+ "episodes",
13883
+ "updated"
13505
13884
  ],
13506
13885
  "type": "ts",
13507
- "modulePath": "xiaoyuzhou/podcast-episodes.js"
13886
+ "modulePath": "xiaoyuzhou/podcast.js"
13508
13887
  },
13509
13888
  {
13510
13889
  "site": "xiaoyuzhou",
13511
- "name": "podcast",
13512
- "description": "View a Xiaoyuzhou podcast profile",
13890
+ "name": "podcast-episodes",
13891
+ "description": "List recent episodes of a Xiaoyuzhou podcast (up to 15, SSR limit)",
13513
13892
  "domain": "www.xiaoyuzhoufm.com",
13514
13893
  "strategy": "public",
13515
13894
  "browser": false,
@@ -13520,18 +13899,24 @@
13520
13899
  "required": true,
13521
13900
  "positional": true,
13522
13901
  "help": "Podcast ID (from xiaoyuzhoufm.com URL)"
13902
+ },
13903
+ {
13904
+ "name": "limit",
13905
+ "type": "int",
13906
+ "default": 15,
13907
+ "required": false,
13908
+ "help": "Max episodes to show (up to 15, SSR limit)"
13523
13909
  }
13524
13910
  ],
13525
13911
  "columns": [
13912
+ "eid",
13526
13913
  "title",
13527
- "author",
13528
- "description",
13529
- "subscribers",
13530
- "episodes",
13531
- "updated"
13914
+ "duration",
13915
+ "plays",
13916
+ "date"
13532
13917
  ],
13533
13918
  "type": "ts",
13534
- "modulePath": "xiaoyuzhou/podcast.js"
13919
+ "modulePath": "xiaoyuzhou/podcast-episodes.js"
13535
13920
  },
13536
13921
  {
13537
13922
  "site": "xueqiu",
@@ -13732,8 +14117,8 @@
13732
14117
  },
13733
14118
  {
13734
14119
  "site": "xueqiu",
13735
- "name": "hot-stock",
13736
- "description": "获取雪球热门股票榜",
14120
+ "name": "hot",
14121
+ "description": "获取雪球热门动态",
13737
14122
  "domain": "xueqiu.com",
13738
14123
  "strategy": "cookie",
13739
14124
  "browser": true,
@@ -13745,39 +14130,29 @@
13745
14130
  "required": false,
13746
14131
  "positional": false,
13747
14132
  "help": "返回数量,默认 20,最大 50"
13748
- },
13749
- {
13750
- "name": "type",
13751
- "type": "str",
13752
- "default": "10",
13753
- "required": false,
13754
- "positional": false,
13755
- "help": "榜单类型 10=人气榜(默认) 12=关注榜"
13756
14133
  }
13757
14134
  ],
13758
14135
  "columns": [
13759
14136
  "rank",
13760
- "symbol",
13761
- "name",
13762
- "price",
13763
- "changePercent",
13764
- "heat"
14137
+ "author",
14138
+ "text",
14139
+ "likes",
14140
+ "url"
13765
14141
  ],
13766
14142
  "pipeline": [
13767
14143
  {
13768
14144
  "navigate": "https://xueqiu.com"
13769
14145
  },
13770
14146
  {
13771
- "evaluate": "(async () => {\n const count = ${{ args.limit }};\n const type = ${{ args.type | json }};\n const resp = await fetch(`https://stock.xueqiu.com/v5/stock/hot_stock/list.json?size=${count}&type=${type}`, {credentials: 'include'});\n if (!resp.ok) throw new Error('HTTP ' + resp.status + ' Hint: Not logged in?');\n const d = await resp.json();\n if (!d.data || !d.data.items) throw new Error('获取失败');\n return d.data.items.map((s, i) => ({\n rank: i + 1,\n symbol: s.symbol,\n name: s.name,\n price: s.current,\n changePercent: s.percent != null ? s.percent.toFixed(2) + '%' : null,\n heat: s.value,\n rank_change: s.rank_change,\n url: 'https://xueqiu.com/S/' + s.symbol\n }));\n})()\n"
14147
+ "evaluate": "(async () => {\n const resp = await fetch('https://xueqiu.com/statuses/hot/listV3.json?source=hot&page=1', {credentials: 'include'});\n if (!resp.ok) throw new Error('HTTP ' + resp.status + ' Hint: Not logged in?');\n const d = await resp.json();\n const list = d.list || [];\n \n const strip = (html) => (html || '').replace(/<[^>]+>/g, '').replace(/&nbsp;/g, ' ').replace(/&amp;/g, '&').replace(/&lt;/g, '<').replace(/&gt;/g, '>').trim();\n return list.map((item, i) => {\n const user = item.user || {};\n return {\n rank: i + 1,\n text: strip(item.description).substring(0, 200),\n url: 'https://xueqiu.com/' + user.id + '/' + item.id,\n author: user.screen_name,\n likes: item.fav_count,\n retweets: item.retweet_count,\n replies: item.reply_count\n };\n });\n})()\n"
13772
14148
  },
13773
14149
  {
13774
14150
  "map": {
13775
14151
  "rank": "${{ item.rank }}",
13776
- "symbol": "${{ item.symbol }}",
13777
- "name": "${{ item.name }}",
13778
- "price": "${{ item.price }}",
13779
- "changePercent": "${{ item.changePercent }}",
13780
- "heat": "${{ item.heat }}"
14152
+ "author": "${{ item.author }}",
14153
+ "text": "${{ item.text }}",
14154
+ "likes": "${{ item.likes }}",
14155
+ "url": "${{ item.url }}"
13781
14156
  }
13782
14157
  },
13783
14158
  {
@@ -13788,8 +14163,8 @@
13788
14163
  },
13789
14164
  {
13790
14165
  "site": "xueqiu",
13791
- "name": "hot",
13792
- "description": "获取雪球热门动态",
14166
+ "name": "hot-stock",
14167
+ "description": "获取雪球热门股票榜",
13793
14168
  "domain": "xueqiu.com",
13794
14169
  "strategy": "cookie",
13795
14170
  "browser": true,
@@ -13801,29 +14176,39 @@
13801
14176
  "required": false,
13802
14177
  "positional": false,
13803
14178
  "help": "返回数量,默认 20,最大 50"
14179
+ },
14180
+ {
14181
+ "name": "type",
14182
+ "type": "str",
14183
+ "default": "10",
14184
+ "required": false,
14185
+ "positional": false,
14186
+ "help": "榜单类型 10=人气榜(默认) 12=关注榜"
13804
14187
  }
13805
14188
  ],
13806
14189
  "columns": [
13807
14190
  "rank",
13808
- "author",
13809
- "text",
13810
- "likes",
13811
- "url"
14191
+ "symbol",
14192
+ "name",
14193
+ "price",
14194
+ "changePercent",
14195
+ "heat"
13812
14196
  ],
13813
14197
  "pipeline": [
13814
14198
  {
13815
14199
  "navigate": "https://xueqiu.com"
13816
14200
  },
13817
14201
  {
13818
- "evaluate": "(async () => {\n const resp = await fetch('https://xueqiu.com/statuses/hot/listV3.json?source=hot&page=1', {credentials: 'include'});\n if (!resp.ok) throw new Error('HTTP ' + resp.status + ' Hint: Not logged in?');\n const d = await resp.json();\n const list = d.list || [];\n \n const strip = (html) => (html || '').replace(/<[^>]+>/g, '').replace(/&nbsp;/g, ' ').replace(/&amp;/g, '&').replace(/&lt;/g, '<').replace(/&gt;/g, '>').trim();\n return list.map((item, i) => {\n const user = item.user || {};\n return {\n rank: i + 1,\n text: strip(item.description).substring(0, 200),\n url: 'https://xueqiu.com/' + user.id + '/' + item.id,\n author: user.screen_name,\n likes: item.fav_count,\n retweets: item.retweet_count,\n replies: item.reply_count\n };\n });\n})()\n"
14202
+ "evaluate": "(async () => {\n const count = ${{ args.limit }};\n const type = ${{ args.type | json }};\n const resp = await fetch(`https://stock.xueqiu.com/v5/stock/hot_stock/list.json?size=${count}&type=${type}`, {credentials: 'include'});\n if (!resp.ok) throw new Error('HTTP ' + resp.status + ' Hint: Not logged in?');\n const d = await resp.json();\n if (!d.data || !d.data.items) throw new Error('获取失败');\n return d.data.items.map((s, i) => ({\n rank: i + 1,\n symbol: s.symbol,\n name: s.name,\n price: s.current,\n changePercent: s.percent != null ? s.percent.toFixed(2) + '%' : null,\n heat: s.value,\n rank_change: s.rank_change,\n url: 'https://xueqiu.com/S/' + s.symbol\n }));\n})()\n"
13819
14203
  },
13820
14204
  {
13821
14205
  "map": {
13822
14206
  "rank": "${{ item.rank }}",
13823
- "author": "${{ item.author }}",
13824
- "text": "${{ item.text }}",
13825
- "likes": "${{ item.likes }}",
13826
- "url": "${{ item.url }}"
14207
+ "symbol": "${{ item.symbol }}",
14208
+ "name": "${{ item.name }}",
14209
+ "price": "${{ item.price }}",
14210
+ "changePercent": "${{ item.changePercent }}",
14211
+ "heat": "${{ item.heat }}"
13827
14212
  }
13828
14213
  },
13829
14214
  {
@@ -14665,6 +15050,27 @@
14665
15050
  "default": 20,
14666
15051
  "required": false,
14667
15052
  "help": "Max results (max 50)"
15053
+ },
15054
+ {
15055
+ "name": "type",
15056
+ "type": "str",
15057
+ "default": "",
15058
+ "required": false,
15059
+ "help": "Filter type: shorts, video, channel, playlist"
15060
+ },
15061
+ {
15062
+ "name": "upload",
15063
+ "type": "str",
15064
+ "default": "",
15065
+ "required": false,
15066
+ "help": "Upload date: hour, today, week, month, year"
15067
+ },
15068
+ {
15069
+ "name": "sort",
15070
+ "type": "str",
15071
+ "default": "",
15072
+ "required": false,
15073
+ "help": "Sort by: relevance, date, views, rating"
14668
15074
  }
14669
15075
  ],
14670
15076
  "columns": [
@@ -14673,6 +15079,7 @@
14673
15079
  "channel",
14674
15080
  "views",
14675
15081
  "duration",
15082
+ "published",
14676
15083
  "url"
14677
15084
  ],
14678
15085
  "type": "ts",