@jackwener/opencli 0.4.1 → 0.4.3

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 (67) hide show
  1. package/CLI-CREATOR.md +103 -142
  2. package/LICENSE +28 -0
  3. package/README.md +113 -63
  4. package/README.zh-CN.md +114 -63
  5. package/SKILL.md +21 -4
  6. package/dist/browser.d.ts +21 -2
  7. package/dist/browser.js +269 -15
  8. package/dist/browser.test.d.ts +1 -0
  9. package/dist/browser.test.js +43 -0
  10. package/dist/build-manifest.js +66 -2
  11. package/dist/cli-manifest.json +905 -109
  12. package/dist/clis/boss/search.js +186 -30
  13. package/dist/clis/twitter/delete.d.ts +1 -0
  14. package/dist/clis/twitter/delete.js +73 -0
  15. package/dist/clis/twitter/followers.d.ts +1 -0
  16. package/dist/clis/twitter/followers.js +104 -0
  17. package/dist/clis/twitter/following.d.ts +1 -0
  18. package/dist/clis/twitter/following.js +90 -0
  19. package/dist/clis/twitter/like.d.ts +1 -0
  20. package/dist/clis/twitter/like.js +69 -0
  21. package/dist/clis/twitter/notifications.d.ts +1 -0
  22. package/dist/clis/twitter/notifications.js +109 -0
  23. package/dist/clis/twitter/post.d.ts +1 -0
  24. package/dist/clis/twitter/post.js +63 -0
  25. package/dist/clis/twitter/reply.d.ts +1 -0
  26. package/dist/clis/twitter/reply.js +57 -0
  27. package/dist/clis/v2ex/daily.d.ts +1 -0
  28. package/dist/clis/v2ex/daily.js +98 -0
  29. package/dist/clis/v2ex/me.d.ts +1 -0
  30. package/dist/clis/v2ex/me.js +99 -0
  31. package/dist/clis/v2ex/notifications.d.ts +1 -0
  32. package/dist/clis/v2ex/notifications.js +72 -0
  33. package/dist/clis/xiaohongshu/search.d.ts +5 -2
  34. package/dist/clis/xiaohongshu/search.js +35 -41
  35. package/dist/doctor.d.ts +50 -0
  36. package/dist/doctor.js +372 -0
  37. package/dist/doctor.test.d.ts +1 -0
  38. package/dist/doctor.test.js +114 -0
  39. package/dist/main.js +47 -5
  40. package/dist/output.test.d.ts +1 -0
  41. package/dist/output.test.js +20 -0
  42. package/dist/registry.d.ts +4 -0
  43. package/dist/registry.js +1 -0
  44. package/dist/runtime.d.ts +3 -1
  45. package/dist/runtime.js +2 -2
  46. package/package.json +2 -2
  47. package/src/browser.test.ts +51 -0
  48. package/src/browser.ts +318 -22
  49. package/src/build-manifest.ts +67 -2
  50. package/src/clis/boss/search.ts +196 -29
  51. package/src/clis/twitter/delete.ts +78 -0
  52. package/src/clis/twitter/followers.ts +119 -0
  53. package/src/clis/twitter/following.ts +105 -0
  54. package/src/clis/twitter/like.ts +74 -0
  55. package/src/clis/twitter/notifications.ts +119 -0
  56. package/src/clis/twitter/post.ts +68 -0
  57. package/src/clis/twitter/reply.ts +62 -0
  58. package/src/clis/v2ex/daily.ts +105 -0
  59. package/src/clis/v2ex/me.ts +103 -0
  60. package/src/clis/v2ex/notifications.ts +77 -0
  61. package/src/clis/xiaohongshu/search.ts +41 -44
  62. package/src/doctor.test.ts +133 -0
  63. package/src/doctor.ts +424 -0
  64. package/src/main.ts +47 -4
  65. package/src/output.test.ts +27 -0
  66. package/src/registry.ts +5 -0
  67. package/src/runtime.ts +2 -1
@@ -2,62 +2,183 @@
2
2
  {
3
3
  "site": "bbc",
4
4
  "name": "news",
5
- "description": "",
6
- "strategy": "cookie",
5
+ "description": "BBC News headlines (RSS)",
6
+ "strategy": "public",
7
7
  "browser": true,
8
- "args": [],
8
+ "args": [
9
+ {
10
+ "name": "limit",
11
+ "type": "int",
12
+ "default": 20,
13
+ "required": false,
14
+ "help": "Number of headlines (max 50)"
15
+ }
16
+ ],
9
17
  "type": "ts",
10
- "modulePath": "bbc/news.js"
18
+ "modulePath": "bbc/news.js",
19
+ "domain": "www.bbc.com",
20
+ "columns": [
21
+ "rank",
22
+ "title",
23
+ "description",
24
+ "url"
25
+ ]
11
26
  },
12
27
  {
13
28
  "site": "bilibili",
14
29
  "name": "dynamic",
15
- "description": "",
30
+ "description": "Get Bilibili user dynamic feed",
16
31
  "strategy": "cookie",
17
32
  "browser": true,
18
- "args": [],
33
+ "args": [
34
+ {
35
+ "name": "limit",
36
+ "type": "int",
37
+ "default": 15,
38
+ "required": false,
39
+ "help": ""
40
+ }
41
+ ],
19
42
  "type": "ts",
20
- "modulePath": "bilibili/dynamic.js"
43
+ "modulePath": "bilibili/dynamic.js",
44
+ "domain": "www.bilibili.com",
45
+ "columns": [
46
+ "id",
47
+ "author",
48
+ "text",
49
+ "likes",
50
+ "url"
51
+ ]
21
52
  },
