@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
package/clis/xianyu/utils.js
DELETED
|
@@ -1,8 +0,0 @@
|
|
|
1
|
-
import { ArgumentError } from '@agentrhq/webcmd/errors';
|
|
2
|
-
export function normalizeNumericId(value, label, example) {
|
|
3
|
-
const normalized = String(value || '').trim();
|
|
4
|
-
if (!/^\d+$/.test(normalized)) {
|
|
5
|
-
throw new ArgumentError(`${label} must be a numeric ID`, `Pass a numeric ${label}, for example: ${example}`);
|
|
6
|
-
}
|
|
7
|
-
return normalized;
|
|
8
|
-
}
|
package/clis/xiaoe/auth.js
DELETED
|
@@ -1,55 +0,0 @@
|
|
|
1
|
-
import { AuthRequiredError, CommandExecutionError } from '@agentrhq/webcmd/errors';
|
|
2
|
-
import { registerSiteAuthCommands } from '../_shared/site-auth.js';
|
|
3
|
-
|
|
4
|
-
async function hasXiaoeAdminCookie(page) {
|
|
5
|
-
const cookies = await page.getCookies({ url: 'https://admin.xiaoe-tech.com' });
|
|
6
|
-
return cookies.some(c => (c.name === 'XIAOEID' || c.name === 'b_user_token') && c.value);
|
|
7
|
-
}
|
|
8
|
-
|
|
9
|
-
async function verifyXiaoeIdentity(page) {
|
|
10
|
-
if (!await hasXiaoeAdminCookie(page)) {
|
|
11
|
-
throw new AuthRequiredError('xiaoe-tech.com', 'Xiaoe XIAOEID/b_user_token cookie missing — anonymous');
|
|
12
|
-
}
|
|
13
|
-
await page.goto('https://admin.xiaoe-tech.com/t/account/muti_index');
|
|
14
|
-
await page.wait(3);
|
|
15
|
-
const finalUrl = await page.evaluate(`location.href`);
|
|
16
|
-
if (/login|signin|#\/wx$/.test(String(finalUrl || ''))) {
|
|
17
|
-
throw new AuthRequiredError('xiaoe-tech.com', `Xiaoe admin page redirected to login: ${finalUrl}`);
|
|
18
|
-
}
|
|
19
|
-
const cookies = await page.getCookies({ url: 'https://admin.xiaoe-tech.com' });
|
|
20
|
-
const xiaoeId = cookies.find(c => c.name === 'XIAOEID')?.value || '';
|
|
21
|
-
const unionId = cookies.find(c => c.name === 'unionid')?.value || '';
|
|
22
|
-
const probe = await page.evaluate(`
|
|
23
|
-
(() => {
|
|
24
|
-
const bodyText = document.body?.innerText || '';
|
|
25
|
-
if (/微信扫码登录|手机号登录|登录小鹅通/.test(bodyText)) {
|
|
26
|
-
return { isLoginPage: true };
|
|
27
|
-
}
|
|
28
|
-
const nick = document.querySelector('.user-name, .nickname, [class*="userName"], [class*="user-info"]')?.innerText?.trim() || '';
|
|
29
|
-
return { isLoginPage: false, domNick: nick };
|
|
30
|
-
})()
|
|
31
|
-
`);
|
|
32
|
-
if (probe.isLoginPage) {
|
|
33
|
-
throw new AuthRequiredError('xiaoe-tech.com', 'Xiaoe admin page showed login UI — anonymous session');
|
|
34
|
-
}
|
|
35
|
-
const userId = xiaoeId || unionId;
|
|
36
|
-
if (!userId) {
|
|
37
|
-
throw new CommandExecutionError('Xiaoe admin page rendered but no user_id cookie extractable — stale session');
|
|
38
|
-
}
|
|
39
|
-
return { user_id: String(userId), nickname: String(probe.domNick || '') };
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
registerSiteAuthCommands({
|
|
43
|
-
site: 'xiaoe',
|
|
44
|
-
domain: 'xiaoe-tech.com',
|
|
45
|
-
loginUrl: 'https://admin.xiaoe-tech.com/',
|
|
46
|
-
columns: ['user_id', 'nickname'],
|
|
47
|
-
quickCheck: hasXiaoeAdminCookie,
|
|
48
|
-
verify: verifyXiaoeIdentity,
|
|
49
|
-
poll: async (page) => {
|
|
50
|
-
if (!await hasXiaoeAdminCookie(page)) {
|
|
51
|
-
throw new AuthRequiredError('xiaoe-tech.com', 'Waiting for Xiaoe XIAOEID/b_user_token cookie');
|
|
52
|
-
}
|
|
53
|
-
return verifyXiaoeIdentity(page);
|
|
54
|
-
},
|
|
55
|
-
});
|
package/clis/xiaoe/catalog.js
DELETED
|
@@ -1,227 +0,0 @@
|
|
|
1
|
-
// Xiaoe (小鹅通) catalog — list chapters + sections of a course / column
|
|
2
|
-
// page (`h5.xet.citv.cn`).
|
|
3
|
-
//
|
|
4
|
-
// Replaces the legacy `pipeline:[]` form. The in-browser extraction logic
|
|
5
|
-
// (Vue store walking + auto-scroll-to-load + Vue child traversal) is kept
|
|
6
|
-
// byte-for-byte — Xiaoe's pages are SPA-rendered and Vue's private API
|
|
7
|
-
// (`__vue__`, `$store`, `$children`, `chapter_box.__vue__`) is the only
|
|
8
|
-
// stable hook we have. JSDOM cannot reproduce the Vue runtime tree, so
|
|
9
|
-
// reorganising the IIFE without live verify would be silent-failure risk.
|
|
10
|
-
//
|
|
11
|
-
// What changes:
|
|
12
|
-
// - `func` form + `Strategy.COOKIE` + `browser:true`.
|
|
13
|
-
// - Typed errors: `ArgumentError` on missing url; `EmptyResultError`
|
|
14
|
-
// when the IIFE yields zero rows (almost always means the cookie
|
|
15
|
-
// expired or the URL is not a course page); `CommandExecutionError`
|
|
16
|
-
// when `page.evaluate` rejects.
|
|
17
|
-
// - Three pure helpers (`typeLabel`, `buildItemUrl`, `chapterUrlPath`)
|
|
18
|
-
// are module-level exports and are embedded into the in-page IIFE
|
|
19
|
-
// via `${fn.toString()}` so the live and the test path share one
|
|
20
|
-
// source of truth.
|
|
21
|
-
|
|
22
|
-
import { cli, Strategy } from '@agentrhq/webcmd/registry';
|
|
23
|
-
import { CommandExecutionError, EmptyResultError } from '@agentrhq/webcmd/errors';
|
|
24
|
-
import { requireXiaoePageUrl } from './content.js';
|
|
25
|
-
|
|
26
|
-
// resource_type → human label. 1=图文 2=直播 3=音频 4=视频 6=专栏 8=大专栏.
|
|
27
|
-
// Returns the raw `String(t)` when the type is unknown (e.g. xiaoe rolls
|
|
28
|
-
// out a new resource type) — never silently swallows it.
|
|
29
|
-
export function typeLabel(t) {
|
|
30
|
-
const map = { 1: '图文', 2: '直播', 3: '音频', 4: '视频', 6: '专栏', 8: '大专栏' };
|
|
31
|
-
return map[Number(t)] || String(t || '');
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
// Resolve a relative `jump_url` / `h5_url` / `url` against the page's
|
|
35
|
-
// origin. Returns '' when the item has no URL field at all.
|
|
36
|
-
export function buildItemUrl(item, origin) {
|
|
37
|
-
const u = item.jump_url || item.h5_url || item.url || '';
|
|
38
|
-
if (!u) return '';
|
|
39
|
-
return u.startsWith('http') ? u : (origin + u);
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
// chapter_type → URL path for the section reader. Xiaoe routes chapter
|
|
43
|
-
// types to different player paths; returning `undefined` for unknown
|
|
44
|
-
// types lets the caller decide whether to emit `''` instead of guessing
|
|
45
|
-
// a bad URL.
|
|
46
|
-
export function chapterUrlPath(chType) {
|
|
47
|
-
const map = { 1: '/v1/course/text/', 2: '/v2/course/alive/', 3: '/v1/course/audio/', 4: '/v1/course/video/' };
|
|
48
|
-
return map[Number(chType)];
|
|
49
|
-
}
|
|
50
|
-
|
|
51
|
-
export function buildCatalogScript() {
|
|
52
|
-
return `(async () => {
|
|
53
|
-
${typeLabel.toString()}
|
|
54
|
-
${buildItemUrl.toString()}
|
|
55
|
-
${chapterUrlPath.toString()}
|
|
56
|
-
var el = document.querySelector('#app');
|
|
57
|
-
var store = (el && el.__vue__) ? el.__vue__.$store : null;
|
|
58
|
-
if (!store) return [];
|
|
59
|
-
var coreInfo = store.state.coreInfo || {};
|
|
60
|
-
var resourceType = coreInfo.resource_type || 0;
|
|
61
|
-
var origin = window.location.origin;
|
|
62
|
-
var courseName = coreInfo.resource_name || '';
|
|
63
|
-
|
|
64
|
-
function clickTab(name) {
|
|
65
|
-
var tabs = document.querySelectorAll('span, div');
|
|
66
|
-
for (var i = 0; i < tabs.length; i++) {
|
|
67
|
-
if (tabs[i].children.length === 0 && tabs[i].textContent.trim() === name) {
|
|
68
|
-
tabs[i].click(); return;
|
|
69
|
-
}
|
|
70
|
-
}
|
|
71
|
-
}
|
|
72
|
-
|
|
73
|
-
clickTab('目录');
|
|
74
|
-
await new Promise(function(r) { setTimeout(r, 2000); });
|
|
75
|
-
|
|
76
|
-
function getScrollTargets() {
|
|
77
|
-
return document.querySelectorAll('.scroll-view, .list-wrap, .scroller, #app');
|
|
78
|
-
}
|
|
79
|
-
function getMaxScrollHeight(scrollers) {
|
|
80
|
-
var maxHeight = document.body.scrollHeight;
|
|
81
|
-
for (var i = 0; i < scrollers.length; i++) {
|
|
82
|
-
if (scrollers[i].scrollHeight > maxHeight) maxHeight = scrollers[i].scrollHeight;
|
|
83
|
-
}
|
|
84
|
-
return maxHeight;
|
|
85
|
-
}
|
|
86
|
-
|
|
87
|
-
// 模拟滚动以实现动态加载
|
|
88
|
-
var prevMaxScrollHeight = 0;
|
|
89
|
-
for (var sc = 0; sc < 20; sc++) {
|
|
90
|
-
window.scrollTo(0, 999999);
|
|
91
|
-
var scrollers = getScrollTargets();
|
|
92
|
-
for(var si = 0; si < scrollers.length; si++) {
|
|
93
|
-
if(scrollers[si].scrollHeight > scrollers[si].clientHeight) scrollers[si].scrollTop = scrollers[si].scrollHeight;
|
|
94
|
-
}
|
|
95
|
-
await new Promise(function(r) { setTimeout(r, 800); });
|
|
96
|
-
|
|
97
|
-
// 点击可能存在的下拉/加载更多
|
|
98
|
-
var moreTabs = document.querySelectorAll('span, div, p');
|
|
99
|
-
for (var bi = 0; bi < moreTabs.length; bi++) {
|
|
100
|
-
var t = moreTabs[bi].textContent.trim();
|
|
101
|
-
if ((t === '点击加载更多' || t === '展开更多' || t === '加载更多') && moreTabs[bi].clientHeight > 0) {
|
|
102
|
-
try { moreTabs[bi].click(); } catch(e){}
|
|
103
|
-
}
|
|
104
|
-
}
|
|
105
|
-
|
|
106
|
-
var maxScrollHeight = getMaxScrollHeight(getScrollTargets());
|
|
107
|
-
if (sc > 3 && maxScrollHeight === prevMaxScrollHeight) break;
|
|
108
|
-
prevMaxScrollHeight = maxScrollHeight;
|
|
109
|
-
}
|
|
110
|
-
await new Promise(function(r) { setTimeout(r, 1000); });
|
|
111
|
-
|
|
112
|
-
// ===== 专栏 / 大专栏 =====
|
|
113
|
-
if (resourceType === 6 || resourceType === 8) {
|
|
114
|
-
await new Promise(function(r) { setTimeout(r, 1000); });
|
|
115
|
-
var listData = [];
|
|
116
|
-
var walkList = function(vm, depth) {
|
|
117
|
-
if (!vm || depth > 6 || listData.length > 0) return;
|
|
118
|
-
var d = vm.$data || {};
|
|
119
|
-
var keys = ['columnList', 'SingleItemList', 'chapterChildren'];
|
|
120
|
-
for (var ki = 0; ki < keys.length; ki++) {
|
|
121
|
-
var arr = d[keys[ki]];
|
|
122
|
-
if (arr && Array.isArray(arr) && arr.length > 0 && arr[0].resource_id) {
|
|
123
|
-
for (var j = 0; j < arr.length; j++) {
|
|
124
|
-
var item = arr[j];
|
|
125
|
-
if (!item.resource_id || !/^[pvlai]_/.test(item.resource_id)) continue;
|
|
126
|
-
listData.push({
|
|
127
|
-
ch: 1,
|
|
128
|
-
chapter: courseName,
|
|
129
|
-
no: j + 1,
|
|
130
|
-
title: item.resource_title || item.title || item.chapter_title || '',
|
|
131
|
-
type: typeLabel(item.resource_type || item.chapter_type),
|
|
132
|
-
resource_id: item.resource_id,
|
|
133
|
-
url: buildItemUrl(item, origin),
|
|
134
|
-
status: item.finished_state === 1 ? '已完成' : (item.resource_count ? item.resource_count + '节' : ''),
|
|
135
|
-
});
|
|
136
|
-
}
|
|
137
|
-
return;
|
|
138
|
-
}
|
|
139
|
-
}
|
|
140
|
-
if (vm.$children) {
|
|
141
|
-
for (var c = 0; c < vm.$children.length; c++) walkList(vm.$children[c], depth + 1);
|
|
142
|
-
}
|
|
143
|
-
};
|
|
144
|
-
walkList(el.__vue__, 0);
|
|
145
|
-
return listData;
|
|
146
|
-
}
|
|
147
|
-
|
|
148
|
-
// ===== 普通课程 =====
|
|
149
|
-
var chapters = document.querySelectorAll('.chapter_box');
|
|
150
|
-
for (var ci = 0; ci < chapters.length; ci++) {
|
|
151
|
-
var vue = chapters[ci].__vue__;
|
|
152
|
-
if (vue && typeof vue.getSecitonList === 'function' && (!vue.isShowSecitonsList || !vue.chapterChildren.length)) {
|
|
153
|
-
if (vue.isShowSecitonsList) vue.isShowSecitonsList = false;
|
|
154
|
-
try { vue.getSecitonList(); } catch(e) {}
|
|
155
|
-
await new Promise(function(r) { setTimeout(r, 1500); });
|
|
156
|
-
}
|
|
157
|
-
}
|
|
158
|
-
await new Promise(function(r) { setTimeout(r, 3000); });
|
|
159
|
-
|
|
160
|
-
var result = [];
|
|
161
|
-
chapters = document.querySelectorAll('.chapter_box');
|
|
162
|
-
for (var cj = 0; cj < chapters.length; cj++) {
|
|
163
|
-
var v = chapters[cj].__vue__;
|
|
164
|
-
if (!v) continue;
|
|
165
|
-
var chTitle = (v.chapterItem && v.chapterItem.chapter_title) || '';
|
|
166
|
-
var children = v.chapterChildren || [];
|
|
167
|
-
for (var ck = 0; ck < children.length; ck++) {
|
|
168
|
-
var child = children[ck];
|
|
169
|
-
var resId = child.resource_id || child.chapter_id || '';
|
|
170
|
-
var chType = child.chapter_type || child.resource_type || 0;
|
|
171
|
-
var urlPath = chapterUrlPath(chType);
|
|
172
|
-
result.push({
|
|
173
|
-
ch: cj + 1,
|
|
174
|
-
chapter: chTitle,
|
|
175
|
-
no: ck + 1,
|
|
176
|
-
title: child.chapter_title || child.resource_title || '',
|
|
177
|
-
type: typeLabel(chType),
|
|
178
|
-
resource_id: resId,
|
|
179
|
-
url: urlPath ? origin + urlPath + resId + '?type=2' : '',
|
|
180
|
-
status: child.is_finish === 1 ? '已完成' : (child.learn_progress > 0 ? child.learn_progress + '%' : '未学'),
|
|
181
|
-
});
|
|
182
|
-
}
|
|
183
|
-
}
|
|
184
|
-
return result;
|
|
185
|
-
})()`;
|
|
186
|
-
}
|
|
187
|
-
|
|
188
|
-
async function getXiaoeCatalog(page, args) {
|
|
189
|
-
const url = requireXiaoePageUrl(args.url, 'catalog');
|
|
190
|
-
let rows;
|
|
191
|
-
try {
|
|
192
|
-
await page.goto(url, { waitUntil: 'load', settleMs: 8000 });
|
|
193
|
-
rows = await page.evaluate(buildCatalogScript());
|
|
194
|
-
} catch (error) {
|
|
195
|
-
const message = error instanceof Error ? error.message : String(error);
|
|
196
|
-
throw new CommandExecutionError(
|
|
197
|
-
`Failed to read xiaoe catalog: ${message}`,
|
|
198
|
-
'page may not have rendered or auth may be required',
|
|
199
|
-
);
|
|
200
|
-
}
|
|
201
|
-
if (!Array.isArray(rows) || rows.length === 0) {
|
|
202
|
-
throw new EmptyResultError(
|
|
203
|
-
'xiaoe/catalog',
|
|
204
|
-
'No catalog rows extracted — the URL may not be a course page or the login session has expired',
|
|
205
|
-
);
|
|
206
|
-
}
|
|
207
|
-
return rows;
|
|
208
|
-
}
|
|
209
|
-
|
|
210
|
-
export const catalogCommand = cli({
|
|
211
|
-
site: 'xiaoe',
|
|
212
|
-
name: 'catalog',
|
|
213
|
-
access: 'read',
|
|
214
|
-
description: '小鹅通课程目录(支持普通课程、专栏、大专栏)',
|
|
215
|
-
domain: 'h5.xet.citv.cn',
|
|
216
|
-
strategy: Strategy.COOKIE,
|
|
217
|
-
browser: true,
|
|
218
|
-
args: [
|
|
219
|
-
{ name: 'url', required: true, positional: true, help: '课程页面 URL' },
|
|
220
|
-
],
|
|
221
|
-
columns: ['ch', 'chapter', 'no', 'title', 'type', 'resource_id', 'url', 'status'],
|
|
222
|
-
func: getXiaoeCatalog,
|
|
223
|
-
});
|
|
224
|
-
|
|
225
|
-
export const __test__ = {
|
|
226
|
-
buildCatalogScript,
|
|
227
|
-
};
|
package/clis/xiaoe/content.js
DELETED
|
@@ -1,175 +0,0 @@
|
|
|
1
|
-
// Xiaoe (小鹅通) content extractor — pulls rendered article text from a
|
|
2
|
-
// rich-text page (h5.xet.citv.cn).
|
|
3
|
-
//
|
|
4
|
-
// Replaces the legacy `pipeline:[]` form. Two real bugs in the legacy
|
|
5
|
-
// adapter, both silent:
|
|
6
|
-
// 1. The IIFE returned `{title, content, content_length, image_count,
|
|
7
|
-
// images}` but `columns` declared `[title, content_length,
|
|
8
|
-
// image_count]` — `content` (the text the adapter exists to
|
|
9
|
-
// extract!) and `images` were silently dropped before reaching the
|
|
10
|
-
// caller. The user got "this article has 1234 chars" with no way
|
|
11
|
-
// to read those chars.
|
|
12
|
-
// 2. `JSON.stringify(images.slice(0, 20))` silently truncated to the
|
|
13
|
-
// first 20 image URLs and never told the caller the slice
|
|
14
|
-
// happened.
|
|
15
|
-
//
|
|
16
|
-
// New behavior:
|
|
17
|
-
// - `func` form + `Strategy.COOKIE` + `browser:true` (the page is
|
|
18
|
-
// gated behind a logged-in xiaoe session).
|
|
19
|
-
// - Pure helpers `pickContentText` / `countXiaoeImages` are
|
|
20
|
-
// module-level exports; the in-page IIFE embeds them via
|
|
21
|
-
// `${fn.toString()}` while JSDOM tests call the same exports
|
|
22
|
-
// directly against a hand-crafted fixture (same pattern as
|
|
23
|
-
// dianping #1313 / hupu #1387).
|
|
24
|
-
// - `content` is now a real column (the bug fix). `image_count` is
|
|
25
|
-
// metadata that helps callers decide whether to re-render the
|
|
26
|
-
// page for a JSON-image dump in a follow-up adapter.
|
|
27
|
-
// - Empty-content extraction → `EmptyResultError` with a
|
|
28
|
-
// login-likely hint (xiaoe routinely renders an empty shell when
|
|
29
|
-
// the cookie has expired). No silent `return [{ content: '' }]`.
|
|
30
|
-
|
|
31
|
-
import { cli, Strategy } from '@agentrhq/webcmd/registry';
|
|
32
|
-
import { ArgumentError, CommandExecutionError, EmptyResultError } from '@agentrhq/webcmd/errors';
|
|
33
|
-
|
|
34
|
-
export const CONTENT_SELECTORS = [
|
|
35
|
-
'.rich-text-wrap',
|
|
36
|
-
'.content-wrap',
|
|
37
|
-
'.article-content',
|
|
38
|
-
'.text-content',
|
|
39
|
-
'.course-detail',
|
|
40
|
-
'.detail-content',
|
|
41
|
-
'[class*="richtext"]',
|
|
42
|
-
'[class*="rich-text"]',
|
|
43
|
-
'.ql-editor',
|
|
44
|
-
];
|
|
45
|
-
export const CONTENT_MIN_LENGTH = 50;
|
|
46
|
-
|
|
47
|
-
// Pure: walk `selectors` in order, return the trimmed text of the first
|
|
48
|
-
// element whose `.innerText` (with `.textContent` fallback for JSDOM)
|
|
49
|
-
// has more than `minLength` characters. Falls back to `<main>`, then
|
|
50
|
-
// `#app`, then `<body>` — same chain the legacy IIFE used.
|
|
51
|
-
export function pickContentText(doc, selectors, minLength = CONTENT_MIN_LENGTH) {
|
|
52
|
-
for (const sel of selectors) {
|
|
53
|
-
const el = doc.querySelector(sel);
|
|
54
|
-
if (!el) continue;
|
|
55
|
-
const text = ((el.innerText || el.textContent) || '').trim();
|
|
56
|
-
if (text.length > minLength) return text;
|
|
57
|
-
}
|
|
58
|
-
const fallback = doc.querySelector('main')
|
|
59
|
-
|| doc.querySelector('#app')
|
|
60
|
-
|| doc.body;
|
|
61
|
-
if (!fallback) return '';
|
|
62
|
-
return ((fallback.innerText || fallback.textContent) || '').trim();
|
|
63
|
-
}
|
|
64
|
-
|
|
65
|
-
// Pure: count `<img>` elements whose src looks like a real xiaoe-hosted
|
|
66
|
-
// asset. `data:` URIs and non-xiaoe CDNs (avatars, ads) are excluded.
|
|
67
|
-
export function countXiaoeImages(doc) {
|
|
68
|
-
let count = 0;
|
|
69
|
-
const imgs = doc.querySelectorAll('img');
|
|
70
|
-
for (let i = 0; i < imgs.length; i += 1) {
|
|
71
|
-
const src = imgs[i].getAttribute('src') || imgs[i].src || '';
|
|
72
|
-
if (!src) continue;
|
|
73
|
-
if (src.startsWith('data:')) continue;
|
|
74
|
-
if (!src.includes('xiaoe')) continue;
|
|
75
|
-
count += 1;
|
|
76
|
-
}
|
|
77
|
-
return count;
|
|
78
|
-
}
|
|
79
|
-
|
|
80
|
-
export function requireXiaoePageUrl(value, commandName) {
|
|
81
|
-
const raw = typeof value === 'string' ? value.trim() : '';
|
|
82
|
-
if (!raw) {
|
|
83
|
-
throw new ArgumentError('url is required (positional)');
|
|
84
|
-
}
|
|
85
|
-
let parsed;
|
|
86
|
-
try {
|
|
87
|
-
parsed = new URL(raw);
|
|
88
|
-
} catch {
|
|
89
|
-
throw new ArgumentError(
|
|
90
|
-
`invalid xiaoe URL: ${raw}`,
|
|
91
|
-
`Example: webcmd xiaoe ${commandName} https://appxxxx.h5.xet.citv.cn/p/course/ecourse/v_xxxxx`,
|
|
92
|
-
);
|
|
93
|
-
}
|
|
94
|
-
if (parsed.protocol !== 'https:') {
|
|
95
|
-
throw new ArgumentError(
|
|
96
|
-
`xiaoe URL must use https (got ${parsed.protocol.replace(':', '')})`,
|
|
97
|
-
`Example: webcmd xiaoe ${commandName} https://appxxxx.h5.xet.citv.cn/p/course/ecourse/v_xxxxx`,
|
|
98
|
-
);
|
|
99
|
-
}
|
|
100
|
-
const host = parsed.hostname.toLowerCase();
|
|
101
|
-
if (host !== 'h5.xet.citv.cn' && !host.endsWith('.h5.xet.citv.cn')) {
|
|
102
|
-
throw new ArgumentError(
|
|
103
|
-
`url must be on h5.xet.citv.cn or a shop subdomain (got ${parsed.hostname})`,
|
|
104
|
-
`Example: webcmd xiaoe ${commandName} https://appxxxx.h5.xet.citv.cn/p/course/ecourse/v_xxxxx`,
|
|
105
|
-
);
|
|
106
|
-
}
|
|
107
|
-
return parsed.toString();
|
|
108
|
-
}
|
|
109
|
-
|
|
110
|
-
export function buildContentScript() {
|
|
111
|
-
return `
|
|
112
|
-
(() => {
|
|
113
|
-
${pickContentText.toString()}
|
|
114
|
-
${countXiaoeImages.toString()}
|
|
115
|
-
const selectors = ${JSON.stringify(CONTENT_SELECTORS)};
|
|
116
|
-
const title = document.title || '';
|
|
117
|
-
const content = pickContentText(document, selectors, ${JSON.stringify(CONTENT_MIN_LENGTH)});
|
|
118
|
-
const imageCount = countXiaoeImages(document);
|
|
119
|
-
return [{
|
|
120
|
-
title,
|
|
121
|
-
content,
|
|
122
|
-
content_length: content.length,
|
|
123
|
-
image_count: imageCount,
|
|
124
|
-
}];
|
|
125
|
-
})()
|
|
126
|
-
`;
|
|
127
|
-
}
|
|
128
|
-
|
|
129
|
-
async function getXiaoeContent(page, args) {
|
|
130
|
-
const url = requireXiaoePageUrl(args.url, 'content');
|
|
131
|
-
let rows;
|
|
132
|
-
try {
|
|
133
|
-
await page.goto(url, { waitUntil: 'load', settleMs: 6000 });
|
|
134
|
-
rows = await page.evaluate(buildContentScript());
|
|
135
|
-
} catch (error) {
|
|
136
|
-
const message = error instanceof Error ? error.message : String(error);
|
|
137
|
-
throw new CommandExecutionError(
|
|
138
|
-
`Failed to extract xiaoe content: ${message}`,
|
|
139
|
-
'page may not have rendered or auth may be required',
|
|
140
|
-
);
|
|
141
|
-
}
|
|
142
|
-
if (!Array.isArray(rows) || rows.length === 0) {
|
|
143
|
-
throw new EmptyResultError(
|
|
144
|
-
'xiaoe/content',
|
|
145
|
-
'No rows returned from page evaluator (page structure may have changed)',
|
|
146
|
-
);
|
|
147
|
-
}
|
|
148
|
-
const row = rows[0];
|
|
149
|
-
if (!row || typeof row.content !== 'string' || row.content.length === 0) {
|
|
150
|
-
throw new EmptyResultError(
|
|
151
|
-
'xiaoe/content',
|
|
152
|
-
'No article content extracted — login session may have expired or the page renders an empty shell',
|
|
153
|
-
);
|
|
154
|
-
}
|
|
155
|
-
return rows;
|
|
156
|
-
}
|
|
157
|
-
|
|
158
|
-
export const contentCommand = cli({
|
|
159
|
-
site: 'xiaoe',
|
|
160
|
-
name: 'content',
|
|
161
|
-
access: 'read',
|
|
162
|
-
description: '提取小鹅通图文页面内容为文本',
|
|
163
|
-
domain: 'h5.xet.citv.cn',
|
|
164
|
-
strategy: Strategy.COOKIE,
|
|
165
|
-
browser: true,
|
|
166
|
-
args: [
|
|
167
|
-
{ name: 'url', required: true, positional: true, help: '页面 URL' },
|
|
168
|
-
],
|
|
169
|
-
columns: ['title', 'content', 'content_length', 'image_count'],
|
|
170
|
-
func: getXiaoeContent,
|
|
171
|
-
});
|
|
172
|
-
|
|
173
|
-
export const __test__ = {
|
|
174
|
-
buildContentScript,
|
|
175
|
-
};
|
package/clis/xiaoe/courses.js
DELETED
|
@@ -1,127 +0,0 @@
|
|
|
1
|
-
// Xiaoe (小鹅通) purchased-courses list — pulls "已购内容" tab cards from
|
|
2
|
-
// `study.xiaoe-tech.com`.
|
|
3
|
-
//
|
|
4
|
-
// Replaces the legacy `pipeline:[]` form. The in-page extraction logic
|
|
5
|
-
// (Vue `__vue__.$parent` walk to match a card title back to the original
|
|
6
|
-
// purchase entry) is kept byte-for-byte — Xiaoe's purchase list is not
|
|
7
|
-
// exposed as a public JSON endpoint, and Vue's private runtime tree is
|
|
8
|
-
// the only stable hook. JSDOM cannot reproduce the Vue runtime, so
|
|
9
|
-
// rewriting the IIFE without live verify would be silent-failure risk.
|
|
10
|
-
//
|
|
11
|
-
// What changes:
|
|
12
|
-
// - `func` form + `Strategy.COOKIE` + `browser:true`.
|
|
13
|
-
// - Typed errors: `EmptyResultError` when zero card rows are found
|
|
14
|
-
// (almost always means the cookie expired); `CommandExecutionError`
|
|
15
|
-
// when `page.evaluate` rejects.
|
|
16
|
-
// - One pure helper (`buildCourseUrl`) is extracted as a module-level
|
|
17
|
-
// export; the in-page IIFE embeds it via `${fn.toString()}` so the
|
|
18
|
-
// live and test paths share one source of truth. The helper covers
|
|
19
|
-
// the three URL fallbacks the legacy code had inline:
|
|
20
|
-
// 1. `entry.h5_url` if present
|
|
21
|
-
// 2. `entry.url` if present
|
|
22
|
-
// 3. otherwise build from `app_id` + `resource_id` + `resource_type`
|
|
23
|
-
// (column course `resource_type === 6` gets the `/v1/course/column/`
|
|
24
|
-
// path, everything else gets `/p/course/ecourse/`)
|
|
25
|
-
|
|
26
|
-
import { cli, Strategy } from '@agentrhq/webcmd/registry';
|
|
27
|
-
import { CommandExecutionError, EmptyResultError } from '@agentrhq/webcmd/errors';
|
|
28
|
-
|
|
29
|
-
// Pure: derive the canonical course URL for a single purchase entry.
|
|
30
|
-
// Returns '' when `entry` is missing the fields we'd need to construct
|
|
31
|
-
// any of the three forms — never makes up a partial URL.
|
|
32
|
-
export function buildCourseUrl(entry) {
|
|
33
|
-
if (!entry) return '';
|
|
34
|
-
if (entry.h5_url) return entry.h5_url;
|
|
35
|
-
if (entry.url) return entry.url;
|
|
36
|
-
if (entry.app_id && entry.resource_id) {
|
|
37
|
-
const base = 'https://' + entry.app_id + '.h5.xet.citv.cn';
|
|
38
|
-
if (entry.resource_type === 6) {
|
|
39
|
-
return base + '/v1/course/column/' + entry.resource_id + '?type=3';
|
|
40
|
-
}
|
|
41
|
-
return base + '/p/course/ecourse/' + entry.resource_id;
|
|
42
|
-
}
|
|
43
|
-
return '';
|
|
44
|
-
}
|
|
45
|
-
|
|
46
|
-
export function buildCoursesScript() {
|
|
47
|
-
return `(async () => {
|
|
48
|
-
${buildCourseUrl.toString()}
|
|
49
|
-
// 切换到「内容」tab
|
|
50
|
-
var tabs = document.querySelectorAll('span, div');
|
|
51
|
-
for (var i = 0; i < tabs.length; i++) {
|
|
52
|
-
if (tabs[i].children.length === 0 && tabs[i].textContent.trim() === '内容') {
|
|
53
|
-
tabs[i].click();
|
|
54
|
-
break;
|
|
55
|
-
}
|
|
56
|
-
}
|
|
57
|
-
await new Promise(function(r) { setTimeout(r, 2000); });
|
|
58
|
-
|
|
59
|
-
// 匹配课程卡片标题与 Vue 数据
|
|
60
|
-
function matchEntry(title, vm, depth) {
|
|
61
|
-
if (!vm || depth > 5) return null;
|
|
62
|
-
var d = vm.$data || {};
|
|
63
|
-
for (var k in d) {
|
|
64
|
-
if (!Array.isArray(d[k])) continue;
|
|
65
|
-
for (var j = 0; j < d[k].length; j++) {
|
|
66
|
-
var e = d[k][j];
|
|
67
|
-
if (!e || typeof e !== 'object') continue;
|
|
68
|
-
var t = e.title || e.resource_name || '';
|
|
69
|
-
if (t && title.includes(t.substring(0, 10))) return e;
|
|
70
|
-
}
|
|
71
|
-
}
|
|
72
|
-
return vm.$parent ? matchEntry(title, vm.$parent, depth + 1) : null;
|
|
73
|
-
}
|
|
74
|
-
|
|
75
|
-
var cards = document.querySelectorAll('.course-card-list');
|
|
76
|
-
var results = [];
|
|
77
|
-
for (var c = 0; c < cards.length; c++) {
|
|
78
|
-
var titleEl = cards[c].querySelector('.card-title-box');
|
|
79
|
-
var title = titleEl ? titleEl.textContent.trim() : '';
|
|
80
|
-
if (!title) continue;
|
|
81
|
-
var entry = matchEntry(title, cards[c].__vue__, 0);
|
|
82
|
-
results.push({
|
|
83
|
-
title: title,
|
|
84
|
-
shop: entry ? (entry.shop_name || entry.app_name || '') : '',
|
|
85
|
-
url: entry ? buildCourseUrl(entry) : '',
|
|
86
|
-
});
|
|
87
|
-
}
|
|
88
|
-
return results;
|
|
89
|
-
})()`;
|
|
90
|
-
}
|
|
91
|
-
|
|
92
|
-
async function getXiaoeCourses(page) {
|
|
93
|
-
let rows;
|
|
94
|
-
try {
|
|
95
|
-
await page.goto('https://study.xiaoe-tech.com/', { waitUntil: 'load', settleMs: 8000 });
|
|
96
|
-
rows = await page.evaluate(buildCoursesScript());
|
|
97
|
-
} catch (error) {
|
|
98
|
-
const message = error instanceof Error ? error.message : String(error);
|
|
99
|
-
throw new CommandExecutionError(
|
|
100
|
-
`Failed to list xiaoe courses: ${message}`,
|
|
101
|
-
'page may not have rendered or auth may be required',
|
|
102
|
-
);
|
|
103
|
-
}
|
|
104
|
-
if (!Array.isArray(rows) || rows.length === 0) {
|
|
105
|
-
throw new EmptyResultError(
|
|
106
|
-
'xiaoe/courses',
|
|
107
|
-
'No purchased courses found — login session may have expired or the "内容" tab has no items',
|
|
108
|
-
);
|
|
109
|
-
}
|
|
110
|
-
return rows;
|
|
111
|
-
}
|
|
112
|
-
|
|
113
|
-
export const coursesCommand = cli({
|
|
114
|
-
site: 'xiaoe',
|
|
115
|
-
name: 'courses',
|
|
116
|
-
access: 'read',
|
|
117
|
-
description: '列出已购小鹅通课程(含 URL 和店铺名)',
|
|
118
|
-
domain: 'study.xiaoe-tech.com',
|
|
119
|
-
strategy: Strategy.COOKIE,
|
|
120
|
-
browser: true,
|
|
121
|
-
columns: ['title', 'shop', 'url'],
|
|
122
|
-
func: getXiaoeCourses,
|
|
123
|
-
});
|
|
124
|
-
|
|
125
|
-
export const __test__ = {
|
|
126
|
-
buildCoursesScript,
|
|
127
|
-
};
|
package/clis/xiaoe/detail.js
DELETED
|
@@ -1,36 +0,0 @@
|
|
|
1
|
-
import { cli, Strategy } from '@agentrhq/webcmd/registry';
|
|
2
|
-
cli({
|
|
3
|
-
site: 'xiaoe',
|
|
4
|
-
name: 'detail',
|
|
5
|
-
access: 'read',
|
|
6
|
-
description: '小鹅通课程详情(名称、价格、学员数、店铺)',
|
|
7
|
-
domain: 'h5.xet.citv.cn',
|
|
8
|
-
strategy: Strategy.COOKIE,
|
|
9
|
-
args: [
|
|
10
|
-
{ name: 'url', required: true, positional: true, help: '课程页面 URL' },
|
|
11
|
-
],
|
|
12
|
-
columns: ['name', 'price', 'original_price', 'user_count', 'shop_name'],
|
|
13
|
-
pipeline: [
|
|
14
|
-
{ navigate: '${{ args.url }}' },
|
|
15
|
-
{ wait: 5 },
|
|
16
|
-
{ evaluate: `(() => {
|
|
17
|
-
var vm = (document.querySelector('#app') || {}).__vue__;
|
|
18
|
-
if (!vm || !vm.$store) return [];
|
|
19
|
-
var core = vm.$store.state.coreInfo || {};
|
|
20
|
-
var goods = vm.$store.state.goodsInfo || {};
|
|
21
|
-
var shop = ((vm.$store.state.compositeInfo || {}).shop_conf) || {};
|
|
22
|
-
return [{
|
|
23
|
-
name: core.resource_name || '',
|
|
24
|
-
resource_id: core.resource_id || '',
|
|
25
|
-
resource_type: core.resource_type || '',
|
|
26
|
-
cover: core.resource_img || '',
|
|
27
|
-
user_count: core.user_count || 0,
|
|
28
|
-
price: goods.price ? (goods.price / 100).toFixed(2) : '0',
|
|
29
|
-
original_price: goods.line_price ? (goods.line_price / 100).toFixed(2) : '0',
|
|
30
|
-
is_free: goods.is_free || 0,
|
|
31
|
-
shop_name: shop.shop_name || '',
|
|
32
|
-
}];
|
|
33
|
-
})()
|
|
34
|
-
` },
|
|
35
|
-
],
|
|
36
|
-
});
|