@agentrhq/webcmd 0.1.2 → 0.2.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +196 -219
- package/cli-manifest.json +16205 -34869
- package/clis/_atlassian/shared.js +1 -1
- package/clis/booking/search.js +4 -4
- package/clis/chatgpt/ask.js +2 -2
- package/clis/chatgpt/utils.js +41 -42
- package/clis/chatgpt/utils.test.js +23 -23
- package/clis/chatgpt-app/ax.js +5 -5
- package/clis/chatgpt-app/ax.test.js +8 -8
- package/clis/chatgpt-app/new.js +2 -2
- package/clis/codex/sidebar.js +1 -1
- package/clis/codex/sidebar.test.js +12 -12
- package/clis/coingecko/top.js +3 -3
- package/clis/dblp/dblp.test.js +1 -1
- package/clis/discord-app/search.js +1 -1
- package/clis/discord-app/utils.js +6 -6
- package/clis/facebook/__fixtures__/notifications-page.html +6 -6
- package/clis/facebook/add-friend.js +2 -2
- package/clis/facebook/feed.js +18 -18
- package/clis/facebook/friends.js +4 -4
- package/clis/facebook/groups.js +3 -3
- package/clis/facebook/join-group.js +2 -2
- package/clis/facebook/marketplace-inbox.js +3 -3
- package/clis/facebook/marketplace-listings.js +1 -1
- package/clis/facebook/notifications.js +14 -15
- package/clis/facebook/notifications.test.js +28 -29
- package/clis/gemini/ask.test.js +12 -12
- package/clis/gemini/deep-research-result.js +2 -2
- package/clis/gemini/deep-research-result.test.js +2 -2
- package/clis/gemini/deep-research.js +2 -2
- package/clis/gemini/deep-research.test.js +1 -1
- package/clis/gemini/models.js +11 -11
- package/clis/gemini/models.test.js +1 -1
- package/clis/gemini/reply-state.test.js +89 -89
- package/clis/gemini/utils.js +41 -41
- package/clis/gemini/utils.test.js +30 -30
- package/clis/geogebra/utils.js +1 -1
- package/clis/google-scholar/search.js +3 -3
- package/clis/grok/delete.js +1 -1
- package/clis/grok/export-all.js +2 -2
- package/clis/grok/export.js +2 -2
- package/clis/grok/pin.js +3 -3
- package/clis/grok/utils.js +12 -12
- package/clis/grok/utils.test.js +2 -2
- package/clis/indeed/indeed.test.js +3 -3
- package/clis/indeed/utils.js +1 -1
- package/clis/instagram/post.js +19 -19
- package/clis/instagram/post.test.js +2 -2
- package/clis/instagram/reel.js +6 -6
- package/clis/linkedin/connect.js +3 -3
- package/clis/linkedin/people-search.js +4 -4
- package/clis/linkedin/profile-experience.js +6 -6
- package/clis/linkedin/profile-experience.test.js +10 -10
- package/clis/linkedin/profile-read.js +1 -1
- package/clis/linkedin/safe-send.js +1 -1
- package/clis/linkedin/search.js +1 -1
- package/clis/linkedin/shared.js +2 -2
- package/clis/linkedin/timeline.js +5 -5
- package/clis/manus/manus.test.js +2 -2
- package/clis/medium/feed.js +3 -3
- package/clis/medium/search.js +3 -3
- package/clis/medium/user.js +3 -3
- package/clis/notebooklm/auth.js +2 -2
- package/clis/notebooklm/note-list.test.js +4 -4
- package/clis/notebooklm/notes-get.test.js +8 -8
- package/clis/notebooklm/source-fulltext.test.js +11 -11
- package/clis/notebooklm/utils.js +28 -28
- package/clis/notebooklm/utils.test.js +10 -10
- package/clis/pixiv/search.test.js +3 -3
- package/clis/qoder/quest.js +2 -2
- package/clis/reddit/home.js +2 -2
- package/clis/reddit/hot.js +1 -1
- package/clis/reddit/read.js +2 -2
- package/clis/reddit/read.test.js +1 -1
- package/clis/reddit/reply.js +2 -2
- package/clis/reddit/whoami.js +2 -2
- package/clis/reuters/article-detail.js +1 -1
- package/clis/reuters/search.js +1 -1
- package/clis/slock/attachment-upload.test.js +1 -1
- package/clis/slock/task-convert.js +1 -1
- package/clis/substack/feed.js +3 -3
- package/clis/substack/publication.js +3 -3
- package/clis/substack/search.js +4 -4
- package/clis/tiktok/comment.js +2 -2
- package/clis/tiktok/follow.js +4 -4
- package/clis/tiktok/like.js +1 -1
- package/clis/tiktok/save.js +1 -1
- package/clis/tiktok/unfollow.js +4 -4
- package/clis/tiktok/unlike.js +1 -1
- package/clis/tiktok/unsave.js +2 -2
- package/clis/tiktok/write-refactor.test.js +5 -5
- package/clis/twitter/accept.js +3 -3
- package/clis/twitter/delete.js +14 -6
- package/clis/twitter/delete.test.js +74 -1
- package/clis/twitter/followers.js +1 -1
- package/clis/twitter/list-remove-core.js +2 -2
- package/clis/twitter/list-tweets.test.js +3 -3
- package/clis/twitter/lists.js +6 -6
- package/clis/twitter/lists.test.js +2 -2
- package/clis/twitter/reply-dm.js +1 -1
- package/clis/twitter/shared.test.js +4 -5
- package/clis/twitter/timeline.js +3 -1
- package/clis/twitter/timeline.test.js +4 -0
- package/clis/twitter/trending.js +1 -1
- package/clis/twitter/utils.js +1 -1
- package/clis/web/read.js +1 -1
- package/clis/web/read.test.js +2 -2
- package/clis/yahoo-finance/quote.js +1 -1
- package/clis/youtube/history.js +4 -4
- package/clis/youtube/transcript-group.js +1 -1
- package/clis/youtube/transcript-group.test.js +5 -5
- package/clis/youtube/transcript.js +5 -5
- package/clis/youtube/video.js +4 -4
- package/clis/youtube/video.test.js +6 -6
- package/dist/src/browser/analyze.test.js +13 -13
- package/dist/src/browser/bridge-readiness.d.ts +1 -1
- package/dist/src/browser/bridge-readiness.test.js +1 -1
- package/dist/src/browser/bridge.d.ts +1 -0
- package/dist/src/browser/bridge.js +6 -4
- package/dist/src/browser/cdp.d.ts +1 -0
- package/dist/src/browser/daemon-client.d.ts +2 -0
- package/dist/src/browser/daemon-client.js +108 -51
- package/dist/src/browser/daemon-client.test.js +135 -47
- package/dist/src/browser/daemon-transport.js +3 -19
- package/dist/src/browser/errors.js +11 -0
- package/dist/src/browser/page.d.ts +2 -1
- package/dist/src/browser/page.js +5 -1
- package/dist/src/browser/profile.d.ts +9 -0
- package/dist/src/browser/profile.js +18 -7
- package/dist/src/browser/profile.test.js +44 -0
- package/dist/src/browser/protocol.d.ts +3 -0
- package/dist/src/browser/runtime/local-cloak/actions.js +24 -10
- package/dist/src/browser/runtime/local-cloak/session-manager.d.ts +1 -0
- package/dist/src/browser/runtime/local-cloak/session-manager.js +3 -0
- package/dist/src/browser/runtime/local-cloak/session-manager.test.js +87 -0
- package/dist/src/browser.test.js +2 -2
- package/dist/src/cli-argv-preprocess.d.ts +2 -2
- package/dist/src/cli-argv-preprocess.js +2 -2
- package/dist/src/cli-argv-preprocess.test.js +35 -35
- package/dist/src/cli.js +24 -19
- package/dist/src/cli.test.js +59 -59
- package/dist/src/commanderAdapter.test.js +19 -19
- package/dist/src/commands/daemon.test.js +13 -13
- package/dist/src/constants.d.ts +2 -3
- package/dist/src/constants.js +3 -10
- package/dist/src/convention-audit.js +1 -1
- package/dist/src/daemon/server.js +28 -23
- package/dist/src/daemon/server.test.js +52 -0
- package/dist/src/daemon-utils.d.ts +1 -0
- package/dist/src/daemon-utils.js +9 -0
- package/dist/src/daemon.js +1 -5
- package/dist/src/daemon.test.js +10 -1
- package/dist/src/doctor.js +19 -1
- package/dist/src/doctor.test.js +38 -4
- package/dist/src/download/article-download.d.ts +3 -3
- package/dist/src/download/article-download.js +7 -7
- package/dist/src/download/article-download.test.js +6 -6
- package/dist/src/download/index.js +1 -1
- package/dist/src/download/index.test.js +1 -2
- package/dist/src/download/media-download.d.ts +1 -1
- package/dist/src/download/media-download.js +1 -1
- package/dist/src/electron-apps.js +0 -8
- package/dist/src/electron-apps.test.js +2 -11
- package/dist/src/errors.test.js +9 -9
- package/dist/src/execution.js +7 -3
- package/dist/src/execution.test.js +12 -0
- package/dist/src/external-clis.yaml +0 -37
- package/dist/src/external.d.ts +1 -1
- package/dist/src/external.js +19 -1
- package/dist/src/external.test.js +39 -18
- package/dist/src/generate-release-notes-cli.test.js +140 -0
- package/dist/src/help.d.ts +3 -3
- package/dist/src/help.test.js +8 -8
- package/dist/src/main.js +1 -6
- package/dist/src/manifest-types.d.ts +1 -1
- package/dist/src/node-network.test.js +5 -5
- package/dist/src/output.js +1 -1
- package/dist/src/pipeline/steps/download.test.js +3 -3
- package/dist/src/registry.test.js +2 -2
- package/dist/src/release-notes.d.ts +38 -0
- package/dist/src/release-notes.js +99 -0
- package/dist/src/release-notes.test.d.ts +1 -0
- package/dist/src/release-notes.test.js +61 -0
- package/dist/src/runtime-identity.test.js +0 -8
- package/dist/src/runtime.d.ts +2 -0
- package/dist/src/runtime.js +1 -0
- package/dist/src/serialization.test.js +7 -7
- package/dist/src/snapshotFormatter.js +3 -5
- package/dist/src/snapshotFormatter.test.d.ts +1 -1
- package/dist/src/snapshotFormatter.test.js +50 -50
- package/dist/src/tui.js +1 -1
- package/package.json +5 -2
- package/scripts/generate-release-notes.ts +234 -0
- package/scripts/postinstall.js +1 -1
- package/scripts/silent-column-drop-baseline.json +0 -498
- package/scripts/typed-error-lint-baseline.json +0 -464
- package/skills/webcmd-adapter-author/SKILL.md +216 -213
- package/skills/webcmd-adapter-author/references/adapter-template.md +206 -399
- package/skills/webcmd-adapter-author/references/api-discovery.md +111 -220
- package/skills/webcmd-adapter-author/references/coverage-matrix.md +34 -68
- package/skills/webcmd-adapter-author/references/field-conventions.md +84 -167
- package/skills/webcmd-adapter-author/references/field-decode-playbook.md +60 -146
- package/skills/webcmd-adapter-author/references/jsdom-fixture-pattern.md +111 -178
- package/skills/webcmd-adapter-author/references/output-design.md +47 -125
- package/skills/webcmd-adapter-author/references/site-memory.md +116 -166
- package/skills/webcmd-adapter-author/references/site-recon.md +74 -78
- package/skills/webcmd-adapter-author/references/strategy-selection.md +80 -124
- package/skills/webcmd-adapter-author/references/success-rate-pitfalls.md +80 -105
- package/skills/webcmd-adapter-author/references/typed-errors.md +87 -178
- package/skills/webcmd-autofix/SKILL.md +136 -143
- package/skills/webcmd-sitemap-author/SKILL.md +58 -67
- package/skills/webcmd-sitemap-author/references/sitemap-schema.md +354 -494
- package/skills/webcmd-usage/SKILL.md +106 -97
- package/clis/12306/auth.js +0 -59
- package/clis/12306/me.js +0 -73
- package/clis/12306/orders.js +0 -96
- package/clis/12306/passengers.js +0 -90
- package/clis/12306/price.js +0 -166
- package/clis/12306/stations.js +0 -66
- package/clis/12306/train.js +0 -91
- package/clis/12306/trains.js +0 -166
- package/clis/12306/utils.js +0 -272
- package/clis/12306/utils.test.js +0 -424
- package/clis/1688/assets.js +0 -205
- package/clis/1688/assets.test.js +0 -39
- package/clis/1688/auth.js +0 -46
- package/clis/1688/download.js +0 -77
- package/clis/1688/download.test.js +0 -31
- package/clis/1688/item.js +0 -188
- package/clis/1688/item.test.js +0 -67
- package/clis/1688/search.js +0 -310
- package/clis/1688/search.test.js +0 -75
- package/clis/1688/shared.js +0 -557
- package/clis/1688/shared.test.js +0 -57
- package/clis/1688/store.js +0 -227
- package/clis/1688/store.test.js +0 -62
- package/clis/1point3acres/auth.js +0 -52
- package/clis/1point3acres/digest.js +0 -35
- package/clis/1point3acres/forum.js +0 -51
- package/clis/1point3acres/forums.js +0 -44
- package/clis/1point3acres/hot.js +0 -35
- package/clis/1point3acres/latest.js +0 -35
- package/clis/1point3acres/notifications.js +0 -64
- package/clis/1point3acres/search.js +0 -71
- package/clis/1point3acres/thread.js +0 -117
- package/clis/1point3acres/user.js +0 -77
- package/clis/1point3acres/utils.js +0 -247
- package/clis/36kr/article.js +0 -66
- package/clis/36kr/article.test.js +0 -46
- package/clis/36kr/hot.js +0 -87
- package/clis/36kr/hot.test.js +0 -15
- package/clis/36kr/news.js +0 -52
- package/clis/36kr/news.test.js +0 -85
- package/clis/36kr/search.js +0 -79
- package/clis/51job/company.js +0 -126
- package/clis/51job/detail.js +0 -109
- package/clis/51job/hot.js +0 -56
- package/clis/51job/search.js +0 -80
- package/clis/51job/utils.js +0 -302
- package/clis/51job/utils.test.js +0 -69
- package/clis/aibase/news.js +0 -110
- package/clis/aibase/news.test.js +0 -59
- package/clis/autohome/__fixtures__/catalog.html +0 -11
- package/clis/autohome/__fixtures__/koubei.json +0 -116
- package/clis/autohome/autohome.test.js +0 -115
- package/clis/autohome/brand.js +0 -108
- package/clis/autohome/score.js +0 -103
- package/clis/autohome/utils.js +0 -157
- package/clis/baidu-scholar/search.js +0 -87
- package/clis/baidu-scholar/search.test.js +0 -23
- package/clis/bilibili/auth.js +0 -36
- package/clis/bilibili/comment.js +0 -107
- package/clis/bilibili/comment.test.js +0 -153
- package/clis/bilibili/comments.js +0 -136
- package/clis/bilibili/comments.test.js +0 -142
- package/clis/bilibili/download.js +0 -178
- package/clis/bilibili/download.test.js +0 -173
- package/clis/bilibili/dynamic.js +0 -34
- package/clis/bilibili/dynamic.test.js +0 -68
- package/clis/bilibili/favorite.js +0 -47
- package/clis/bilibili/feed.js +0 -220
- package/clis/bilibili/follow.js +0 -140
- package/clis/bilibili/follow.test.js +0 -203
- package/clis/bilibili/following.js +0 -44
- package/clis/bilibili/history.js +0 -45
- package/clis/bilibili/hot.js +0 -40
- package/clis/bilibili/hot.test.js +0 -17
- package/clis/bilibili/me.js +0 -13
- package/clis/bilibili/ranking.js +0 -25
- package/clis/bilibili/search.js +0 -24
- package/clis/bilibili/subtitle.js +0 -141
- package/clis/bilibili/subtitle.test.js +0 -240
- package/clis/bilibili/summary.js +0 -167
- package/clis/bilibili/summary.test.js +0 -210
- package/clis/bilibili/unfollow.js +0 -121
- package/clis/bilibili/user-videos.js +0 -39
- package/clis/bilibili/utils.js +0 -273
- package/clis/bilibili/utils.test.js +0 -97
- package/clis/bilibili/video.js +0 -155
- package/clis/bilibili/video.test.js +0 -308
- package/clis/boss/auth.js +0 -47
- package/clis/boss/batchgreet.js +0 -61
- package/clis/boss/chatlist.js +0 -116
- package/clis/boss/chatlist.test.js +0 -211
- package/clis/boss/chatmsg.js +0 -117
- package/clis/boss/chatmsg.test.js +0 -230
- package/clis/boss/detail.js +0 -63
- package/clis/boss/exchange.js +0 -46
- package/clis/boss/greet.js +0 -49
- package/clis/boss/invite.js +0 -64
- package/clis/boss/joblist.js +0 -31
- package/clis/boss/mark.js +0 -70
- package/clis/boss/recommend.js +0 -45
- package/clis/boss/resume.js +0 -150
- package/clis/boss/search.js +0 -197
- package/clis/boss/search.test.js +0 -78
- package/clis/boss/send.js +0 -44
- package/clis/boss/stats.js +0 -66
- package/clis/boss/utils.js +0 -468
- package/clis/boss/utils.test.js +0 -34
- package/clis/chaoxing/assignments.js +0 -76
- package/clis/chaoxing/auth.js +0 -54
- package/clis/chaoxing/exams.js +0 -75
- package/clis/chaoxing/utils.js +0 -223
- package/clis/chaoxing/utils.test.js +0 -45
- package/clis/cnki/search.js +0 -61
- package/clis/cnki/search.test.js +0 -18
- package/clis/ctrip/auth.js +0 -50
- package/clis/ctrip/ctrip.test.js +0 -719
- package/clis/ctrip/flight.js +0 -136
- package/clis/ctrip/hotel-search.js +0 -132
- package/clis/ctrip/hotel-suggest.js +0 -45
- package/clis/ctrip/search.js +0 -41
- package/clis/ctrip/utils.js +0 -473
- package/clis/deepseek/ask.js +0 -158
- package/clis/deepseek/ask.test.js +0 -399
- package/clis/deepseek/auth.js +0 -54
- package/clis/deepseek/detail.js +0 -46
- package/clis/deepseek/detail.test.js +0 -81
- package/clis/deepseek/history.js +0 -27
- package/clis/deepseek/new.js +0 -33
- package/clis/deepseek/read.js +0 -25
- package/clis/deepseek/send.js +0 -140
- package/clis/deepseek/send.test.js +0 -107
- package/clis/deepseek/status.js +0 -26
- package/clis/deepseek/utils.js +0 -487
- package/clis/deepseek/utils.test.js +0 -370
- package/clis/dianping/__fixtures__/search.html +0 -168
- package/clis/dianping/__fixtures__/shop.html +0 -6
- package/clis/dianping/auth.js +0 -49
- package/clis/dianping/cityResolver.js +0 -185
- package/clis/dianping/dianping.test.js +0 -578
- package/clis/dianping/search.js +0 -157
- package/clis/dianping/shop.js +0 -173
- package/clis/dianping/utils.js +0 -157
- package/clis/dongchedi/__fixtures__/search.json +0 -60
- package/clis/dongchedi/__fixtures__/series-detail.json +0 -911
- package/clis/dongchedi/__fixtures__/series-score.json +0 -1396
- package/clis/dongchedi/dongchedi.test.js +0 -191
- package/clis/dongchedi/koubei.js +0 -85
- package/clis/dongchedi/models.js +0 -91
- package/clis/dongchedi/score.js +0 -83
- package/clis/dongchedi/search.js +0 -83
- package/clis/dongchedi/series.js +0 -87
- package/clis/dongchedi/specs.js +0 -115
- package/clis/dongchedi/utils.js +0 -180
- package/clis/douban/auth.js +0 -50
- package/clis/douban/book-hot.js +0 -15
- package/clis/douban/download.js +0 -68
- package/clis/douban/download.test.js +0 -170
- package/clis/douban/marks.js +0 -116
- package/clis/douban/movie-hot.js +0 -15
- package/clis/douban/movie-hot.test.js +0 -14
- package/clis/douban/photos.js +0 -35
- package/clis/douban/reviews.js +0 -107
- package/clis/douban/search.js +0 -18
- package/clis/douban/search.test.js +0 -11
- package/clis/douban/subject.js +0 -46
- package/clis/douban/subject.test.js +0 -11
- package/clis/douban/top250.js +0 -68
- package/clis/douban/utils.js +0 -657
- package/clis/douban/utils.test.js +0 -488
- package/clis/doubao/ask.js +0 -40
- package/clis/doubao/auth.js +0 -66
- package/clis/doubao/detail.js +0 -35
- package/clis/doubao/detail.test.js +0 -42
- package/clis/doubao/history.js +0 -30
- package/clis/doubao/history.test.js +0 -37
- package/clis/doubao/meeting-summary.js +0 -41
- package/clis/doubao/meeting-transcript.js +0 -38
- package/clis/doubao/new.js +0 -22
- package/clis/doubao/read.js +0 -21
- package/clis/doubao/send.js +0 -24
- package/clis/doubao/status.js +0 -26
- package/clis/doubao/utils.js +0 -1156
- package/clis/doubao/utils.test.js +0 -396
- package/clis/doubao-app/ask.js +0 -54
- package/clis/doubao-app/dump.js +0 -25
- package/clis/doubao-app/new.js +0 -21
- package/clis/doubao-app/read.js +0 -19
- package/clis/doubao-app/screenshot.js +0 -19
- package/clis/doubao-app/send.js +0 -28
- package/clis/doubao-app/status.js +0 -17
- package/clis/doubao-app/utils.js +0 -110
- package/clis/douyin/_shared/browser-fetch.js +0 -66
- package/clis/douyin/_shared/browser-fetch.test.js +0 -64
- package/clis/douyin/_shared/creation-id.js +0 -5
- package/clis/douyin/_shared/creation-id.test.js +0 -22
- package/clis/douyin/_shared/evaluate-result.js +0 -16
- package/clis/douyin/_shared/imagex-upload.js +0 -53
- package/clis/douyin/_shared/imagex-upload.test.js +0 -87
- package/clis/douyin/_shared/public-api.js +0 -29
- package/clis/douyin/_shared/sts2.js +0 -21
- package/clis/douyin/_shared/sts2.test.js +0 -27
- package/clis/douyin/_shared/text-extra.js +0 -15
- package/clis/douyin/_shared/text-extra.test.js +0 -37
- package/clis/douyin/_shared/timing.js +0 -22
- package/clis/douyin/_shared/timing.test.js +0 -28
- package/clis/douyin/_shared/tos-upload-short-read.test.js +0 -83
- package/clis/douyin/_shared/tos-upload.js +0 -331
- package/clis/douyin/_shared/tos-upload.test.js +0 -229
- package/clis/douyin/_shared/transcode.js +0 -45
- package/clis/douyin/_shared/transcode.test.js +0 -91
- package/clis/douyin/_shared/vod-upload.js +0 -212
- package/clis/douyin/_shared/vod-upload.test.js +0 -38
- package/clis/douyin/activities.js +0 -23
- package/clis/douyin/activities.test.js +0 -55
- package/clis/douyin/auth.js +0 -39
- package/clis/douyin/collections.js +0 -23
- package/clis/douyin/collections.test.js +0 -45
- package/clis/douyin/delete.js +0 -152
- package/clis/douyin/delete.test.js +0 -100
- package/clis/douyin/draft.js +0 -355
- package/clis/douyin/draft.test.js +0 -335
- package/clis/douyin/drafts.js +0 -24
- package/clis/douyin/drafts.test.js +0 -11
- package/clis/douyin/hashtag.js +0 -114
- package/clis/douyin/hashtag.test.js +0 -171
- package/clis/douyin/location.js +0 -25
- package/clis/douyin/location.test.js +0 -23
- package/clis/douyin/profile.js +0 -29
- package/clis/douyin/profile.test.js +0 -46
- package/clis/douyin/publish-upload-id.test.js +0 -206
- package/clis/douyin/publish.js +0 -341
- package/clis/douyin/publish.test.js +0 -38
- package/clis/douyin/search.js +0 -308
- package/clis/douyin/search.test.js +0 -307
- package/clis/douyin/stats.js +0 -28
- package/clis/douyin/stats.test.js +0 -22
- package/clis/douyin/update.js +0 -32
- package/clis/douyin/update.test.js +0 -11
- package/clis/douyin/user-videos.js +0 -82
- package/clis/douyin/user-videos.test.js +0 -151
- package/clis/douyin/videos.js +0 -52
- package/clis/douyin/videos.test.js +0 -54
- package/clis/eastmoney/_secid.js +0 -78
- package/clis/eastmoney/announcement.js +0 -53
- package/clis/eastmoney/convertible.js +0 -74
- package/clis/eastmoney/etf.js +0 -66
- package/clis/eastmoney/holders.js +0 -79
- package/clis/eastmoney/hot-rank.js +0 -51
- package/clis/eastmoney/hot-rank.test.js +0 -59
- package/clis/eastmoney/index-board.js +0 -97
- package/clis/eastmoney/kline.js +0 -88
- package/clis/eastmoney/kuaixun.js +0 -55
- package/clis/eastmoney/longhu.js +0 -68
- package/clis/eastmoney/money-flow.js +0 -79
- package/clis/eastmoney/northbound.js +0 -58
- package/clis/eastmoney/quote.js +0 -108
- package/clis/eastmoney/rank.js +0 -95
- package/clis/eastmoney/sectors.js +0 -77
- package/clis/flomo/auth.js +0 -55
- package/clis/flomo/memos.js +0 -228
- package/clis/flomo/memos.test.js +0 -144
- package/clis/gitee/auth.js +0 -41
- package/clis/gitee/index.js +0 -3
- package/clis/gitee/search.js +0 -137
- package/clis/gitee/search.test.js +0 -65
- package/clis/gitee/trending.js +0 -568
- package/clis/gitee/user.js +0 -200
- package/clis/gitee/user.test.js +0 -63
- package/clis/gov-law/commands.test.js +0 -39
- package/clis/gov-law/recent.js +0 -22
- package/clis/gov-law/search.js +0 -41
- package/clis/gov-law/shared.js +0 -51
- package/clis/gov-policy/__fixtures__/recent.html +0 -16
- package/clis/gov-policy/__fixtures__/search.html +0 -41
- package/clis/gov-policy/gov-policy.test.js +0 -224
- package/clis/gov-policy/recent.js +0 -90
- package/clis/gov-policy/search.js +0 -91
- package/clis/gov-policy/utils.js +0 -54
- package/clis/guazi/__fixtures__/detail.html +0 -7
- package/clis/guazi/__fixtures__/list.html +0 -5
- package/clis/guazi/browse.js +0 -95
- package/clis/guazi/car.js +0 -110
- package/clis/guazi/guazi.test.js +0 -126
- package/clis/guazi/utils.js +0 -133
- package/clis/huodongxing/events.js +0 -322
- package/clis/huodongxing/events.test.js +0 -296
- package/clis/hupu/__fixtures__/hot-home.html +0 -64
- package/clis/hupu/auth.js +0 -47
- package/clis/hupu/detail.js +0 -72
- package/clis/hupu/hot.js +0 -163
- package/clis/hupu/hot.test.js +0 -224
- package/clis/hupu/like.js +0 -76
- package/clis/hupu/mentions.js +0 -160
- package/clis/hupu/reply.js +0 -72
- package/clis/hupu/search.js +0 -60
- package/clis/hupu/unlike.js +0 -76
- package/clis/hupu/utils.js +0 -319
- package/clis/jd/add-cart.js +0 -72
- package/clis/jd/auth.js +0 -46
- package/clis/jd/cart.js +0 -80
- package/clis/jd/commands.test.js +0 -41
- package/clis/jd/detail.js +0 -63
- package/clis/jd/item.js +0 -730
- package/clis/jd/item.test.js +0 -354
- package/clis/jd/item.test.ts +0 -517
- package/clis/jd/reviews.js +0 -55
- package/clis/jd/search.js +0 -66
- package/clis/jianyu/auth.js +0 -62
- package/clis/jianyu/detail.js +0 -21
- package/clis/jianyu/search.js +0 -634
- package/clis/jianyu/search.test.js +0 -153
- package/clis/jianyu/shared/china-bid-search.js +0 -165
- package/clis/jianyu/shared/procurement-contract.js +0 -324
- package/clis/jianyu/shared/procurement-contract.test.js +0 -72
- package/clis/jianyu/shared/procurement-detail.js +0 -107
- package/clis/jianyu/shared/procurement-detail.test.js +0 -84
- package/clis/jike/auth.js +0 -48
- package/clis/jike/comment.js +0 -107
- package/clis/jike/create.js +0 -106
- package/clis/jike/feed.js +0 -68
- package/clis/jike/like.js +0 -61
- package/clis/jike/notifications.js +0 -169
- package/clis/jike/post.js +0 -72
- package/clis/jike/read.test.js +0 -86
- package/clis/jike/repost.js +0 -103
- package/clis/jike/search.js +0 -68
- package/clis/jike/topic.js +0 -65
- package/clis/jike/user.js +0 -65
- package/clis/jike/utils.js +0 -25
- package/clis/jimeng/auth.js +0 -46
- package/clis/jimeng/generate.js +0 -84
- package/clis/jimeng/history.js +0 -48
- package/clis/jimeng/new.js +0 -44
- package/clis/jimeng/workspaces.js +0 -42
- package/clis/juejin/hot.js +0 -37
- package/clis/juejin/juejin.test.js +0 -241
- package/clis/juejin/recommend.js +0 -61
- package/clis/juejin/utils.js +0 -199
- package/clis/ke/auth.js +0 -46
- package/clis/ke/chengjiao.js +0 -78
- package/clis/ke/ershoufang.js +0 -101
- package/clis/ke/utils.js +0 -104
- package/clis/ke/xiaoqu.js +0 -78
- package/clis/ke/zufang.js +0 -95
- package/clis/kimi/_utils.js +0 -110
- package/clis/kimi/audit-extras.js +0 -268
- package/clis/kimi/auth.js +0 -57
- package/clis/kimi/chat.js +0 -470
- package/clis/kimi/kimi.test.js +0 -187
- package/clis/kimi/storage.js +0 -169
- package/clis/kimi/ui.js +0 -314
- package/clis/kimi/usage.js +0 -144
- package/clis/linux-do/auth.js +0 -55
- package/clis/linux-do/categories.js +0 -50
- package/clis/linux-do/feed.js +0 -395
- package/clis/linux-do/feed.test.js +0 -153
- package/clis/linux-do/search.js +0 -29
- package/clis/linux-do/tags.js +0 -28
- package/clis/linux-do/topic-content.js +0 -155
- package/clis/linux-do/topic-content.test.js +0 -59
- package/clis/linux-do/topic.js +0 -53
- package/clis/linux-do/user-posts.js +0 -57
- package/clis/linux-do/user-topics.js +0 -37
- package/clis/maimai/auth.js +0 -47
- package/clis/maimai/search-talents.js +0 -192
- package/clis/maimai/search-talents.test.js +0 -29
- package/clis/mubu/doc.js +0 -41
- package/clis/mubu/docs.js +0 -44
- package/clis/mubu/notes.js +0 -245
- package/clis/mubu/recent.js +0 -28
- package/clis/mubu/search.js +0 -63
- package/clis/mubu/utils.js +0 -304
- package/clis/nowcoder/auth.js +0 -65
- package/clis/nowcoder/companies.js +0 -24
- package/clis/nowcoder/creators.js +0 -28
- package/clis/nowcoder/detail.js +0 -62
- package/clis/nowcoder/experience.js +0 -37
- package/clis/nowcoder/hot.js +0 -25
- package/clis/nowcoder/jobs.js +0 -22
- package/clis/nowcoder/notifications.js +0 -30
- package/clis/nowcoder/papers.js +0 -41
- package/clis/nowcoder/practice.js +0 -38
- package/clis/nowcoder/recommend.js +0 -31
- package/clis/nowcoder/referral.js +0 -40
- package/clis/nowcoder/salary.js +0 -41
- package/clis/nowcoder/search.js +0 -50
- package/clis/nowcoder/suggest.js +0 -34
- package/clis/nowcoder/topics.js +0 -28
- package/clis/nowcoder/trending.js +0 -26
- package/clis/ones/common.js +0 -144
- package/clis/ones/enrich-tasks.js +0 -37
- package/clis/ones/login.js +0 -81
- package/clis/ones/logout.js +0 -18
- package/clis/ones/me.js +0 -31
- package/clis/ones/my-tasks.js +0 -121
- package/clis/ones/resolve-labels.js +0 -64
- package/clis/ones/task-helpers.js +0 -212
- package/clis/ones/task-helpers.test.js +0 -12
- package/clis/ones/task.js +0 -67
- package/clis/ones/tasks.js +0 -80
- package/clis/ones/token-info.js +0 -43
- package/clis/ones/worklog.js +0 -268
- package/clis/ones/worklog.test.js +0 -20
- package/clis/powerchina/auth.js +0 -52
- package/clis/powerchina/search.js +0 -251
- package/clis/powerchina/search.test.js +0 -93
- package/clis/quark/auth.js +0 -47
- package/clis/quark/ls.js +0 -64
- package/clis/quark/mkdir.js +0 -37
- package/clis/quark/mv.js +0 -54
- package/clis/quark/rename.js +0 -27
- package/clis/quark/rm.js +0 -25
- package/clis/quark/save.js +0 -81
- package/clis/quark/share-tree.js +0 -46
- package/clis/quark/utils.js +0 -146
- package/clis/quark/utils.test.js +0 -58
- package/clis/qwen/ask.js +0 -104
- package/clis/qwen/ask.test.js +0 -36
- package/clis/qwen/auth.js +0 -56
- package/clis/qwen/detail.js +0 -62
- package/clis/qwen/history.js +0 -61
- package/clis/qwen/image.js +0 -179
- package/clis/qwen/new.js +0 -23
- package/clis/qwen/read.js +0 -41
- package/clis/qwen/send.js +0 -55
- package/clis/qwen/status.js +0 -37
- package/clis/qwen/utils.js +0 -461
- package/clis/qwen/utils.test.js +0 -128
- package/clis/rednote/auth.js +0 -52
- package/clis/rednote/comments.js +0 -85
- package/clis/rednote/download.js +0 -59
- package/clis/rednote/feed.js +0 -27
- package/clis/rednote/navigation.test.js +0 -26
- package/clis/rednote/note.js +0 -68
- package/clis/rednote/notifications.js +0 -139
- package/clis/rednote/rednote.test.js +0 -240
- package/clis/rednote/search.js +0 -107
- package/clis/rednote/user.js +0 -55
- package/clis/sinablog/article.js +0 -15
- package/clis/sinablog/hot.js +0 -15
- package/clis/sinablog/search.js +0 -52
- package/clis/sinablog/user.js +0 -16
- package/clis/sinablog/utils.js +0 -186
- package/clis/sinafinance/news.js +0 -62
- package/clis/sinafinance/rolling-news.js +0 -41
- package/clis/sinafinance/stock-rank.js +0 -66
- package/clis/sinafinance/stock.js +0 -121
- package/clis/sinafinance/stock.test.js +0 -59
- package/clis/smzdm/search.js +0 -149
- package/clis/smzdm/search.test.js +0 -114
- package/clis/taobao/add-cart.js +0 -150
- package/clis/taobao/auth.js +0 -58
- package/clis/taobao/cart.js +0 -96
- package/clis/taobao/commands.test.js +0 -41
- package/clis/taobao/detail.js +0 -71
- package/clis/taobao/reviews.js +0 -77
- package/clis/taobao/search.js +0 -97
- package/clis/tdx/hot-rank.js +0 -48
- package/clis/tdx/hot-rank.test.js +0 -59
- package/clis/ths/hot-rank.js +0 -50
- package/clis/ths/hot-rank.test.js +0 -64
- package/clis/tieba/commands.test.js +0 -79
- package/clis/tieba/hot.js +0 -48
- package/clis/tieba/posts.js +0 -86
- package/clis/tieba/read.js +0 -141
- package/clis/tieba/search.js +0 -109
- package/clis/tieba/utils.js +0 -240
- package/clis/tieba/utils.test.js +0 -290
- package/clis/toutiao/articles.js +0 -55
- package/clis/toutiao/auth.js +0 -70
- package/clis/toutiao/hot.js +0 -63
- package/clis/toutiao/toutiao.test.js +0 -378
- package/clis/toutiao/utils.js +0 -161
- package/clis/trae-cn/activity.js +0 -22
- package/clis/trae-cn/approve.js +0 -52
- package/clis/trae-cn/ask.js +0 -99
- package/clis/trae-cn/dump.js +0 -5
- package/clis/trae-cn/export.js +0 -40
- package/clis/trae-cn/model.js +0 -22
- package/clis/trae-cn/new.js +0 -63
- package/clis/trae-cn/read.js +0 -23
- package/clis/trae-cn/screenshot.js +0 -5
- package/clis/trae-cn/select-model.js +0 -25
- package/clis/trae-cn/send.js +0 -23
- package/clis/trae-cn/setup.js +0 -75
- package/clis/trae-cn/status.js +0 -27
- package/clis/trae-cn/targets.js +0 -96
- package/clis/trae-cn/trae-cn.test.js +0 -412
- package/clis/trae-cn/utils.js +0 -750
- package/clis/trae-cn/watch.js +0 -119
- package/clis/uisdc/news.js +0 -105
- package/clis/uisdc/news.test.js +0 -66
- package/clis/v2ex/auth.js +0 -44
- package/clis/v2ex/daily.js +0 -99
- package/clis/v2ex/hot.js +0 -26
- package/clis/v2ex/latest.js +0 -26
- package/clis/v2ex/me.js +0 -100
- package/clis/v2ex/member.js +0 -28
- package/clis/v2ex/node.js +0 -39
- package/clis/v2ex/nodes.js +0 -26
- package/clis/v2ex/notifications.js +0 -72
- package/clis/v2ex/replies.js +0 -27
- package/clis/v2ex/topic.js +0 -31
- package/clis/v2ex/user.js +0 -34
- package/clis/wanfang/search.js +0 -66
- package/clis/wanfang/search.test.js +0 -23
- package/clis/wechat-channels/auth.js +0 -62
- package/clis/wechat-channels/publish.js +0 -732
- package/clis/wechat-channels/publish.test.js +0 -144
- package/clis/weibo/auth.js +0 -53
- package/clis/weibo/comments.js +0 -53
- package/clis/weibo/delete.js +0 -172
- package/clis/weibo/delete.test.js +0 -94
- package/clis/weibo/envelope.test.js +0 -85
- package/clis/weibo/favorites.js +0 -170
- package/clis/weibo/favorites.test.js +0 -114
- package/clis/weibo/feed.js +0 -69
- package/clis/weibo/hot.js +0 -39
- package/clis/weibo/me.js +0 -75
- package/clis/weibo/post.js +0 -75
- package/clis/weibo/publish.js +0 -306
- package/clis/weibo/publish.test.js +0 -192
- package/clis/weibo/search.js +0 -80
- package/clis/weibo/user-posts.js +0 -234
- package/clis/weibo/user-posts.test.js +0 -92
- package/clis/weibo/user.js +0 -63
- package/clis/weibo/utils.js +0 -59
- package/clis/weibo/utils.test.js +0 -36
- package/clis/weixin/create-draft.js +0 -226
- package/clis/weixin/download.js +0 -371
- package/clis/weixin/download.test.js +0 -106
- package/clis/weixin/drafts.js +0 -66
- package/clis/weixin/drafts.test.js +0 -69
- package/clis/weixin/search.js +0 -157
- package/clis/weixin/search.test.js +0 -227
- package/clis/weread/ai-outline.js +0 -171
- package/clis/weread/ai-outline.test.js +0 -83
- package/clis/weread/auth.js +0 -59
- package/clis/weread/book-search.js +0 -438
- package/clis/weread/book-search.test.js +0 -242
- package/clis/weread/book.js +0 -233
- package/clis/weread/commands.test.js +0 -398
- package/clis/weread/highlights.js +0 -24
- package/clis/weread/notebooks.js +0 -22
- package/clis/weread/notes.js +0 -30
- package/clis/weread/private-api-regression.test.js +0 -369
- package/clis/weread/ranking.js +0 -29
- package/clis/weread/search-regression.test.js +0 -494
- package/clis/weread/search.js +0 -186
- package/clis/weread/shelf.js +0 -66
- package/clis/weread/utils.js +0 -321
- package/clis/weread/utils.test.js +0 -128
- package/clis/weread-official/book.js +0 -135
- package/clis/weread-official/commands.test.js +0 -385
- package/clis/weread-official/discover.js +0 -107
- package/clis/weread-official/list-apis.js +0 -95
- package/clis/weread-official/notes.js +0 -171
- package/clis/weread-official/readdata.js +0 -158
- package/clis/weread-official/review.js +0 -93
- package/clis/weread-official/search.js +0 -106
- package/clis/weread-official/shelf.js +0 -97
- package/clis/weread-official/utils.js +0 -293
- package/clis/weread-official/utils.test.js +0 -242
- package/clis/xianyu/auth.js +0 -68
- package/clis/xianyu/chat.js +0 -74
- package/clis/xianyu/chat.test.js +0 -84
- package/clis/xianyu/im.js +0 -322
- package/clis/xianyu/im.test.js +0 -253
- package/clis/xianyu/inbox.js +0 -96
- package/clis/xianyu/item.js +0 -153
- package/clis/xianyu/item.test.js +0 -56
- package/clis/xianyu/messages.js +0 -91
- package/clis/xianyu/publish.js +0 -485
- package/clis/xianyu/publish.test.js +0 -220
- package/clis/xianyu/reply.js +0 -82
- package/clis/xianyu/search.js +0 -262
- package/clis/xianyu/search.test.js +0 -104
- package/clis/xianyu/utils.js +0 -8
- package/clis/xiaoe/auth.js +0 -55
- package/clis/xiaoe/catalog.js +0 -227
- package/clis/xiaoe/content.js +0 -175
- package/clis/xiaoe/courses.js +0 -127
- package/clis/xiaoe/detail.js +0 -36
- package/clis/xiaoe/play-url.js +0 -121
- package/clis/xiaoe/xiaoe.test.js +0 -486
- package/clis/xiaohongshu/ask.js +0 -426
- package/clis/xiaohongshu/ask.test.js +0 -271
- package/clis/xiaohongshu/auth.js +0 -53
- package/clis/xiaohongshu/collection-helpers.js +0 -283
- package/clis/xiaohongshu/collection-helpers.test.js +0 -125
- package/clis/xiaohongshu/comments.js +0 -228
- package/clis/xiaohongshu/comments.test.js +0 -320
- package/clis/xiaohongshu/creator-note-detail.js +0 -482
- package/clis/xiaohongshu/creator-note-detail.test.js +0 -451
- package/clis/xiaohongshu/creator-notes-summary.js +0 -98
- package/clis/xiaohongshu/creator-notes-summary.test.js +0 -94
- package/clis/xiaohongshu/creator-notes.js +0 -479
- package/clis/xiaohongshu/creator-notes.test.js +0 -281
- package/clis/xiaohongshu/creator-profile.js +0 -55
- package/clis/xiaohongshu/creator-stats.js +0 -76
- package/clis/xiaohongshu/creator-stats.test.js +0 -24
- package/clis/xiaohongshu/delete-note.js +0 -260
- package/clis/xiaohongshu/delete-note.test.js +0 -172
- package/clis/xiaohongshu/download.js +0 -249
- package/clis/xiaohongshu/download.test.js +0 -339
- package/clis/xiaohongshu/draft-clear.js +0 -91
- package/clis/xiaohongshu/draft-delete.js +0 -103
- package/clis/xiaohongshu/draft-open.js +0 -43
- package/clis/xiaohongshu/draft-utils.js +0 -142
- package/clis/xiaohongshu/drafts.js +0 -28
- package/clis/xiaohongshu/drafts.test.js +0 -172
- package/clis/xiaohongshu/feed.js +0 -163
- package/clis/xiaohongshu/feed.test.js +0 -126
- package/clis/xiaohongshu/follow.js +0 -226
- package/clis/xiaohongshu/follow.test.js +0 -211
- package/clis/xiaohongshu/liked.js +0 -29
- package/clis/xiaohongshu/liked.test.js +0 -82
- package/clis/xiaohongshu/navigation.test.js +0 -38
- package/clis/xiaohongshu/note-helpers.js +0 -69
- package/clis/xiaohongshu/note.js +0 -104
- package/clis/xiaohongshu/note.test.js +0 -249
- package/clis/xiaohongshu/notifications.js +0 -46
- package/clis/xiaohongshu/publish.js +0 -1423
- package/clis/xiaohongshu/publish.test.js +0 -1141
- package/clis/xiaohongshu/saved.js +0 -29
- package/clis/xiaohongshu/saved.test.js +0 -143
- package/clis/xiaohongshu/search.js +0 -330
- package/clis/xiaohongshu/search.test.js +0 -325
- package/clis/xiaohongshu/unfollow.js +0 -285
- package/clis/xiaohongshu/user-helpers.js +0 -78
- package/clis/xiaohongshu/user-helpers.test.js +0 -160
- package/clis/xiaohongshu/user.js +0 -140
- package/clis/xiaohongshu/user.test.js +0 -141
- package/clis/xiaoyuzhou/auth.js +0 -303
- package/clis/xiaoyuzhou/auth.test.js +0 -124
- package/clis/xiaoyuzhou/download.js +0 -54
- package/clis/xiaoyuzhou/download.test.js +0 -135
- package/clis/xiaoyuzhou/episode.js +0 -34
- package/clis/xiaoyuzhou/podcast-episodes.js +0 -41
- package/clis/xiaoyuzhou/podcast-episodes.test.js +0 -78
- package/clis/xiaoyuzhou/podcast.js +0 -33
- package/clis/xiaoyuzhou/transcript.js +0 -77
- package/clis/xiaoyuzhou/transcript.test.js +0 -195
- package/clis/xiaoyuzhou/utils.js +0 -15
- package/clis/xiaoyuzhou/utils.test.js +0 -39
- package/clis/xueqiu/auth.js +0 -63
- package/clis/xueqiu/comments.js +0 -355
- package/clis/xueqiu/comments.test.js +0 -696
- package/clis/xueqiu/danjuan-utils.js +0 -126
- package/clis/xueqiu/danjuan-utils.test.js +0 -41
- package/clis/xueqiu/earnings-date.js +0 -45
- package/clis/xueqiu/feed.js +0 -39
- package/clis/xueqiu/fund-holdings.js +0 -29
- package/clis/xueqiu/fund-snapshot.js +0 -26
- package/clis/xueqiu/groups.js +0 -23
- package/clis/xueqiu/hot-stock.js +0 -32
- package/clis/xueqiu/hot.js +0 -37
- package/clis/xueqiu/kline.js +0 -44
- package/clis/xueqiu/search.js +0 -37
- package/clis/xueqiu/stock.js +0 -65
- package/clis/xueqiu/utils.js +0 -48
- package/clis/xueqiu/utils.test.js +0 -26
- package/clis/xueqiu/watchlist.js +0 -37
- package/clis/youdao/note.js +0 -258
- package/clis/youdao/note.test.js +0 -99
- package/clis/yuanbao/ask.js +0 -362
- package/clis/yuanbao/ask.test.js +0 -124
- package/clis/yuanbao/auth.js +0 -59
- package/clis/yuanbao/detail.js +0 -65
- package/clis/yuanbao/history.js +0 -51
- package/clis/yuanbao/new.js +0 -72
- package/clis/yuanbao/new.test.js +0 -30
- package/clis/yuanbao/read.js +0 -38
- package/clis/yuanbao/send.js +0 -57
- package/clis/yuanbao/shared.js +0 -341
- package/clis/yuanbao/shared.test.js +0 -80
- package/clis/yuanbao/status.js +0 -44
- package/clis/zhihu/answer-comments.js +0 -280
- package/clis/zhihu/answer-comments.test.js +0 -287
- package/clis/zhihu/answer-detail.js +0 -216
- package/clis/zhihu/answer-detail.test.js +0 -338
- package/clis/zhihu/answer.js +0 -54
- package/clis/zhihu/answer.test.js +0 -54
- package/clis/zhihu/auth.js +0 -59
- package/clis/zhihu/collection.js +0 -199
- package/clis/zhihu/collection.test.js +0 -337
- package/clis/zhihu/collections.js +0 -128
- package/clis/zhihu/collections.test.js +0 -182
- package/clis/zhihu/comment.js +0 -55
- package/clis/zhihu/comment.test.js +0 -50
- package/clis/zhihu/download.js +0 -80
- package/clis/zhihu/download.test.js +0 -12
- package/clis/zhihu/favorite.js +0 -87
- package/clis/zhihu/favorite.test.js +0 -59
- package/clis/zhihu/follow.js +0 -50
- package/clis/zhihu/follow.test.js +0 -42
- package/clis/zhihu/followers.js +0 -40
- package/clis/zhihu/followers.test.js +0 -42
- package/clis/zhihu/following.js +0 -40
- package/clis/zhihu/following.test.js +0 -44
- package/clis/zhihu/hot.js +0 -44
- package/clis/zhihu/like.js +0 -47
- package/clis/zhihu/like.test.js +0 -41
- package/clis/zhihu/paginate.js +0 -128
- package/clis/zhihu/pins.js +0 -41
- package/clis/zhihu/pins.test.js +0 -44
- package/clis/zhihu/question.js +0 -113
- package/clis/zhihu/question.test.js +0 -251
- package/clis/zhihu/recommend.js +0 -103
- package/clis/zhihu/recommend.test.js +0 -143
- package/clis/zhihu/search.js +0 -206
- package/clis/zhihu/search.test.js +0 -198
- package/clis/zhihu/target.js +0 -91
- package/clis/zhihu/target.test.js +0 -77
- package/clis/zhihu/text.js +0 -29
- package/clis/zhihu/text.test.js +0 -24
- package/clis/zhihu/user-answers.js +0 -41
- package/clis/zhihu/user-answers.test.js +0 -69
- package/clis/zhihu/user-arg.js +0 -34
- package/clis/zhihu/user-articles.js +0 -40
- package/clis/zhihu/user-articles.test.js +0 -44
- package/clis/zhihu/user.js +0 -59
- package/clis/zhihu/user.test.js +0 -73
- package/clis/zhihu/write-shared.js +0 -228
- package/clis/zhihu/write-shared.test.js +0 -176
- package/clis/zsxq/auth.js +0 -68
- package/clis/zsxq/dynamics.js +0 -48
- package/clis/zsxq/groups.js +0 -33
- package/clis/zsxq/search.js +0 -44
- package/clis/zsxq/search.test.js +0 -24
- package/clis/zsxq/topic.js +0 -50
- package/clis/zsxq/topic.test.js +0 -30
- package/clis/zsxq/topics.js +0 -26
- package/clis/zsxq/topics.test.js +0 -24
- package/clis/zsxq/utils.js +0 -233
- package/clis/zsxq/utils.test.js +0 -31
- package/dist/src/weixin-download.test.js +0 -45
- package/skills/webcmd-adapter-author/references/site-memory/bilibili.md +0 -70
- package/skills/webcmd-adapter-author/references/site-memory/eastmoney.md +0 -70
- package/skills/webcmd-adapter-author/references/site-memory/tonghuashun.md +0 -51
- package/skills/webcmd-adapter-author/references/site-memory/xueqiu.md +0 -58
- /package/{clis/douyin/_shared/types.js → dist/src/browser/profile.test.d.ts} +0 -0
- /package/dist/src/{weixin-download.test.d.ts → generate-release-notes-cli.test.d.ts} +0 -0
|
@@ -1,295 +1,186 @@
|
|
|
1
1
|
# API Discovery
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
Use this after `site-recon.md` chooses Pattern A/B/C/D/E. The output of this file is a candidate endpoint plus evidence for the strategy note.
|
|
4
4
|
|
|
5
|
-
|
|
5
|
+
Keep `--trace on --keep-tab true --window foreground` enabled while exploring browser-backed sites.
|
|
6
6
|
|
|
7
|
-
|
|
7
|
+
## Section 0 - Preflight Red Lines
|
|
8
8
|
|
|
9
|
-
|
|
9
|
+
Read these before endpoint verification. If you miss either one, you can spend the rest of discovery testing the wrong thing.
|
|
10
10
|
|
|
11
|
-
|
|
11
|
+
### 0.1 Anti-bot and WAF gates decide whether Node fetch is valid
|
|
12
12
|
|
|
13
|
-
|
|
13
|
+
`webcmd browser analyze <url>` reports the `anti_bot` field. You can also inspect cookies and the response body manually.
|
|
14
14
|
|
|
15
|
-
|
|
15
|
+
| Cookie or body signal | Vendor | Bare Node fetch or curl result | Strategy |
|
|
16
|
+
| --- | --- | --- | --- |
|
|
17
|
+
| `acw_sc__v2`, `acw_tc`, `ssxmod_itna`; body contains `arg1 = '32-HEX'` or `/ntc_captcha/` | Aliyun WAF | Slider HTML instead of real data | Verify the endpoint in browser context first; HTML-style cookie adapters can still end with Node-side fetch plus `page.getCookies()` |
|
|
18
|
+
| `__cf_bm`, `cf_clearance`, `__cfduid`; body contains `Cloudflare Ray ID` or `Checking your browser` | Cloudflare | TLS or browser fingerprint is rejected | Use a browser/session-aware probe first, then choose the adapter fetch route from `adapter-template.md` |
|
|
19
|
+
| `_abck`, `bm_sz`, `bm_sv` | Akamai | Often blocked even with cookies | Use a browser/session-aware probe first |
|
|
20
|
+
| Body contains `geetest` or `gt_captcha` | Geetest | Slider or puzzle challenge; no programmatic solution in this skill | Out of scope; stop or use a user-visible UI strategy |
|
|
16
21
|
|
|
17
|
-
|
|
18
|
-
|------------------|------|-----|-----|
|
|
19
|
-
| `acw_sc__v2` / `acw_tc` / `ssxmod_itna`;body 含 `arg1 = '32-HEX'` 或 `/ntc_captcha/` | **Aliyun WAF** | 返回 slider HTML,不是真数据 | 先在浏览器上下文里验证 endpoint;HTML 型 COOKIE adapter 最终仍走 Node-side fetch + `page.getCookies()` |
|
|
20
|
-
| `__cf_bm` / `cf_clearance` / `__cfduid`;body 含 `Cloudflare Ray ID` / `Checking your browser` | **Cloudflare** | TLS 指纹被标记,失败 | 同上:先 browser-context probe,最终 adapter 仍按模板选 fetch 路线 |
|
|
21
|
-
| `_abck` / `bm_sz` / `bm_sv` | **Akamai** | 即使带 cookie 也常被挡 | 同上 |
|
|
22
|
-
| body 含 `geetest` / `gt_captcha` | **Geetest** | 滑块/拼图,程序无解 | 超出 skill 范围,放弃或 UI 策略 |
|
|
22
|
+
Rule: if any of these anti-bot or WAF signals appear, do not use bare Node fetch as endpoint verification. First prove the endpoint from the browser context or from a page on the target origin. After that, choose the final adapter strategy normally: JSON browser APIs may use `page.fetchJson()`, while HTML-style cookie adapters should keep using Node-side `fetch` with cookies read through `page.getCookies()`.
|
|
23
23
|
|
|
24
|
-
|
|
24
|
+
### 0.2 Cross-subdomain fetch is CORS-blocked by default
|
|
25
25
|
|
|
26
|
-
|
|
26
|
+
For example, a page on `jobs.51job.com` fetching an API on `cupid.51job.com` will usually hit a CORS preflight unless the API returns `Access-Control-Allow-Origin`.
|
|
27
27
|
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
判断:
|
|
31
|
-
|
|
32
|
-
```bash
|
|
33
|
-
webcmd browser eval "fetch('https://<target-subdomain>/api/...', {credentials:'include'}).then(r=>r.status).catch(e=>'cors:'+e.message)"
|
|
34
|
-
```
|
|
35
|
-
|
|
36
|
-
- 返回 status 数字 → CORS 通,继续
|
|
37
|
-
- 返回 `cors:...` 或 `TypeError: Failed to fetch` → 挡住了
|
|
38
|
-
|
|
39
|
-
**挡住时**:不要把 `credentials:'include'` 当万能药——这只解决"带 cookie",不解决"跨 origin"。降级路径:
|
|
40
|
-
|
|
41
|
-
1. 换同 origin 的 endpoint(同一个 subdomain 下的 API 往往更宽松)
|
|
42
|
-
2. 用 `webcmd browser open https://<target-subdomain>/`,让页面在目标 subdomain 本身打开,再 fetch 相对路径
|
|
43
|
-
3. 真跨域且无替代 → 走 `§5 intercept`,从页面自身发的请求里抓响应
|
|
44
|
-
|
|
45
|
-
---
|
|
46
|
-
|
|
47
|
-
## §1 network 精读(首选,Pattern A / D 命中率最高)
|
|
48
|
-
|
|
49
|
-
### 拿候选
|
|
28
|
+
Probe it explicitly:
|
|
50
29
|
|
|
51
30
|
```bash
|
|
52
|
-
webcmd browser
|
|
31
|
+
webcmd browser eval "fetch('https://<target-subdomain>/api/...', { credentials: 'include' }).then(r => r.status).catch(e => 'cors:' + e.message)"
|
|
53
32
|
```
|
|
54
33
|
|
|
55
|
-
|
|
56
|
-
- `
|
|
57
|
-
- `shape` — response body 的路径→类型映射(不含原 body,省 token)
|
|
58
|
-
- `status / url / method / ct / size`
|
|
59
|
-
|
|
60
|
-
静态资源 / 埋点 / 追踪默认已过滤。默认会保留 JSON / XML / plain text / `text/javascript` 这类 API 响应;如果你确定浏览器 DevTools 里有目标请求但这里缺失,用 `--all` 查一遍是否被 content-type 或 URL 噪音过滤挡掉。
|
|
61
|
-
|
|
62
|
-
如果是冷启动,先看 `webcmd browser analyze <url>` 里的 `api_candidates`:
|
|
63
|
-
|
|
64
|
-
- `verdict: "likely_data"`:优先 replay 这条,拿 status / content-type / sample shape 填 strategy note
|
|
65
|
-
- `verdict: "maybe_data"`:可以试,但必须人工核对字段是否是目标业务数据
|
|
66
|
-
- `verdict: "noise"`:多半是 analytics / beacon / personalization,不要因为 XHR 数量多就判 Pattern A
|
|
67
|
-
- `verdict: "blocked"`:401/403;先排 cookie / token / CSRF,别直接退到 selector
|
|
68
|
-
|
|
69
|
-
`real_data_score` 是证据,不是自动 strategy。最终仍要在 strategy note 里写 replay 结果和降级理由。
|
|
34
|
+
- A numeric status means CORS allows the request.
|
|
35
|
+
- `cors:...` or `TypeError: Failed to fetch` means the browser blocked it.
|
|
70
36
|
|
|
71
|
-
|
|
37
|
+
When it is blocked, `credentials: include` is not a CORS fix across subdomains. It only asks the browser to send cookies; it does not grant cross-origin permission. Use this fallback order:
|
|
72
38
|
|
|
73
|
-
|
|
39
|
+
1. Prefer a same-origin endpoint on the current subdomain.
|
|
40
|
+
2. Open a page on the target subdomain with `webcmd browser open https://<target-subdomain>/`, then fetch relative paths from that origin.
|
|
41
|
+
3. If the data is truly cross-origin and there is no same-origin alternative, use Section 5 intercept and capture the response from the page's own request.
|
|
74
42
|
|
|
75
|
-
|
|
76
|
-
- 路径里出现 `nickname / avatar / title / price / tweets / items` → 就是它
|
|
77
|
-
- shape 只有 `$: string` 或全是 HTML 噪音 → 下一条
|
|
43
|
+
## Section 1 - Network Deep Read
|
|
78
44
|
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
已经知道目标 body 该含哪些字段就直接让 CLI 把列表筛到只剩候选,不用自己 scroll 翻 shape:
|
|
82
|
-
|
|
83
|
-
```bash
|
|
84
|
-
webcmd browser network --filter author,text,likes
|
|
85
|
-
```
|
|
86
|
-
|
|
87
|
-
- 字段以英文逗号分隔;AND 语义,必须每个字段都作为 shape 路径的**任意一段**出现才保留(`$.data.items[0].author` 命中 `author`、`items`、`data` 都算)
|
|
88
|
-
- 区分大小写(JSON key 本来就 case-sensitive)
|
|
89
|
-
- 输出 envelope 新增 `filter` / `filter_dropped`,`count` 是过滤后数量
|
|
90
|
-
- 0 命中不是 error,返回 `entries: []`;说明字段组合不对,换一组或去掉约束再试
|
|
91
|
-
- 不要跟 `--detail` 一起用——`--detail` 按 key 取单条、`--filter` 是列表缩窄,组合会报 `invalid_args`
|
|
92
|
-
- 空值 / `,,,` → `invalid_filter` 结构化错误
|
|
93
|
-
- capture 依然按全量持久化,后续 `--detail <key>` 能找到被过滤掉的条目
|
|
94
|
-
|
|
95
|
-
### 拉完整 body
|
|
96
|
-
|
|
97
|
-
候选定了再拉完整 body(by key,不是 index — 数组顺序会随每次 capture 变):
|
|
45
|
+
Use for Pattern A and for deeper data in Pattern B.
|
|
98
46
|
|
|
99
47
|
```bash
|
|
100
|
-
webcmd browser
|
|
48
|
+
webcmd browser open <url> --trace on --keep-tab true --window foreground
|
|
49
|
+
webcmd browser wait xhr '<path-or-domain-fragment>'
|
|
50
|
+
webcmd browser network --format json
|
|
101
51
|
```
|
|
102
52
|
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
### 关键 request headers
|
|
106
|
-
|
|
107
|
-
`browser network` 当前只抓响应(body + status + ct),抓不到请求头。要看请求头就在 DevTools Network 面板里点这条 request,或用 `browser eval` 手动 `fetch(url)` 复现一次观察浏览器发出去的头:
|
|
108
|
-
|
|
109
|
-
| 看到 | 含义 | 对应策略 |
|
|
110
|
-
|------|------|---------|
|
|
111
|
-
| 只有 `Cookie` | 登录态靠 cookie | `Strategy.COOKIE` |
|
|
112
|
-
| `Authorization: Bearer xxx` | token 鉴权 | 先找 token 来源(localStorage / cookie / bundle 硬编码) |
|
|
113
|
-
| `X-Csrf-Token: xxx` 同时存在 cookie 里 | CSRF 防护 | `Strategy.COOKIE`,从 cookie 读 ct0 类字段拼头 |
|
|
114
|
-
| `X-Workspace-Id / X-Tenant-Id` | 多租户业务头 | 先调 `/workspaces` 拿 ID,缓存下来 |
|
|
115
|
-
| 啥自定义头都没有 | 匿名接口 | `Strategy.PUBLIC` |
|
|
116
|
-
|
|
117
|
-
### 触发懒加载接口
|
|
118
|
-
|
|
119
|
-
默认页加载完后滚动 / 点击才会出的接口不在首屏 network 里。需要:
|
|
120
|
-
|
|
121
|
-
```bash
|
|
122
|
-
# 滚到底(虚拟列表)
|
|
123
|
-
webcmd browser eval "window.scrollTo(0, document.body.scrollHeight)"
|
|
124
|
-
webcmd browser wait time 2
|
|
125
|
-
webcmd browser network
|
|
126
|
-
|
|
127
|
-
# 点某个按钮
|
|
128
|
-
webcmd browser click <N>
|
|
129
|
-
webcmd browser wait time 2
|
|
130
|
-
webcmd browser network
|
|
131
|
-
```
|
|
53
|
+
Inspect each candidate:
|
|
132
54
|
|
|
133
|
-
|
|
55
|
+
- URL and method.
|
|
56
|
+
- Status code and content type.
|
|
57
|
+
- Query/body params.
|
|
58
|
+
- Request headers that appear auth-related.
|
|
59
|
+
- Response shape and whether it includes target data.
|
|
60
|
+
- Whether data is user-visible, not analytics, ads, experiments, or personalization noise.
|
|
134
61
|
|
|
135
|
-
|
|
62
|
+
Reject candidates that only contain telemetry, unrelated recommendations, beacons, or layout metadata.
|
|
136
63
|
|
|
137
|
-
|
|
64
|
+
Replay directly when possible:
|
|
138
65
|
|
|
139
66
|
```bash
|
|
140
|
-
webcmd browser eval "
|
|
67
|
+
webcmd browser eval "await fetch('<url>', { credentials: 'include' }).then(r => r.text())"
|
|
141
68
|
```
|
|
142
69
|
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
| 全局 | 框架 |
|
|
146
|
-
|------|-----|
|
|
147
|
-
| `__NEXT_DATA__` | Next.js |
|
|
148
|
-
| `__NUXT__` | Nuxt.js |
|
|
149
|
-
| `__INITIAL_STATE__` | 自定义 Vue / React SSR |
|
|
150
|
-
| `__PRELOADED_STATE__` | Redux SSR |
|
|
151
|
-
| `__REMIX_CONTEXT__` | Remix |
|
|
70
|
+
If Node-side replay works without page runtime state, prefer `PUBLIC_API` or `COOKIE_API`. If the endpoint only works in page context, document why before selecting `PAGE_FETCH`.
|
|
152
71
|
|
|
153
|
-
|
|
72
|
+
## Section 2 - State Extraction
|
|
154
73
|
|
|
155
|
-
|
|
156
|
-
webcmd browser eval "JSON.stringify(window.__NEXT_DATA__).slice(0, 3000)"
|
|
157
|
-
```
|
|
74
|
+
Use for Pattern B.
|
|
158
75
|
|
|
159
|
-
|
|
76
|
+
Look for:
|
|
160
77
|
|
|
161
|
-
|
|
78
|
+
- `window.__INITIAL_STATE__`
|
|
79
|
+
- `window.__NEXT_DATA__`
|
|
80
|
+
- `window.__NUXT__`
|
|
81
|
+
- JSON in `<script type="application/json">`
|
|
82
|
+
- SSR HTML structures containing visible values
|
|
162
83
|
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
## §3 JS bundle / script src 搜索(Pattern C,也是 A/D 的降级)
|
|
166
|
-
|
|
167
|
-
### 扫 script src
|
|
84
|
+
Commands:
|
|
168
85
|
|
|
169
86
|
```bash
|
|
170
|
-
webcmd browser eval "
|
|
87
|
+
webcmd browser eval "Object.keys(window).filter(k => /STATE|DATA|NUXT|APP/i.test(k))"
|
|
88
|
+
webcmd browser eval "document.querySelectorAll('script[type=\"application/json\"], script:not([src])').length"
|
|
89
|
+
webcmd browser eval "document.body.innerText.slice(0, 2000)"
|
|
171
90
|
```
|
|
172
91
|
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
- 明显像 API 的域名(`api.xxx / push.xxx / data.xxx / gateway.xxx`)→ 直接去试
|
|
176
|
-
- 主 bundle(`main.js / app.js / index.xxx.js`)→ 继续下一步下载 bundle 搜 baseURL
|
|
92
|
+
Use `DOM_STATE` when the target data is stable in state or HTML. If only a deeper interaction loads the target data, return to section 1.
|
|
177
93
|
|
|
178
|
-
|
|
94
|
+
## Section 3 - Bundle / Script Src Search
|
|
179
95
|
|
|
180
|
-
|
|
181
|
-
webcmd browser eval "(async()=>{const s=[...document.querySelectorAll('script[src]')].map(e=>e.src).find(s=>/main|app|index|bundle|chunk/.test(s));if(!s)return'no bundle';const t=await fetch(s).then(r=>r.text());const patterns=['baseURL','baseUrl','BASE_URL','apiHost','apiBase','API_HOST','API_BASE'];const hits=[];for(const p of patterns){let i=-1;while((i=t.indexOf(p,i+1))>-1&&hits.length<5)hits.push(t.slice(Math.max(0,i-5),i+80));}return hits})()"
|
|
182
|
-
```
|
|
183
|
-
|
|
184
|
-
命中 `baseURL:"https://api.foo.com"` 直接拿 host 拼 endpoint。
|
|
185
|
-
|
|
186
|
-
### 直接试候选 endpoint
|
|
96
|
+
Use for Pattern C.
|
|
187
97
|
|
|
188
|
-
|
|
98
|
+
Collect script sources:
|
|
189
99
|
|
|
190
100
|
```bash
|
|
191
|
-
webcmd browser eval "
|
|
101
|
+
webcmd browser eval "[...document.querySelectorAll('script[src]')].map(s => s.src)"
|
|
192
102
|
```
|
|
193
103
|
|
|
194
|
-
|
|
104
|
+
Look for domains or paths containing:
|
|
195
105
|
|
|
196
|
-
|
|
106
|
+
- `api`
|
|
107
|
+
- `data`
|
|
108
|
+
- `search`
|
|
109
|
+
- `graphql`
|
|
110
|
+
- `query`
|
|
111
|
+
- `feed`
|
|
112
|
+
- `suggest`
|
|
113
|
+
- `push`
|
|
197
114
|
|
|
198
|
-
|
|
115
|
+
For JSONP or callback-wrapped payloads, verify that stripping the wrapper yields parseable JSON:
|
|
199
116
|
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
```bash
|
|
204
|
-
# 当前页加 .json 试
|
|
205
|
-
webcmd browser eval "fetch(location.pathname.replace(/\\/$/,'')+'.json').then(r=>r.ok?r.json():'no')"
|
|
117
|
+
```js
|
|
118
|
+
const raw = await fetch(url).then((r) => r.text());
|
|
119
|
+
const json = JSON.parse(raw.replace(/^[\w$.]+\((.*)\);?$/, '$1'));
|
|
206
120
|
```
|
|
207
121
|
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
## §4 Token / CSRF 来源排查(Pattern D)
|
|
122
|
+
If a script points to bundle code rather than data, search for base URLs, route names, and query keys. Prefer endpoints with stable names and visible data over minified private internals.
|
|
211
123
|
|
|
212
|
-
|
|
124
|
+
## Section 4 - Token / Header Source
|
|
213
125
|
|
|
214
|
-
|
|
126
|
+
Use for Pattern D.
|
|
215
127
|
|
|
216
|
-
|
|
217
|
-
webcmd browser eval "document.cookie.split('; ').reduce((o,x)=>{const[k,v]=x.split('=');o[k]=v;return o},{})"
|
|
218
|
-
```
|
|
219
|
-
|
|
220
|
-
常见 token cookie 名:`ct0`(Twitter CSRF)、`xq_a_token`(雪球)、`SESSDATA`(B 站)、`_csrf / csrfToken`(通用)。
|
|
221
|
-
|
|
222
|
-
**`document.cookie` 只能看到 non-HttpOnly 的 cookie。** 上面那条命令侦察阶段够用,真写 adapter 时 auth 经常是 HttpOnly,一定要用 `page.getCookies(...)` 从 CDP cookie jar 拿——见 `adapter-template.md` 的 "COOKIE adapter 骨架"。
|
|
128
|
+
Find token sources in this order:
|
|
223
129
|
|
|
224
|
-
|
|
130
|
+
1. Network request headers.
|
|
131
|
+
2. Cookies available through `page.getCookies()`.
|
|
132
|
+
3. Meta tags or inline scripts.
|
|
133
|
+
4. Global state.
|
|
134
|
+
5. Same-origin bootstrap endpoint.
|
|
225
135
|
|
|
226
|
-
|
|
136
|
+
Useful probes:
|
|
227
137
|
|
|
228
138
|
```bash
|
|
229
|
-
webcmd browser eval "
|
|
139
|
+
webcmd browser eval "document.querySelector('meta[name=\"csrf-token\"]')?.content"
|
|
140
|
+
webcmd browser eval "Object.keys(localStorage)"
|
|
141
|
+
webcmd browser eval "Object.keys(sessionStorage)"
|
|
142
|
+
webcmd browser eval "document.cookie"
|
|
230
143
|
```
|
|
231
144
|
|
|
232
|
-
|
|
145
|
+
Rules:
|
|
233
146
|
|
|
234
|
-
|
|
147
|
+
- It is fine to reuse cookies and CSRF values the page already has.
|
|
148
|
+
- Do not teach bypassing CAPTCHA, risk controls, or access controls.
|
|
149
|
+
- Do not reverse engineer private signatures when the only path is static secrets or brittle bundle logic.
|
|
150
|
+
- If token extraction is fragile but the user-visible page can perform the action, choose `UI_SELECTOR` or `INTERCEPT`.
|
|
235
151
|
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
```bash
|
|
239
|
-
webcmd browser eval "(async()=>{const s=[...document.querySelectorAll('script[src]')].map(e=>e.src).find(s=>/main|app|bundle/.test(s));const t=await fetch(s).then(r=>r.text());const m=t.match(/Bearer\\s+[\\w-]{20,}/g);return m?.slice(0,3)||'not found'})()"
|
|
240
|
-
```
|
|
152
|
+
## Section 5 - Store Action / Intercept Fallback
|
|
241
153
|
|
|
242
|
-
|
|
154
|
+
Use only after public API, cookie API, DOM state, and UI selector options are insufficient.
|
|
243
155
|
|
|
244
|
-
|
|
156
|
+
For page actions:
|
|
245
157
|
|
|
246
158
|
```bash
|
|
247
|
-
|
|
248
|
-
webcmd browser
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
webcmd browser eval "window.__pinia.state.value.someStore.someMethod({...})"
|
|
159
|
+
webcmd browser trace start
|
|
160
|
+
webcmd browser click '<selector>'
|
|
161
|
+
webcmd browser wait xhr '<target-fragment>'
|
|
162
|
+
webcmd browser network --format json
|
|
252
163
|
```
|
|
253
164
|
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
## §5 installInterceptor(最后降级)
|
|
165
|
+
Choose `INTERCEPT` when:
|
|
257
166
|
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
await page.evaluateWithArgs(installInterceptorCode, {
|
|
263
|
-
config: { domain: 'api.xxx.com', path: '/foo' },
|
|
264
|
-
});
|
|
265
|
-
await page.goto('https://xxx.com/trigger-page');
|
|
266
|
-
// 等页面自己发那条请求
|
|
267
|
-
const intercepted = await page.evaluate('window.__webcmd_intercepted');
|
|
268
|
-
return intercepted.response;
|
|
269
|
-
```
|
|
167
|
+
- The page naturally sends the target request.
|
|
168
|
+
- The response contains the target data.
|
|
169
|
+
- You can trigger the request with a stable UI action.
|
|
170
|
+
- You can explain why replay and DOM extraction are not enough.
|
|
270
171
|
|
|
271
|
-
|
|
172
|
+
Choose `UI_SELECTOR` when the operation itself is the user-visible contract, such as clicking, publishing, uploading, or filling a form.
|
|
272
173
|
|
|
273
|
-
|
|
174
|
+
## Endpoint Verification Checklist
|
|
274
175
|
|
|
275
|
-
|
|
176
|
+
Before writing adapter code:
|
|
276
177
|
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
│ no
|
|
285
|
-
↓
|
|
286
|
-
§3 bundle ──→ 命中?yes → 走
|
|
287
|
-
│ no
|
|
288
|
-
↓
|
|
289
|
-
§4 token ──→ 401 解除?yes → 走
|
|
290
|
-
│ no
|
|
291
|
-
↓
|
|
292
|
-
§5 intercept → 让页面自己发
|
|
293
|
-
```
|
|
178
|
+
- [ ] Candidate response is 200.
|
|
179
|
+
- [ ] Candidate response contains target data.
|
|
180
|
+
- [ ] Candidate is not analytics, ads, or telemetry.
|
|
181
|
+
- [ ] Auth source is documented.
|
|
182
|
+
- [ ] Replay method is documented.
|
|
183
|
+
- [ ] Strategy note is written.
|
|
184
|
+
- [ ] At least one field value is compared against the visible page.
|
|
294
185
|
|
|
295
|
-
|
|
186
|
+
If any item fails, return to `site-recon.md` or the earlier section of this file.
|
|
@@ -1,81 +1,47 @@
|
|
|
1
1
|
# Coverage Matrix
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
Use this file before writing an adapter. It decides whether the task is inside the Webcmd adapter-authoring lane.
|
|
4
4
|
|
|
5
|
-
|
|
6
|
-
- ✅ **已验证**:有可跑通的真实 adapter / dry-run 证据
|
|
7
|
-
- 🟡 **已列招但未硬跑**:文档把方法写全了,但这一版没拿真实站点跑过;第一次遇到时按文档走,踩坑回来补 `site-memory`
|
|
8
|
-
- ❌ **不支持**:skill 明确不碰,走绕开方案
|
|
5
|
+
## Supported
|
|
9
6
|
|
|
10
|
-
|
|
7
|
+
| Scenario | Good fit | Notes |
|
|
8
|
+
| --- | --- | --- |
|
|
9
|
+
| Public JSON or HTML endpoint | Yes | Prefer `PUBLIC_API` when Node-side `fetch` can replay it without auth. |
|
|
10
|
+
| Cookie-backed JSON or HTML endpoint | Yes | Use `COOKIE_API` when cookies, CSRF, or headers can be sourced from the page safely. |
|
|
11
|
+
| Visible UI actions | Yes | Use `UI_SELECTOR` for clicks, forms, uploads, and other user-visible workflows. |
|
|
12
|
+
| SSR or hydration state | Yes | Use `DOM_STATE` when target data appears in HTML, script JSON, or bootstrap state. |
|
|
13
|
+
| Page-context fetch | Conditional | Use `PAGE_FETCH` only when same-origin/session/runtime state makes Node-side replay impossible. |
|
|
14
|
+
| Natural page request interception | Conditional | Use `INTERCEPT` when the page can naturally issue a signed request and UI/DOM is not enough. |
|
|
15
|
+
| JSDOM fixture regression | Yes | Use when DOM extraction has already produced a silent bug or mocked evaluate is too weak. |
|
|
11
16
|
|
|
12
|
-
##
|
|
17
|
+
## Unsupported
|
|
13
18
|
|
|
14
|
-
|
|
|
15
|
-
|
|
16
|
-
|
|
|
17
|
-
|
|
|
18
|
-
|
|
|
19
|
-
|
|
|
20
|
-
|
|
|
21
|
-
| |
|
|
22
|
-
| |
|
|
23
|
-
| | SPA + 独立 BFF domain | 🟡 | `api-discovery.md` §bundle §suffix |
|
|
24
|
-
| Strategy(详见 `strategy-selection.md`) | 裸 `fetch()` 拿到 | ✅ | `PUBLIC_API`(一方文档化接口,最稳:fixes/adapter-year=1.18) |
|
|
25
|
-
| | cookie 透传 | ✅ | `COOKIE_API`(官方 web 接口 + 用户登录态,fixes/adapter-year=2.01) |
|
|
26
|
-
| | publish / upload / click / 表单 | ✅ | `UI_SELECTOR`(DOM 的 a11y / semantic 也是契约,fixes/adapter-year=1.92) |
|
|
27
|
-
| | hydration state / inline JSON | 🟡 | `DOM_STATE`(fixes/adapter-year=0.91 小样本 N=11,按 UI_SELECTOR 同档) |
|
|
28
|
-
| | page-context fetch(CORS / same-origin runtime) | 🟡 | `PAGE_FETCH`(无契约内部 endpoint,fixes/adapter-year=8.41,必须正向论证) |
|
|
29
|
-
| | 触发 UI 拦截响应 | 🟡 | `INTERCEPT`(无契约,fixes/adapter-year=8.69,必须正向论证) |
|
|
30
|
-
| 字段形态 | 自解释(`title / price / current`) | ✅ | 直接映射 |
|
|
31
|
-
| | 已登记代号 | ✅ | `field-conventions.md` 查表 |
|
|
32
|
-
| | 未登记代号 | 🟡 | `field-decode-playbook.md` 排序键对比法 |
|
|
33
|
-
| | 嵌套路径 `data.diff[].f2` | ✅ | `field-decode-playbook.md` §3 结构差分 |
|
|
34
|
-
| 分页 | `page` / `pn` / `pageNum` | ✅ | `adapter-template.md` 例子 |
|
|
35
|
-
| | `cursor` / `next_cursor` | ✅ | adapter 里 while 循环,收集到 limit |
|
|
36
|
-
| | `offset` / `start` | ✅ | 同上 |
|
|
37
|
-
| 响应格式 | JSON | ✅ | 默认 |
|
|
38
|
-
| | JSONP(`?callback=`) | ✅ | 去掉 callback 参数直接请求,返回仍是 JSON 字符串包裹 |
|
|
39
|
-
| | CSV 字符串(eastmoney kline) | ✅ | `response.split(',')` 按列序解 |
|
|
40
|
-
| | HTML 表格(tonghuashun) | 🟡 | `page.evaluate` 里用 `querySelectorAll` 拿 |
|
|
19
|
+
| Scenario | Reason | Alternative |
|
|
20
|
+
| --- | --- | --- |
|
|
21
|
+
| First-time login token acquisition | Requires the user to enter real credentials | Ask the user to log in manually in the browser session, then reuse cookies. |
|
|
22
|
+
| CAPTCHA or heavy anti-bot bypass | This would bypass access controls or risk systems | Stop or choose another source with the same data. |
|
|
23
|
+
| Client crypto or private signing secrets | Requires reverse engineering and ongoing bundle tracking | Prefer another endpoint; if unavoidable, let the page issue the request and use `INTERCEPT`. |
|
|
24
|
+
| Pure WebSocket stream | State management is too high for this skill | Look for an HTTP polling endpoint with the same data. |
|
|
25
|
+
| Private binary protocol | Not HTTP/JSON/HTML | Out of scope. |
|
|
26
|
+
| Canvas-only visual chart | Data is only in the render layer | Find the backing API; if none exists, stop. |
|
|
27
|
+
| Strict rate limit | Adapter authoring cannot solve platform quota policy | Add adapter-level concurrency limits/backoff, but do not brute force. |
|
|
41
28
|
|
|
42
|
-
|
|
29
|
+
## Quick Self-Test
|
|
43
30
|
|
|
44
|
-
|
|
31
|
+
Ask these questions before implementation:
|
|
45
32
|
|
|
46
|
-
|
|
33
|
+
1. **Can the data be seen in the browser?** If not because of a login wall or paywall, solve authentication first.
|
|
34
|
+
2. **Is the data source HTTP, JSON, or HTML?** If the answer is binary or encrypted-only, stop.
|
|
35
|
+
3. **Does the command require per-second push?** If yes, find an HTTP endpoint with the same data; if none exists, stop.
|
|
47
36
|
|
|
48
|
-
|
|
49
|
-
|------|------|---------|
|
|
50
|
-
| 首次登录获取 token | 需要用户真实输入账密 | 让用户先在 browser session 里手动登录,adapter 拿 cookie 就行 |
|
|
51
|
-
| 复杂 anti-bot(captcha) | 反爬拒流量 | 放弃,换同数据的其他站点 |
|
|
52
|
-
| 加密字段(客户端 crypto) | 要破解 bundle 逆向 | 换 endpoint;实在不行发请求到 intercept 让页面自己解 |
|
|
53
|
-
| WebSocket 流式数据 | 状态管理复杂 | 退回 HTTP 轮询版本(多数站都有) |
|
|
54
|
-
| 私有 binary 协议 | 非 HTTP/WS | 不在 skill 范围 |
|
|
55
|
-
| 视觉化图表(只有 canvas) | 数据埋在渲染层 | 找对应 API;找不到就放弃 |
|
|
56
|
-
| 签名算法涉及静态密钥 | 需要长期跟踪 bundle 变更 | 走 `Strategy.INTERCEPT`,让页面自己发带签名的请求 |
|
|
57
|
-
| 频控 / rate-limit 严格 | 多发几次就 429 | adapter 层控并发 + 加退避;但 skill 不解决 |
|
|
37
|
+
Continue only when all three checks pass.
|
|
58
38
|
|
|
59
|
-
|
|
39
|
+
## Evidence Levels
|
|
60
40
|
|
|
61
|
-
|
|
41
|
+
| Level | Meaning | Required proof |
|
|
42
|
+
| --- | --- | --- |
|
|
43
|
+
| Green | Hard verified | `webcmd browser verify` passed and visible-page values were checked. |
|
|
44
|
+
| Yellow | Plausible but not fully exercised | Pattern is documented, but this exact site has not been verified end-to-end. |
|
|
45
|
+
| Red | Out of scope | The skill explicitly does not teach this path. |
|
|
62
46
|
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
1. **数据能在浏览器里看到吗?** 看不到(登录墙 / 付费墙)→ 先解决鉴权,再回来
|
|
66
|
-
2. **数据来源是 HTTP/JSON/HTML 之一吗?** 不是(binary / 加密)→ 不在 skill 范围
|
|
67
|
-
3. **需不需要每秒推送?** 需要 → 找同数据 HTTP 接口;没有就放弃
|
|
68
|
-
|
|
69
|
-
三个都 yes 再往下走。
|
|
70
|
-
|
|
71
|
-
---
|
|
72
|
-
|
|
73
|
-
## 本轮硬验证 / 当前证据
|
|
74
|
-
|
|
75
|
-
| 类型 | 证据 adapter | 覆盖维度 |
|
|
76
|
-
|------|-------------|---------|
|
|
77
|
-
| PUBLIC + 自解释字段 + SPA | `~/.webcmd/clis/coingecko/top.js`(本轮 dry run) | `Strategy.PUBLIC` + REST JSON + 自解释字段 + 列表页 |
|
|
78
|
-
| COOKIE + 代号字段 + JSONP | `clis/eastmoney/*.js` × 13(PR #1091 merged) | `Strategy.PUBLIC`(匿名 `ut=`)+ JSONP + f-代号 + 列表/详情/K 线 |
|
|
79
|
-
| COOKIE + SPA | `clis/bilibili/*.js` × 10+(已存在) | `Strategy.COOKIE + browser:true` + wbi 签名 |
|
|
80
|
-
|
|
81
|
-
**本 PR 新增的 skill 还未硬验证的维度**:🟡 行,尤其 SSR Pattern B + Bearer/CSRF + 未登记代号解码。这些放到第一批真实用户 adapter 写作中打磨,skill 文档先落,踩坑回来补 `site-memory`。合 PR 之前先拿 coingecko 跑第二轮(带着第一轮写出的 `~/.webcmd/sites/coingecko/`)验证 memory 命中 → endpoint re-verify → 字段抽查 → 写 adapter 这条回路。
|
|
47
|
+
Prefer green evidence. If you proceed on yellow evidence, write the uncertainty in `~/.webcmd/sites/<site>/notes.md` after the run so the next agent starts with better context.
|