22
53
  {
23
54
  "site": "bilibili",
24
55
  "name": "favorite",
25
- "description": "",
56
+ "description": "我的默认收藏夹",
26
57
  "strategy": "cookie",
27
58
  "browser": true,
28
- "args": [],
59
+ "args": [
60
+ {
61
+ "name": "limit",
62
+ "type": "int",
63
+ "default": 20,
64
+ "required": false,
65
+ "help": "Number of results"
66
+ },
67
+ {
68
+ "name": "page",
69
+ "type": "int",
70
+ "default": 1,
71
+ "required": false,
72
+ "help": "Page number"
73
+ }
74
+ ],
29
75
  "type": "ts",
30
- "modulePath": "bilibili/favorite.js"
76
+ "modulePath": "bilibili/favorite.js",
77
+ "domain": "www.bilibili.com",
78
+ "columns": [
79
+ "rank",
80
+ "title",
81
+ "author",
82
+ "plays",
83
+ "url"
84
+ ]
31
85
  },
32
86
  {
33
87
  "site": "bilibili",
34
88
  "name": "feed",
35
- "description": "",
89
+ "description": "关注的人的动态时间线",
36
90
  "strategy": "cookie",
37
91
  "browser": true,
38
- "args": [],
92
+ "args": [
93
+ {
94
+ "name": "limit",
95
+ "type": "int",
96
+ "default": 20,
97
+ "required": false,
98
+ "help": "Number of results"
99
+ },
100
+ {
101
+ "name": "type",
102
+ "type": "str",
103
+ "default": "all",
104
+ "required": false,
105
+ "help": "Filter: all, video, article"
106
+ }
107
+ ],
39
108
  "type": "ts",
40
- "modulePath": "bilibili/feed.js"
109
+ "modulePath": "bilibili/feed.js",
110
+ "domain": "www.bilibili.com",
111
+ "columns": [
112
+ "rank",
113
+ "author",
114
+ "title",
115
+ "type",
116
+ "url"
117
+ ]
41
118
  },
42
119
  {
43
120
  "site": "bilibili",
44
121
  "name": "following",
45
- "description": "",
122
+ "description": "获取 Bilibili 用户的关注列表",
46
123
  "strategy": "cookie",
47
124
  "browser": true,
48
- "args": [],
125
+ "args": [
126
+ {
127
+ "name": "uid",
128
+ "type": "str",
129
+ "required": false,
130
+ "help": "目标用户 ID(默认为当前登录用户)"
131
+ },
132
+ {
133
+ "name": "page",
134
+ "type": "int",
135
+ "default": 1,
136
+ "required": false,
137
+ "help": "页码"
138
+ },
139
+ {
140
+ "name": "limit",
141
+ "type": "int",
142
+ "default": 50,
143
+ "required": false,
144
+ "help": "每页数量 (最大 50)"
145
+ }
146
+ ],
49
147
  "type": "ts",
50
- "modulePath": "bilibili/following.js"
148
+ "modulePath": "bilibili/following.js",
149
+ "columns": [
150
+ "mid",
151
+ "name",
152
+ "sign",
153
+ "following",
154
+ "fans"
155
+ ]
51
156
  },
52
157
  {
53
158
  "site": "bilibili",
54
159
  "name": "history",
55
- "description": "",
160
+ "description": "我的观看历史",
56
161
  "strategy": "cookie",
57
162
  "browser": true,
58
- "args": [],
163
+ "args": [
164
+ {
165
+ "name": "limit",
166
+ "type": "int",
167
+ "default": 20,
168
+ "required": false,
169
+ "help": "Number of results"
170
+ }
171
+ ],
59
172
  "type": "ts",
60
- "modulePath": "bilibili/history.js"
173
+ "modulePath": "bilibili/history.js",
174
+ "domain": "www.bilibili.com",
175
+ "columns": [
176
+ "rank",
177
+ "title",
178
+ "author",
179
+ "progress",
180
+ "url"
181
+ ]
61
182
  },
62
183
  {
63
184
  "site": "bilibili",
@@ -107,72 +228,280 @@
107
228
  {
108
229
  "site": "bilibili",
109
230
  "name": "me",
110
- "description": "",
231
+ "description": "My Bilibili profile info",
111
232
  "strategy": "cookie",
112
233
  "browser": true,
113
234
  "args": [],
114
235
  "type": "ts",
115
- "modulePath": "bilibili/me.js"
236
+ "modulePath": "bilibili/me.js",
237
+ "domain": "www.bilibili.com",
238
+ "columns": [
239
+ "name",
240
+ "uid",
241
+ "level",
242
+ "coins",
243
+ "followers",
244
+ "following"
245
+ ]
116
246
  },
117
247
  {
118
248
  "site": "bilibili",
119
249
  "name": "ranking",
120
- "description": "",
250
+ "description": "Get Bilibili video ranking board",
121
251
  "strategy": "cookie",
122
252
  "browser": true,
123
- "args": [],
253
+ "args": [
254
+ {
255
+ "name": "limit",
256
+ "type": "int",
257
+ "default": 20,
258
+ "required": false,
259
+ "help": ""
260
+ }
261
+ ],
124
262
  "type": "ts",
125
- "modulePath": "bilibili/ranking.js"
263
+ "modulePath": "bilibili/ranking.js",
264
+ "domain": "www.bilibili.com",
265
+ "columns": [
266
+ "rank",
267
+ "title",
268
+ "author",
269
+ "score",
270
+ "url"
271
+ ]
126
272
  },
127
273
  {
128
274
  "site": "bilibili",
129
275
  "name": "search",
130
- "description": "",
276
+ "description": "Search Bilibili videos or users",
131
277
  "strategy": "cookie",
132
278
  "browser": true,
133
- "args": [],
279
+ "args": [
280
+ {
281
+ "name": "keyword",
282
+ "type": "str",
283
+ "required": true,
284
+ "help": "Search keyword"
285
+ },
286
+ {
287
+ "name": "type",
288
+ "type": "str",
289
+ "default": "video",
290
+ "required": false,
291
+ "help": "video or user"
292
+ },
293
+ {
294
+ "name": "page",
295
+ "type": "int",
296
+ "default": 1,
297
+ "required": false,
298
+ "help": "Result page"
299
+ },
300
+ {
301
+ "name": "limit",
302
+ "type": "int",
303
+ "default": 20,
304
+ "required": false,
305
+ "help": "Number of results"
306
+ }
307
+ ],
134
308
  "type": "ts",
135
- "modulePath": "bilibili/search.js"
309
+ "modulePath": "bilibili/search.js",
310
+ "domain": "www.bilibili.com",
311
+ "columns": [
312
+ "rank",
313
+ "title",
314
+ "author",
315
+ "score",
316
+ "url"
317
+ ]
136
318
  },
137
319
  {
138
320
  "site": "bilibili",
139
321
  "name": "subtitle",
140
- "description": "",
322
+ "description": "获取 Bilibili 视频的字幕",
141
323
  "strategy": "cookie",
142
324
  "browser": true,
143
- "args": [],
325
+ "args": [
326
+ {
327
+ "name": "bvid",
328
+ "type": "str",
329
+ "required": true,
330
+ "help": ""
331
+ },
332
+ {
333
+ "name": "lang",
334
+ "type": "str",
335
+ "required": false,
336
+ "help": "字幕语言代码 (如 zh-CN, en-US, ai-zh),默认取第一个"
337
+ }
338
+ ],
144
339
  "type": "ts",
145
- "modulePath": "bilibili/subtitle.js"
340
+ "modulePath": "bilibili/subtitle.js",
341
+ "columns": [
342
+ "index",
343
+ "from",
344
+ "to",
345
+ "content"
346
+ ]
146
347
  },
147
348
  {
148
349
  "site": "bilibili",
149
350
  "name": "user-videos",
150
- "description": "",
351
+ "description": "查看指定用户的投稿视频",
151
352
  "strategy": "cookie",
152
353
  "browser": true,
153
- "args": [],
354
+ "args": [
355
+ {
356
+ "name": "uid",
357
+ "type": "str",
358
+ "required": true,
359
+ "help": "User UID or username"
360
+ },
361
+ {
362
+ "name": "limit",
363
+ "type": "int",
364
+ "default": 20,
365
+ "required": false,
366
+ "help": "Number of results"
367
+ },
368
+ {
369
+ "name": "order",
370
+ "type": "str",
371
+ "default": "pubdate",
372
+ "required": false,
373
+ "help": "Sort: pubdate, click, stow"
374
+ },
375
+ {
376
+ "name": "page",
377
+ "type": "int",
378
+ "default": 1,
379
+ "required": false,
380
+ "help": "Page number"
381
+ }
382
+ ],
154
383
  "type": "ts",
155
- "modulePath": "bilibili/user-videos.js"
384
+ "modulePath": "bilibili/user-videos.js",
385
+ "domain": "www.bilibili.com",
386
+ "columns": [
387
+ "rank",
388
+ "title",
389
+ "plays",
390
+ "likes",
391
+ "date",
392
+ "url"
393
+ ]
156
394
  },
157
395
  {
158
396
  "site": "boss",
159
397
  "name": "search",
160
- "description": "",
398
+ "description": "BOSS直聘搜索职位",
161
399
  "strategy": "cookie",
162
400
  "browser": true,
163
- "args": [],
401
+ "args": [
402
+ {
403
+ "name": "query",
404
+ "type": "str",
405
+ "required": true,
406
+ "help": "Search keyword (e.g. AI agent, 前端)"
407
+ },
408
+ {
409
+ "name": "city",
410
+ "type": "str",
411
+ "default": "北京",
412
+ "required": false,
413
+ "help": "City name or code (e.g. 杭州, 上海, 101010100)"
414
+ },
415
+ {
416
+ "name": "experience",
417
+ "type": "str",
418
+ "default": "",
419
+ "required": false,
420
+ "help": "Experience: 应届/1年以内/1-3年/3-5年/5-10年/10年以上"
421
+ },
422
+ {
423
+ "name": "degree",
424
+ "type": "str",
425
+ "default": "",
426
+ "required": false,
427
+ "help": "Degree: 大专/本科/硕士/博士"
428
+ },
429
+ {
430
+ "name": "salary",
431
+ "type": "str",
432
+ "default": "",
433
+ "required": false,
434
+ "help": "Salary: 3K以下/3-5K/5-10K/10-15K/15-20K/20-30K/30-50K/50K以上"
435
+ },
436
+ {
437
+ "name": "industry",
438
+ "type": "str",
439
+ "default": "",
440
+ "required": false,
441
+ "help": "Industry code or name (e.g. 100020, 互联网)"
442
+ },
443
+ {
444
+ "name": "page",
445
+ "type": "int",
446
+ "default": 1,
447
+ "required": false,
448
+ "help": "Page number"
449
+ },
450
+ {
451
+ "name": "limit",
452
+ "type": "int",
453
+ "default": 15,
454
+ "required": false,
455
+ "help": "Number of results"
456
+ }
457
+ ],
164
458
  "type": "ts",
165
- "modulePath": "boss/search.js"
459
+ "modulePath": "boss/search.js",
460
+ "domain": "www.zhipin.com",
461
+ "columns": [
462
+ "name",
463
+ "salary",
464
+ "company",
465
+ "area",
466
+ "experience",
467
+ "degree",
468
+ "skills",
469
+ "boss",
470
+ "url"
471
+ ]
166
472
  },
167
473
  {
168
474
  "site": "ctrip",
169
475
  "name": "search",
170
- "description": "",
476
+ "description": "携程旅行搜索",
171
477
  "strategy": "cookie",
172
478
  "browser": true,
173
- "args": [],
479
+ "args": [
480
+ {
481
+ "name": "query",
482
+ "type": "str",
483
+ "required": true,
484
+ "help": "Search keyword (city or attraction)"
485
+ },
486
+ {
487
+ "name": "limit",
488
+ "type": "int",
489
+ "default": 15,
490
+ "required": false,
491
+ "help": "Number of results"
492
+ }
493
+ ],
174
494
  "type": "ts",
175
- "modulePath": "ctrip/search.js"
495
+ "modulePath": "ctrip/search.js",
496
+ "domain": "www.ctrip.com",
497
+ "columns": [
498
+ "rank",
499
+ "name",
500
+ "type",
501
+ "score",
502
+ "price",
503
+ "url"
504
+ ]
176
505
  },
177
506
  {
178
507
  "site": "hackernews",
@@ -445,98 +774,385 @@
445
774
  {
446
775
  "site": "reuters",
447
776
  "name": "search",
448
- "description": "",
777
+ "description": "Reuters 路透社新闻搜索",
449
778
  "strategy": "cookie",
450
779
  "browser": true,
451
- "args": [],
780
+ "args": [
781
+ {
782
+ "name": "query",
783
+ "type": "str",
784
+ "required": true,
785
+ "help": "Search query"
786
+ },
787
+ {
788
+ "name": "limit",
789
+ "type": "int",
790
+ "default": 10,
791
+ "required": false,
792
+ "help": "Number of results (max 40)"
793
+ }
794
+ ],
795
+ "type": "ts",
796
+ "modulePath": "reuters/search.js",
797
+ "domain": "www.reuters.com",
798
+ "columns": [
799
+ "rank",
800
+ "title",
801
+ "date",
802
+ "section",
803
+ "url"
804
+ ]
805
+ },
806
+ {
807
+ "site": "smzdm",
808
+ "name": "search",
809
+ "description": "什么值得买搜索好价",
810
+ "strategy": "cookie",
811
+ "browser": true,
812
+ "args": [
813
+ {
814
+ "name": "keyword",
815
+ "type": "str",
816
+ "required": true,
817
+ "help": "Search keyword"
818
+ },
819
+ {
820
+ "name": "limit",
821
+ "type": "int",
822
+ "default": 20,
823
+ "required": false,
824
+ "help": "Number of results"
825
+ }
826
+ ],
827
+ "type": "ts",
828
+ "modulePath": "smzdm/search.js",
829
+ "domain": "www.smzdm.com",
830
+ "columns": [
831
+ "rank",
832
+ "title",
833
+ "price",
834
+ "mall",
835
+ "comments",
836
+ "url"
837
+ ]
838
+ },
839
+ {
840
+ "site": "twitter",
841
+ "name": "bookmarks",
842
+ "description": "获取 Twitter 书签列表",
843
+ "domain": "x.com",
844
+ "strategy": "cookie",
845
+ "browser": true,
846
+ "args": [
847
+ {
848
+ "name": "limit",
849
+ "type": "int",
850
+ "default": 20,
851
+ "required": false,
852
+ "help": "Number of bookmarks to return (default 20)"
853
+ }
854
+ ],
855
+ "columns": [
856
+ "author",
857
+ "text",
858
+ "likes",
859
+ "url"
860
+ ],
861
+ "pipeline": [
862
+ {
863
+ "navigate": "https://x.com/i/bookmarks"
864
+ },
865
+ {
866
+ "wait": 2
867
+ },
868
+ {
869
+ "evaluate": "(async () => {\n const ct0 = document.cookie.split(';').map(c=>c.trim()).find(c=>c.startsWith('ct0='))?.split('=')[1];\n if (!ct0) throw new Error('No ct0 cookie. Hint: Not logged into x.com.');\n const bearer = decodeURIComponent('AAAAAAAAAAAAAAAAAAAAANRILgAAAAAAnNwIzUejRCOuH5E6I8xnZz4puTs%3D1Zv7ttfk8LF81IUq16cHjhLTvJu4FA33AGWWjCpTnA');\n const _h = {'Authorization':'Bearer '+bearer, 'X-Csrf-Token':ct0, 'X-Twitter-Auth-Type':'OAuth2Session', 'X-Twitter-Active-User':'yes'};\n\n const count = Math.min(${{ args.limit }}, 100);\n const variables = JSON.stringify({count, includePromotedContent: false});\n const features = JSON.stringify({\n rweb_video_screen_enabled: false, profile_label_improvements_pcf_label_in_post_enabled: true,\n responsive_web_profile_redirect_enabled: false, rweb_tipjar_consumption_enabled: false,\n verified_phone_label_enabled: false, creator_subscriptions_tweet_preview_api_enabled: true,\n responsive_web_graphql_timeline_navigation_enabled: true,\n responsive_web_graphql_skip_user_profile_image_extensions_enabled: false,\n premium_content_api_read_enabled: false, communities_web_enable_tweet_community_results_fetch: true,\n c9s_tweet_anatomy_moderator_badge_enabled: true,\n articles_preview_enabled: true, responsive_web_edit_tweet_api_enabled: true,\n graphql_is_translatable_rweb_tweet_is_translatable_enabled: true,\n view_counts_everywhere_api_enabled: true, longform_notetweets_consumption_enabled: true,\n responsive_web_twitter_article_tweet_consumption_enabled: true,\n tweet_awards_web_tipping_enabled: false,\n content_disclosure_indicator_enabled: true, content_disclosure_ai_generated_indicator_enabled: true,\n freedom_of_speech_not_reach_fetch_enabled: true, standardized_nudges_misinfo: true,\n tweet_with_visibility_results_prefer_gql_limited_actions_policy_enabled: true,\n longform_notetweets_rich_text_read_enabled: true, longform_notetweets_inline_media_enabled: false,\n responsive_web_enhance_cards_enabled: false\n });\n const url = '/i/api/graphql/Fy0QMy4q_aZCpkO0PnyLYw/Bookmarks?variables=' + encodeURIComponent(variables) + '&features=' + encodeURIComponent(features);\n const resp = await fetch(url, {headers: _h, credentials: 'include'});\n if (!resp.ok) throw new Error('HTTP ' + resp.status + '. Hint: queryId may have changed.');\n const d = await resp.json();\n\n const instructions = d.data?.bookmark_timeline_v2?.timeline?.instructions || d.data?.bookmark_timeline?.timeline?.instructions || [];\n let tweets = [], seen = new Set();\n for (const inst of instructions) {\n for (const entry of (inst.entries || [])) {\n const r = entry.content?.itemContent?.tweet_results?.result;\n if (!r) continue;\n const tw = r.tweet || r;\n const l = tw.legacy || {};\n if (!tw.rest_id || seen.has(tw.rest_id)) continue;\n seen.add(tw.rest_id);\n const u = tw.core?.user_results?.result;\n const nt = tw.note_tweet?.note_tweet_results?.result?.text;\n const screenName = u?.legacy?.screen_name || u?.core?.screen_name;\n tweets.push({\n id: tw.rest_id, \n author: screenName,\n name: u?.legacy?.name || u?.core?.name,\n url: 'https://x.com/' + (screenName || '_') + '/status/' + tw.rest_id,\n text: nt || l.full_text || '',\n likes: l.favorite_count, \n retweets: l.retweet_count,\n created_at: l.created_at\n });\n }\n }\n return tweets;\n})()\n"
870
+ },
871
+ {
872
+ "map": {
873
+ "author": "${{ item.author }}",
874
+ "text": "${{ item.text }}",
875
+ "likes": "${{ item.likes }}",
876
+ "url": "${{ item.url }}"
877
+ }
878
+ },
879
+ {
880
+ "limit": "${{ args.limit }}"
881
+ }
882
+ ],
883
+ "type": "yaml"
884
+ },
885
+ {
886
+ "site": "twitter",
887
+ "name": "delete",
888
+ "description": "Delete a specific tweet by URL",
889
+ "strategy": "ui",
890
+ "browser": true,
891
+ "args": [
892
+ {
893
+ "name": "url",
894
+ "type": "string",
895
+ "required": true,
896
+ "help": "The URL of the tweet to delete"
897
+ }
898
+ ],
899
+ "type": "ts",
900
+ "modulePath": "twitter/delete.js",
901
+ "domain": "x.com",
902
+ "columns": [
903
+ "status",
904
+ "message"
905
+ ]
906
+ },
907
+ {
908
+ "site": "twitter",
909
+ "name": "followers",
910
+ "description": "Get accounts following a Twitter/X user",
911
+ "strategy": "intercept",
912
+ "browser": true,
913
+ "args": [
914
+ {
915
+ "name": "user",
916
+ "type": "string",
917
+ "required": false,
918
+ "help": ""
919
+ },
920
+ {
921
+ "name": "limit",
922
+ "type": "int",
923
+ "default": 50,
924
+ "required": false,
925
+ "help": ""
926
+ }
927
+ ],
928
+ "type": "ts",
929
+ "modulePath": "twitter/followers.js",
930
+ "domain": "x.com",
931
+ "columns": [
932
+ "screen_name",
933
+ "name",
934
+ "bio",
935
+ "followers"
936
+ ]
937
+ },
938
+ {
939
+ "site": "twitter",
940
+ "name": "following",
941
+ "description": "Get accounts a Twitter/X user is following",
942
+ "strategy": "intercept",
943
+ "browser": true,
944
+ "args": [
945
+ {
946
+ "name": "user",
947
+ "type": "string",
948
+ "required": false,
949
+ "help": ""
950
+ },
951
+ {
952
+ "name": "limit",
953
+ "type": "int",
954
+ "default": 50,
955
+ "required": false,
956
+ "help": ""
957
+ }
958
+ ],
959
+ "type": "ts",
960
+ "modulePath": "twitter/following.js",
961
+ "domain": "x.com",
962
+ "columns": [
963
+ "screen_name",
964
+ "name",
965
+ "bio",
966
+ "followers"
967
+ ]
968
+ },
969
+ {
970
+ "site": "twitter",
971
+ "name": "like",
972
+ "description": "Like a specific tweet",
973
+ "strategy": "ui",
974
+ "browser": true,
975
+ "args": [
976
+ {
977
+ "name": "url",
978
+ "type": "string",
979
+ "required": true,
980
+ "help": "The URL of the tweet to like"
981
+ }
982
+ ],
983
+ "type": "ts",
984
+ "modulePath": "twitter/like.js",
985
+ "domain": "x.com",
986
+ "columns": [
987
+ "status",
988
+ "message"
989
+ ]
990
+ },
991
+ {
992
+ "site": "twitter",
993
+ "name": "notifications",
994
+ "description": "Get Twitter/X notifications",
995
+ "strategy": "intercept",
996
+ "browser": true,
997
+ "args": [
998
+ {
999
+ "name": "limit",
1000
+ "type": "int",
1001
+ "default": 20,
1002
+ "required": false,
1003
+ "help": ""
1004
+ }
1005
+ ],
452
1006
  "type": "ts",
453
- "modulePath": "reuters/search.js"
1007
+ "modulePath": "twitter/notifications.js",
1008
+ "domain": "x.com",
1009
+ "columns": [
1010
+ "id",
1011
+ "action",
1012
+ "author",
1013
+ "text",
1014
+ "url"
1015
+ ]
454
1016
  },
455
1017
  {
456
- "site": "smzdm",
457
- "name": "search",
458
- "description": "",
459
- "strategy": "cookie",
1018
+ "site": "twitter",
1019
+ "name": "post",
1020
+ "description": "Post a new tweet/thread",
1021
+ "strategy": "ui",
460
1022
  "browser": true,
461
- "args": [],
1023
+ "args": [
1024
+ {
1025
+ "name": "text",
1026
+ "type": "string",
1027
+ "required": true,
1028
+ "help": "The text content of the tweet"
1029
+ }
1030
+ ],
462
1031
  "type": "ts",
463
- "modulePath": "smzdm/search.js"
1032
+ "modulePath": "twitter/post.js",
1033
+ "domain": "x.com",
1034
+ "columns": [
1035
+ "status",
1036
+ "message",
1037
+ "text"
1038
+ ]
464
1039
  },
465
1040
  {
466
1041
  "site": "twitter",
467
- "name": "bookmarks",
468
- "description": "获取 Twitter 书签列表",
469
- "domain": "x.com",
470
- "strategy": "cookie",
1042
+ "name": "profile",
1043
+ "description": "Fetch tweets from a user profile",
1044
+ "strategy": "intercept",
471
1045
  "browser": true,
472
1046
  "args": [
1047
+ {
1048
+ "name": "username",
1049
+ "type": "string",
1050
+ "required": true,
1051
+ "help": ""
1052
+ },
473
1053
  {
474
1054
  "name": "limit",
475
1055
  "type": "int",
476
- "default": 20,
1056
+ "default": 15,
477
1057
  "required": false,
478
- "help": "Number of bookmarks to return (default 20)"
1058
+ "help": ""
479
1059
  }
480
1060
  ],
1061
+ "type": "ts",
1062
+ "modulePath": "twitter/profile.js",
1063
+ "domain": "x.com",
481
1064
  "columns": [
482
- "author",
1065
+ "id",
483
1066
  "text",
484
1067
  "likes",
1068
+ "views",
485
1069
  "url"
486
- ],
487
- "pipeline": [
488
- {
489
- "navigate": "https://x.com/i/bookmarks"
490
- },
491
- {
492
- "wait": 2
493
- },
494
- {
495
- "evaluate": "(async () => {\n const ct0 = document.cookie.split(';').map(c=>c.trim()).find(c=>c.startsWith('ct0='))?.split('=')[1];\n if (!ct0) throw new Error('No ct0 cookie. Hint: Not logged into x.com.');\n const bearer = decodeURIComponent('AAAAAAAAAAAAAAAAAAAAANRILgAAAAAAnNwIzUejRCOuH5E6I8xnZz4puTs%3D1Zv7ttfk8LF81IUq16cHjhLTvJu4FA33AGWWjCpTnA');\n const _h = {'Authorization':'Bearer '+bearer, 'X-Csrf-Token':ct0, 'X-Twitter-Auth-Type':'OAuth2Session', 'X-Twitter-Active-User':'yes'};\n\n const count = Math.min(${{ args.limit }}, 100);\n const variables = JSON.stringify({count, includePromotedContent: false});\n const features = JSON.stringify({\n rweb_video_screen_enabled: false, profile_label_improvements_pcf_label_in_post_enabled: true,\n responsive_web_profile_redirect_enabled: false, rweb_tipjar_consumption_enabled: false,\n verified_phone_label_enabled: false, creator_subscriptions_tweet_preview_api_enabled: true,\n responsive_web_graphql_timeline_navigation_enabled: true,\n responsive_web_graphql_skip_user_profile_image_extensions_enabled: false,\n premium_content_api_read_enabled: false, communities_web_enable_tweet_community_results_fetch: true,\n c9s_tweet_anatomy_moderator_badge_enabled: true,\n articles_preview_enabled: true, responsive_web_edit_tweet_api_enabled: true,\n graphql_is_translatable_rweb_tweet_is_translatable_enabled: true,\n view_counts_everywhere_api_enabled: true, longform_notetweets_consumption_enabled: true,\n responsive_web_twitter_article_tweet_consumption_enabled: true,\n tweet_awards_web_tipping_enabled: false,\n content_disclosure_indicator_enabled: true, content_disclosure_ai_generated_indicator_enabled: true,\n freedom_of_speech_not_reach_fetch_enabled: true, standardized_nudges_misinfo: true,\n tweet_with_visibility_results_prefer_gql_limited_actions_policy_enabled: true,\n longform_notetweets_rich_text_read_enabled: true, longform_notetweets_inline_media_enabled: false,\n responsive_web_enhance_cards_enabled: false\n });\n const url = '/i/api/graphql/Fy0QMy4q_aZCpkO0PnyLYw/Bookmarks?variables=' + encodeURIComponent(variables) + '&features=' + encodeURIComponent(features);\n const resp = await fetch(url, {headers: _h, credentials: 'include'});\n if (!resp.ok) throw new Error('HTTP ' + resp.status + '. Hint: queryId may have changed.');\n const d = await resp.json();\n\n const instructions = d.data?.bookmark_timeline_v2?.timeline?.instructions || d.data?.bookmark_timeline?.timeline?.instructions || [];\n let tweets = [], seen = new Set();\n for (const inst of instructions) {\n for (const entry of (inst.entries || [])) {\n const r = entry.content?.itemContent?.tweet_results?.result;\n if (!r) continue;\n const tw = r.tweet || r;\n const l = tw.legacy || {};\n if (!tw.rest_id || seen.has(tw.rest_id)) continue;\n seen.add(tw.rest_id);\n const u = tw.core?.user_results?.result;\n const nt = tw.note_tweet?.note_tweet_results?.result?.text;\n const screenName = u?.legacy?.screen_name || u?.core?.screen_name;\n tweets.push({\n id: tw.rest_id, \n author: screenName,\n name: u?.legacy?.name || u?.core?.name,\n url: 'https://x.com/' + (screenName || '_') + '/status/' + tw.rest_id,\n text: nt || l.full_text || '',\n likes: l.favorite_count, \n retweets: l.retweet_count,\n created_at: l.created_at\n });\n }\n }\n return tweets;\n})()\n"
496
- },
1070
+ ]
1071
+ },
1072
+ {
1073
+ "site": "twitter",
1074
+ "name": "reply",
1075
+ "description": "Reply to a specific tweet",
1076
+ "strategy": "ui",
1077
+ "browser": true,
1078
+ "args": [
497
1079
  {
498
- "map": {
499
- "author": "${{ item.author }}",
500
- "text": "${{ item.text }}",
501
- "likes": "${{ item.likes }}",
502
- "url": "${{ item.url }}"
503
- }
1080
+ "name": "url",
1081
+ "type": "string",
1082
+ "required": true,
1083
+ "help": "The URL of the tweet to reply to"
504
1084
  },
505
1085
  {
506
- "limit": "${{ args.limit }}"
1086
+ "name": "text",
1087
+ "type": "string",
1088
+ "required": true,
1089
+ "help": "The text content of your reply"
507
1090
  }
508
1091
  ],
509
- "type": "yaml"
510
- },
511
- {
512
- "site": "twitter",
513
- "name": "profile",
514
- "description": "",
515
- "strategy": "cookie",
516
- "browser": true,
517
- "args": [],
518
1092
  "type": "ts",
519
- "modulePath": "twitter/profile.js"
1093
+ "modulePath": "twitter/reply.js",
1094
+ "domain": "x.com",
1095
+ "columns": [
1096
+ "status",
1097
+ "message",
1098
+ "text"
1099
+ ]
520
1100
  },
521
1101
  {
522
1102
  "site": "twitter",
523
1103
  "name": "search",
524
- "description": "",
525
- "strategy": "cookie",
1104
+ "description": "Search Twitter/X for tweets",
1105
+ "strategy": "intercept",
526
1106
  "browser": true,
527
- "args": [],
1107
+ "args": [
1108
+ {
1109
+ "name": "query",
1110
+ "type": "string",
1111
+ "required": true,
1112
+ "help": ""
1113
+ },
1114
+ {
1115
+ "name": "limit",
1116
+ "type": "int",
1117
+ "default": 15,
1118
+ "required": false,
1119
+ "help": ""
1120
+ }
1121
+ ],
528
1122
  "type": "ts",
529
- "modulePath": "twitter/search.js"
1123
+ "modulePath": "twitter/search.js",
1124
+ "domain": "x.com",
1125
+ "columns": [
1126
+ "id",
1127
+ "author",
1128
+ "text",
1129
+ "likes",
1130
+ "views",
1131
+ "url"
1132
+ ]
530
1133
  },
531
1134
  {
532
1135
  "site": "twitter",
533
1136
  "name": "timeline",
534
- "description": "",
1137
+ "description": "Twitter Home Timeline",
535
1138
  "strategy": "cookie",
536
1139
  "browser": true,
537
- "args": [],
1140
+ "args": [
1141
+ {
1142
+ "name": "limit",
1143
+ "type": "int",
1144
+ "default": 20,
1145
+ "required": false,
1146
+ "help": ""
1147
+ }
1148
+ ],
538
1149
  "type": "ts",
539
- "modulePath": "twitter/timeline.js"
1150
+ "modulePath": "twitter/timeline.js",
1151
+ "domain": "x.com",
1152
+ "columns": [
1153
+ "responseType",
1154
+ "first"
1155
+ ]
540
1156
  },
541
1157
  {
542
1158
  "site": "twitter",
@@ -579,6 +1195,21 @@
579
1195
  ],
580
1196
  "type": "yaml"
581
1197
  },
1198
+ {
1199
+ "site": "v2ex",
1200
+ "name": "daily",
1201
+ "description": "V2EX 每日签到并领取铜币",
1202
+ "strategy": "cookie",
1203
+ "browser": true,
1204
+ "args": [],
1205
+ "type": "ts",
1206
+ "modulePath": "v2ex/daily.js",
1207
+ "domain": "www.v2ex.com",
1208
+ "columns": [
1209
+ "status",
1210
+ "message"
1211
+ ]
1212
+ },
582
1213
  {
583
1214
  "site": "v2ex",
584
1215
  "name": "hot",
@@ -659,6 +1290,47 @@
659
1290
  ],
660
1291
  "type": "yaml"
661
1292
  },
1293
+ {
1294
+ "site": "v2ex",
1295
+ "name": "me",
1296
+ "description": "V2EX 获取个人资料 (余额/未读提醒)",
1297
+ "strategy": "cookie",
1298
+ "browser": true,
1299
+ "args": [],
1300
+ "type": "ts",
1301
+ "modulePath": "v2ex/me.js",
1302
+ "domain": "www.v2ex.com",
1303
+ "columns": [
1304
+ "username",
1305
+ "balance",
1306
+ "unread_notifications",
1307
+ "daily_reward_ready"
1308
+ ]
1309
+ },
1310
+ {
1311
+ "site": "v2ex",
1312
+ "name": "notifications",
1313
+ "description": "V2EX 获取提醒 (回复/由于)",
1314
+ "strategy": "cookie",
1315
+ "browser": true,
1316
+ "args": [
1317
+ {
1318
+ "name": "limit",
1319
+ "type": "int",
1320
+ "default": 20,
1321
+ "required": false,
1322
+ "help": "Number of notifications"
1323
+ }
1324
+ ],
1325
+ "type": "ts",
1326
+ "modulePath": "v2ex/notifications.js",
1327
+ "domain": "www.v2ex.com",
1328
+ "columns": [
1329
+ "type",
1330
+ "content",
1331
+ "time"
1332
+ ]
1333
+ },
662
1334
  {
663
1335
  "site": "v2ex",
664
1336
  "name": "topic",
@@ -704,12 +1376,29 @@
704
1376
  {
705
1377
  "site": "weibo",
706
1378
  "name": "hot",
707
- "description": "",
1379
+ "description": "微博热搜",
708
1380
  "strategy": "cookie",
709
1381
  "browser": true,
710
- "args": [],
1382
+ "args": [
1383
+ {
1384
+ "name": "limit",
1385
+ "type": "int",
1386
+ "default": 30,
1387
+ "required": false,
1388
+ "help": "Number of items (max 50)"
1389
+ }
1390
+ ],
711
1391
  "type": "ts",
712
- "modulePath": "weibo/hot.js"
1392
+ "modulePath": "weibo/hot.js",
1393
+ "domain": "weibo.com",
1394
+ "columns": [
1395
+ "rank",
1396
+ "word",
1397
+ "hot_value",
1398
+ "category",
1399
+ "label",
1400
+ "url"
1401
+ ]
713
1402
  },
714
1403
  {
715
1404
  "site": "xiaohongshu",
@@ -835,22 +1524,65 @@
835
1524
  {
836
1525
  "site": "xiaohongshu",
837
1526
  "name": "search",
838
- "description": "",
1527
+ "description": "搜索小红书笔记",
839
1528
  "strategy": "cookie",
840
1529
  "browser": true,
841
- "args": [],
1530
+ "args": [
1531
+ {
1532
+ "name": "keyword",
1533
+ "type": "str",
1534
+ "required": true,
1535
+ "help": "Search keyword"
1536
+ },
1537
+ {
1538
+ "name": "limit",
1539
+ "type": "int",
1540
+ "default": 20,
1541
+ "required": false,
1542
+ "help": "Number of results"
1543
+ }
1544
+ ],
842
1545
  "type": "ts",
843
- "modulePath": "xiaohongshu/search.js"
1546
+ "modulePath": "xiaohongshu/search.js",
1547
+ "domain": "www.xiaohongshu.com",
1548
+ "columns": [
1549
+ "rank",
1550
+ "title",
1551
+ "author",
1552
+ "likes"
1553
+ ]
844
1554
  },
845
1555
  {
846
1556
  "site": "xiaohongshu",
847
1557
  "name": "user",
848
- "description": "",
849
- "strategy": "cookie",
1558
+ "description": "Get user notes from Xiaohongshu",
1559
+ "strategy": "intercept",
850
1560
  "browser": true,
851
- "args": [],
1561
+ "args": [
1562
+ {
1563
+ "name": "id",
1564
+ "type": "string",
1565
+ "required": true,
1566
+ "help": ""
1567
+ },
1568
+ {
1569
+ "name": "limit",
1570
+ "type": "int",
1571
+ "default": 15,
1572
+ "required": false,
1573
+ "help": ""
1574
+ }
1575
+ ],
852
1576
  "type": "ts",
853
- "modulePath": "xiaohongshu/user.js"
1577
+ "modulePath": "xiaohongshu/user.js",
1578
+ "domain": "xiaohongshu.com",
1579
+ "columns": [
1580
+ "id",
1581
+ "title",
1582
+ "type",
1583
+ "likes",
1584
+ "url"
1585
+ ]
854
1586
  },
855
1587
  {
856
1588
  "site": "xueqiu",
@@ -1148,22 +1880,65 @@
1148
1880
  {
1149
1881
  "site": "yahoo-finance",
1150
1882
  "name": "quote",
1151
- "description": "",
1883
+ "description": "Yahoo Finance 股票行情",
1152
1884
  "strategy": "cookie",
1153
1885
  "browser": true,
1154
- "args": [],
1886
+ "args": [
1887
+ {
1888
+ "name": "symbol",
1889
+ "type": "str",
1890
+ "required": true,
1891
+ "help": "Stock ticker (e.g. AAPL, MSFT, TSLA)"
1892
+ }
1893
+ ],
1155
1894
  "type": "ts",
1156
- "modulePath": "yahoo-finance/quote.js"
1895
+ "modulePath": "yahoo-finance/quote.js",
1896
+ "domain": "finance.yahoo.com",
1897
+ "columns": [
1898
+ "symbol",
1899
+ "name",
1900
+ "price",
1901
+ "change",
1902
+ "changePercent",
1903
+ "open",
1904
+ "high",
1905
+ "low",
1906
+ "volume",
1907
+ "marketCap"
1908
+ ]
1157
1909
  },
1158
1910
  {
1159
1911
  "site": "youtube",
1160
1912
  "name": "search",
1161
- "description": "",
1913
+ "description": "Search YouTube videos",
1162
1914
  "strategy": "cookie",
1163
1915
  "browser": true,
1164
- "args": [],
1916
+ "args": [
1917
+ {
1918
+ "name": "query",
1919
+ "type": "str",
1920
+ "required": true,
1921
+ "help": "Search query"
1922
+ },
1923
+ {
1924
+ "name": "limit",
1925
+ "type": "int",
1926
+ "default": 20,
1927
+ "required": false,
1928
+ "help": "Max results (max 50)"
1929
+ }
1930
+ ],
1165
1931
  "type": "ts",
1166
- "modulePath": "youtube/search.js"
1932
+ "modulePath": "youtube/search.js",
1933
+ "domain": "www.youtube.com",
1934
+ "columns": [
1935
+ "rank",
1936
+ "title",
1937
+ "channel",
1938
+ "views",
1939
+ "duration",
1940
+ "url"
1941
+ ]
1167
1942
  },
1168
1943
  {
1169
1944
  "site": "zhihu",
@@ -1212,12 +1987,33 @@
1212
1987
  {
1213
1988
  "site": "zhihu",
1214
1989
  "name": "question",
1215
- "description": "",
1990
+ "description": "知乎问题详情和回答",
1216
1991
  "strategy": "cookie",
1217
1992
  "browser": true,
1218
- "args": [],
1993
+ "args": [
1994
+ {
1995
+ "name": "id",
1996
+ "type": "str",
1997
+ "required": true,
1998
+ "help": "Question ID (numeric)"
1999
+ },
2000
+ {
2001
+ "name": "limit",
2002
+ "type": "int",
2003
+ "default": 5,
2004
+ "required": false,
2005
+ "help": "Number of answers"
2006
+ }
2007
+ ],
1219
2008
  "type": "ts",
1220
- "modulePath": "zhihu/question.js"
2009
+ "modulePath": "zhihu/question.js",
2010
+ "domain": "www.zhihu.com",
2011
+ "columns": [
2012
+ "rank",
2013
+ "author",
2014
+ "votes",
2015
+ "content"
2016
+ ]
1221
2017
  },
1222
2018
  {
1223
2019
  "site": "zhihu",