@agentrhq/webcmd 0.1.2 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +183 -218
- package/cli-manifest.json +16247 -34913
- 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/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/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/daemon-client.d.ts +1 -0
- package/dist/src/browser/daemon-client.js +102 -50
- package/dist/src/browser/daemon-client.test.js +104 -19
- package/dist/src/browser/errors.js +11 -0
- package/dist/src/browser/protocol.d.ts +2 -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 +2 -2
- package/dist/src/cli.test.js +57 -57
- package/dist/src/commanderAdapter.test.js +19 -19
- 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.test.js +10 -1
- package/dist/src/doctor.js +7 -1
- package/dist/src/doctor.test.js +8 -1
- 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 +2 -0
- 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.test.js +2 -17
- 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 -1
- package/dist/src/manifest-types.d.ts +1 -1
- package/dist/src/node-network.test.js +2 -2
- 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.js +61 -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 +4 -1
- 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/generate-release-notes-cli.test.d.ts} +0 -0
- /package/dist/src/{weixin-download.test.d.ts → release-notes.test.d.ts} +0 -0
|
@@ -1,370 +0,0 @@
|
|
|
1
|
-
import fs from 'node:fs';
|
|
2
|
-
import os from 'node:os';
|
|
3
|
-
import path from 'node:path';
|
|
4
|
-
import { afterEach, describe, expect, it, vi } from 'vitest';
|
|
5
|
-
import { ArgumentError } from '@agentrhq/webcmd/errors';
|
|
6
|
-
import {
|
|
7
|
-
selectModel,
|
|
8
|
-
sendWithFile,
|
|
9
|
-
parseThinkingResponse,
|
|
10
|
-
parseDeepSeekConversationId,
|
|
11
|
-
pickResumeUrl,
|
|
12
|
-
} from './utils.js';
|
|
13
|
-
|
|
14
|
-
describe('deepseek parseDeepSeekConversationId', () => {
|
|
15
|
-
const id = '749e6bbd-6a45-4440-beaa-ae5238bf06d8';
|
|
16
|
-
|
|
17
|
-
it('returns a bare UUID unchanged', () => {
|
|
18
|
-
expect(parseDeepSeekConversationId(id)).toBe(id);
|
|
19
|
-
});
|
|
20
|
-
|
|
21
|
-
it('lowercases an upper-case UUID', () => {
|
|
22
|
-
expect(parseDeepSeekConversationId(id.toUpperCase())).toBe(id);
|
|
23
|
-
});
|
|
24
|
-
|
|
25
|
-
it('extracts the UUID from a full /a/chat/s/<id> URL', () => {
|
|
26
|
-
expect(parseDeepSeekConversationId(`https://chat.deepseek.com/a/chat/s/${id}`)).toBe(id);
|
|
27
|
-
expect(parseDeepSeekConversationId(`https://chat.deepseek.com/a/chat/s/${id}?from=share`)).toBe(id);
|
|
28
|
-
expect(parseDeepSeekConversationId(`/a/chat/s/${id}`)).toBe(id);
|
|
29
|
-
});
|
|
30
|
-
|
|
31
|
-
it('throws ArgumentError on empty input', () => {
|
|
32
|
-
expect(() => parseDeepSeekConversationId('')).toThrow(ArgumentError);
|
|
33
|
-
expect(() => parseDeepSeekConversationId(null)).toThrow(ArgumentError);
|
|
34
|
-
expect(() => parseDeepSeekConversationId(undefined)).toThrow(ArgumentError);
|
|
35
|
-
expect(() => parseDeepSeekConversationId(' ')).toThrow(ArgumentError);
|
|
36
|
-
});
|
|
37
|
-
|
|
38
|
-
it('throws ArgumentError on non-UUID input', () => {
|
|
39
|
-
expect(() => parseDeepSeekConversationId('not-an-id')).toThrow(ArgumentError);
|
|
40
|
-
expect(() => parseDeepSeekConversationId('123')).toThrow(ArgumentError);
|
|
41
|
-
// URL with the wrong path shape must not silently fall through to "use raw input".
|
|
42
|
-
expect(() => parseDeepSeekConversationId('https://chat.deepseek.com/somewhere/else')).toThrow(ArgumentError);
|
|
43
|
-
});
|
|
44
|
-
});
|
|
45
|
-
|
|
46
|
-
describe('deepseek parseThinkingResponse', () => {
|
|
47
|
-
it('returns plain response when no thinking header is present', () => {
|
|
48
|
-
const rawText = 'This is a regular response without thinking.';
|
|
49
|
-
const result = parseThinkingResponse(rawText);
|
|
50
|
-
|
|
51
|
-
expect(result).toEqual({
|
|
52
|
-
response: rawText,
|
|
53
|
-
thinking: null,
|
|
54
|
-
thinking_time: null,
|
|
55
|
-
});
|
|
56
|
-
});
|
|
57
|
-
|
|
58
|
-
it('parses English thinking header — all content after header is thinking', () => {
|
|
59
|
-
const rawText = 'Thought for 3.5 seconds\n\nLet me analyze this problem...\nFirst, I need to consider X.\nThen, Y.\n\nThe answer is 42.';
|
|
60
|
-
const result = parseThinkingResponse(rawText);
|
|
61
|
-
|
|
62
|
-
// Text-level parser no longer splits on \n\n; everything after header is thinking.
|
|
63
|
-
// DOM-level extraction in waitForResponse() handles the actual separation.
|
|
64
|
-
expect(result).toEqual({
|
|
65
|
-
response: '',
|
|
66
|
-
thinking: 'Let me analyze this problem...\nFirst, I need to consider X.\nThen, Y.\n\nThe answer is 42.',
|
|
67
|
-
thinking_time: '3.5',
|
|
68
|
-
});
|
|
69
|
-
});
|
|
70
|
-
|
|
71
|
-
it('parses Chinese thinking header — all content after header is thinking', () => {
|
|
72
|
-
const rawText = '已思考(用时 2.3 秒)\n\n让我分析这个问题...\n首先需要考虑X。\n然后是Y。\n\n答案是42。';
|
|
73
|
-
const result = parseThinkingResponse(rawText);
|
|
74
|
-
|
|
75
|
-
expect(result).toEqual({
|
|
76
|
-
response: '',
|
|
77
|
-
thinking: '让我分析这个问题...\n首先需要考虑X。\n然后是Y。\n\n答案是42。',
|
|
78
|
-
thinking_time: '2.3',
|
|
79
|
-
});
|
|
80
|
-
});
|
|
81
|
-
|
|
82
|
-
it('multi-paragraph thinking without final answer is not corrupted', () => {
|
|
83
|
-
const rawText = 'Thought for 1.2 seconds\n\nFirst paragraph.\n\nSecond paragraph.';
|
|
84
|
-
const result = parseThinkingResponse(rawText);
|
|
85
|
-
|
|
86
|
-
// Both paragraphs must stay in thinking; response is empty.
|
|
87
|
-
expect(result).toEqual({
|
|
88
|
-
response: '',
|
|
89
|
-
thinking: 'First paragraph.\n\nSecond paragraph.',
|
|
90
|
-
thinking_time: '1.2',
|
|
91
|
-
});
|
|
92
|
-
});
|
|
93
|
-
|
|
94
|
-
it('multi-paragraph final answer is not split by text parser', () => {
|
|
95
|
-
const rawText = 'Thought for 3 seconds\n\nreasoning\n\nAnswer para 1.\n\nAnswer para 2.';
|
|
96
|
-
const result = parseThinkingResponse(rawText);
|
|
97
|
-
|
|
98
|
-
// Text parser treats everything as thinking; DOM handles separation.
|
|
99
|
-
expect(result).toEqual({
|
|
100
|
-
response: '',
|
|
101
|
-
thinking: 'reasoning\n\nAnswer para 1.\n\nAnswer para 2.',
|
|
102
|
-
thinking_time: '3',
|
|
103
|
-
});
|
|
104
|
-
});
|
|
105
|
-
|
|
106
|
-
it('handles thinking without final response', () => {
|
|
107
|
-
const rawText = 'Thought for 1.2 seconds\n\nThinking process here...';
|
|
108
|
-
const result = parseThinkingResponse(rawText);
|
|
109
|
-
|
|
110
|
-
expect(result).toEqual({
|
|
111
|
-
response: '',
|
|
112
|
-
thinking: 'Thinking process here...',
|
|
113
|
-
thinking_time: '1.2',
|
|
114
|
-
});
|
|
115
|
-
});
|
|
116
|
-
|
|
117
|
-
it('returns null for empty input', () => {
|
|
118
|
-
const result = parseThinkingResponse('');
|
|
119
|
-
expect(result).toBeNull();
|
|
120
|
-
});
|
|
121
|
-
|
|
122
|
-
it('returns null for null input', () => {
|
|
123
|
-
const result = parseThinkingResponse(null);
|
|
124
|
-
expect(result).toBeNull();
|
|
125
|
-
});
|
|
126
|
-
});
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
describe('deepseek sendWithFile', () => {
|
|
130
|
-
const tempDirs = [];
|
|
131
|
-
|
|
132
|
-
afterEach(() => {
|
|
133
|
-
vi.restoreAllMocks();
|
|
134
|
-
while (tempDirs.length) {
|
|
135
|
-
fs.rmSync(tempDirs.pop(), { recursive: true, force: true });
|
|
136
|
-
}
|
|
137
|
-
});
|
|
138
|
-
|
|
139
|
-
it('prefers page.setFileInput over base64-in-evaluate when supported', async () => {
|
|
140
|
-
const dir = fs.mkdtempSync(path.join(os.tmpdir(), 'webcmd-deepseek-'));
|
|
141
|
-
tempDirs.push(dir);
|
|
142
|
-
const filePath = path.join(dir, 'report.txt');
|
|
143
|
-
fs.writeFileSync(filePath, 'hello');
|
|
144
|
-
|
|
145
|
-
const page = {
|
|
146
|
-
setFileInput: vi.fn().mockResolvedValue(undefined),
|
|
147
|
-
wait: vi.fn().mockResolvedValue(undefined),
|
|
148
|
-
evaluate: vi.fn()
|
|
149
|
-
.mockResolvedValueOnce(undefined) // sidebar collapse
|
|
150
|
-
.mockResolvedValueOnce(true) // waitForFilePreview
|
|
151
|
-
.mockResolvedValueOnce(true) // send button enabled check
|
|
152
|
-
.mockResolvedValueOnce({ ok: true }), // sendMessage
|
|
153
|
-
};
|
|
154
|
-
|
|
155
|
-
const result = await sendWithFile(page, filePath, 'summarize this');
|
|
156
|
-
|
|
157
|
-
expect(result).toEqual({ ok: true }); expect(page.setFileInput).toHaveBeenCalledWith([filePath], 'input[type="file"]');
|
|
158
|
-
});
|
|
159
|
-
|
|
160
|
-
it('fails closed when upload preview appears but send button never enables', async () => {
|
|
161
|
-
const dir = fs.mkdtempSync(path.join(os.tmpdir(), 'webcmd-deepseek-'));
|
|
162
|
-
tempDirs.push(dir);
|
|
163
|
-
const filePath = path.join(dir, 'report.txt');
|
|
164
|
-
fs.writeFileSync(filePath, 'hello');
|
|
165
|
-
|
|
166
|
-
const page = {
|
|
167
|
-
setFileInput: vi.fn().mockResolvedValue(undefined),
|
|
168
|
-
wait: vi.fn().mockResolvedValue(undefined),
|
|
169
|
-
evaluate: vi.fn()
|
|
170
|
-
.mockResolvedValueOnce(undefined) // sidebar collapse
|
|
171
|
-
.mockResolvedValueOnce(true) // waitForFilePreview
|
|
172
|
-
.mockResolvedValue(false), // send button never enables
|
|
173
|
-
};
|
|
174
|
-
|
|
175
|
-
const result = await sendWithFile(page, filePath, 'summarize this');
|
|
176
|
-
|
|
177
|
-
expect(result).toEqual({ ok: false, reason: 'send button did not enable after upload' });
|
|
178
|
-
expect(page.evaluate).toHaveBeenCalledTimes(17);
|
|
179
|
-
});
|
|
180
|
-
});
|
|
181
|
-
|
|
182
|
-
describe('deepseek selectModel', () => {
|
|
183
|
-
afterEach(() => {
|
|
184
|
-
vi.restoreAllMocks();
|
|
185
|
-
delete global.document;
|
|
186
|
-
});
|
|
187
|
-
|
|
188
|
-
it('fails expert selection when only one radio is present', async () => {
|
|
189
|
-
const instantRadio = {
|
|
190
|
-
getAttribute: vi.fn(() => 'true'),
|
|
191
|
-
click: vi.fn(),
|
|
192
|
-
};
|
|
193
|
-
global.document = {
|
|
194
|
-
querySelectorAll: vi.fn(() => [instantRadio]),
|
|
195
|
-
};
|
|
196
|
-
const page = {
|
|
197
|
-
evaluate: vi.fn(async (script) => eval(script)),
|
|
198
|
-
};
|
|
199
|
-
|
|
200
|
-
const result = await selectModel(page, 'expert');
|
|
201
|
-
|
|
202
|
-
expect(result).toEqual({ ok: false });
|
|
203
|
-
expect(instantRadio.click).not.toHaveBeenCalled();
|
|
204
|
-
});
|
|
205
|
-
|
|
206
|
-
it('selects the correct radio for each model', async () => {
|
|
207
|
-
const radios = [0, 1, 2].map(() => ({
|
|
208
|
-
getAttribute: vi.fn(() => 'false'),
|
|
209
|
-
click: vi.fn(),
|
|
210
|
-
}));
|
|
211
|
-
global.document = {
|
|
212
|
-
querySelectorAll: vi.fn(() => radios),
|
|
213
|
-
};
|
|
214
|
-
const page = {
|
|
215
|
-
evaluate: vi.fn(async (script) => eval(script)),
|
|
216
|
-
};
|
|
217
|
-
|
|
218
|
-
await selectModel(page, 'instant');
|
|
219
|
-
expect(radios[0].click).toHaveBeenCalled();
|
|
220
|
-
expect(radios[1].click).not.toHaveBeenCalled();
|
|
221
|
-
expect(radios[2].click).not.toHaveBeenCalled();
|
|
222
|
-
|
|
223
|
-
radios.forEach(r => r.click.mockClear());
|
|
224
|
-
await selectModel(page, 'expert');
|
|
225
|
-
expect(radios[1].click).toHaveBeenCalled();
|
|
226
|
-
|
|
227
|
-
radios.forEach(r => r.click.mockClear());
|
|
228
|
-
await selectModel(page, 'vision');
|
|
229
|
-
expect(radios[2].click).toHaveBeenCalled();
|
|
230
|
-
});
|
|
231
|
-
|
|
232
|
-
it('rejects unknown model names', async () => {
|
|
233
|
-
const radios = [0, 1, 2].map(() => ({
|
|
234
|
-
getAttribute: vi.fn(() => 'false'),
|
|
235
|
-
click: vi.fn(),
|
|
236
|
-
}));
|
|
237
|
-
global.document = {
|
|
238
|
-
querySelectorAll: vi.fn(() => radios),
|
|
239
|
-
};
|
|
240
|
-
const page = {
|
|
241
|
-
evaluate: vi.fn(async (script) => eval(script)),
|
|
242
|
-
};
|
|
243
|
-
|
|
244
|
-
const result = await selectModel(page, 'turbo');
|
|
245
|
-
expect(result).toEqual({ ok: false });
|
|
246
|
-
});
|
|
247
|
-
});
|
|
248
|
-
|
|
249
|
-
describe('deepseek sendWithFile Not allowed fallback', () => {
|
|
250
|
-
const tempDirs = [];
|
|
251
|
-
|
|
252
|
-
afterEach(() => {
|
|
253
|
-
vi.restoreAllMocks();
|
|
254
|
-
while (tempDirs.length) {
|
|
255
|
-
fs.rmSync(tempDirs.pop(), { recursive: true, force: true });
|
|
256
|
-
}
|
|
257
|
-
});
|
|
258
|
-
|
|
259
|
-
it('falls back to DataTransfer when setFileInput throws Not allowed', async () => {
|
|
260
|
-
const dir = fs.mkdtempSync(path.join(os.tmpdir(), 'webcmd-deepseek-'));
|
|
261
|
-
tempDirs.push(dir);
|
|
262
|
-
const filePath = path.join(dir, 'image.png');
|
|
263
|
-
fs.writeFileSync(filePath, 'fake-png');
|
|
264
|
-
|
|
265
|
-
const page = {
|
|
266
|
-
setFileInput: vi.fn().mockRejectedValue(new Error('Not allowed')),
|
|
267
|
-
wait: vi.fn().mockResolvedValue(undefined),
|
|
268
|
-
evaluate: vi.fn()
|
|
269
|
-
.mockResolvedValueOnce(undefined) // sidebar collapse
|
|
270
|
-
.mockResolvedValueOnce({ ok: true }) // DataTransfer fallback
|
|
271
|
-
.mockResolvedValueOnce(true) // waitForFilePreview
|
|
272
|
-
.mockResolvedValueOnce(true) // send button enabled
|
|
273
|
-
.mockResolvedValueOnce({ ok: true }),// sendMessage
|
|
274
|
-
};
|
|
275
|
-
|
|
276
|
-
const result = await sendWithFile(page, filePath, 'describe');
|
|
277
|
-
|
|
278
|
-
expect(page.setFileInput).toHaveBeenCalled();
|
|
279
|
-
expect(page.evaluate).toHaveBeenCalledTimes(5);
|
|
280
|
-
expect(result).toEqual({ ok: true });
|
|
281
|
-
});
|
|
282
|
-
|
|
283
|
-
it('does not treat send-button enablement alone as image upload proof', async () => {
|
|
284
|
-
const dir = fs.mkdtempSync(path.join(os.tmpdir(), 'webcmd-deepseek-'));
|
|
285
|
-
tempDirs.push(dir);
|
|
286
|
-
const filePath = path.join(dir, 'image.png');
|
|
287
|
-
fs.writeFileSync(filePath, 'fake-png');
|
|
288
|
-
|
|
289
|
-
const page = {
|
|
290
|
-
setFileInput: vi.fn().mockResolvedValue(undefined),
|
|
291
|
-
wait: vi.fn().mockResolvedValue(undefined),
|
|
292
|
-
evaluate: vi.fn()
|
|
293
|
-
.mockResolvedValueOnce(undefined) // sidebar collapse
|
|
294
|
-
.mockResolvedValue(false), // no filename / thumbnail preview
|
|
295
|
-
};
|
|
296
|
-
|
|
297
|
-
const result = await sendWithFile(page, filePath, 'describe');
|
|
298
|
-
|
|
299
|
-
expect(result).toEqual({ ok: false, reason: 'file preview did not appear' });
|
|
300
|
-
expect(page.evaluate.mock.calls[1][0]).toContain('img[src], canvas, video');
|
|
301
|
-
expect(page.evaluate.mock.calls[1][0]).not.toContain("aria-disabled') === 'false'");
|
|
302
|
-
});
|
|
303
|
-
});
|
|
304
|
-
|
|
305
|
-
describe('deepseek pickResumeUrl', () => {
|
|
306
|
-
function createPage() {
|
|
307
|
-
return {
|
|
308
|
-
wait: vi.fn().mockResolvedValue(undefined),
|
|
309
|
-
evaluate: vi.fn(),
|
|
310
|
-
};
|
|
311
|
-
}
|
|
312
|
-
|
|
313
|
-
it('returns the URL on the first attempt when the sidebar is already populated', async () => {
|
|
314
|
-
const page = createPage();
|
|
315
|
-
// First evaluate is the sidebar-expand no-op; subsequent ones look up the resume URL.
|
|
316
|
-
page.evaluate
|
|
317
|
-
.mockResolvedValueOnce(undefined)
|
|
318
|
-
.mockResolvedValueOnce('https://chat.deepseek.com/a/chat/s/recent-id');
|
|
319
|
-
|
|
320
|
-
const url = await pickResumeUrl(page);
|
|
321
|
-
|
|
322
|
-
expect(url).toBe('https://chat.deepseek.com/a/chat/s/recent-id');
|
|
323
|
-
// Sidebar expand + one resume lookup. No retry needed.
|
|
324
|
-
expect(page.evaluate).toHaveBeenCalledTimes(2);
|
|
325
|
-
expect(page.wait).toHaveBeenCalledTimes(1);
|
|
326
|
-
});
|
|
327
|
-
|
|
328
|
-
it('polls until the sidebar finishes loading and returns the late URL', async () => {
|
|
329
|
-
const page = createPage();
|
|
330
|
-
page.evaluate
|
|
331
|
-
.mockResolvedValueOnce(undefined) // sidebar-expand
|
|
332
|
-
.mockResolvedValueOnce(null) // attempt 1: nothing
|
|
333
|
-
.mockResolvedValueOnce(null) // attempt 2: nothing
|
|
334
|
-
.mockResolvedValueOnce('https://chat.deepseek.com/a/chat/s/late-id'); // attempt 3: ready
|
|
335
|
-
|
|
336
|
-
const url = await pickResumeUrl(page);
|
|
337
|
-
|
|
338
|
-
expect(url).toBe('https://chat.deepseek.com/a/chat/s/late-id');
|
|
339
|
-
expect(page.evaluate).toHaveBeenCalledTimes(4);
|
|
340
|
-
expect(page.wait).toHaveBeenCalledTimes(3);
|
|
341
|
-
});
|
|
342
|
-
|
|
343
|
-
it('returns null after exhausting all retries instead of falling through silently', async () => {
|
|
344
|
-
const page = createPage();
|
|
345
|
-
// Sidebar expand + 5 polling attempts, each returning null.
|
|
346
|
-
page.evaluate.mockResolvedValue(null);
|
|
347
|
-
|
|
348
|
-
const url = await pickResumeUrl(page);
|
|
349
|
-
|
|
350
|
-
expect(url).toBeNull();
|
|
351
|
-
expect(page.evaluate).toHaveBeenCalledTimes(6);
|
|
352
|
-
expect(page.wait).toHaveBeenCalledTimes(5);
|
|
353
|
-
});
|
|
354
|
-
|
|
355
|
-
it('embeds the pinned-section text matcher inside the resume lookup', async () => {
|
|
356
|
-
const page = createPage();
|
|
357
|
-
page.evaluate.mockResolvedValue(null);
|
|
358
|
-
|
|
359
|
-
await pickResumeUrl(page);
|
|
360
|
-
|
|
361
|
-
const lookupSrc = page.evaluate.mock.calls
|
|
362
|
-
.map(([js]) => js)
|
|
363
|
-
.find((js) => js.includes('firstElementChild'));
|
|
364
|
-
expect(lookupSrc, 'expected a resume-lookup evaluate call').toBeDefined();
|
|
365
|
-
// Pinned detection must be text-based on the section header (CSS-module class names are randomized per build).
|
|
366
|
-
expect(lookupSrc).toContain('置');
|
|
367
|
-
expect(lookupSrc).toContain('Pinned');
|
|
368
|
-
expect(lookupSrc).toContain('firstElementChild');
|
|
369
|
-
});
|
|
370
|
-
});
|
|
@@ -1,168 +0,0 @@
|
|
|
1
|
-
<!DOCTYPE html><html class="trancy-und"><head>
|
|
2
|
-
<title>北京火锅相关搜索结果推荐-大众点评网</title>
|
|
3
|
-
</head>
|
|
4
|
-
<body>
|
|
5
|
-
<div class="section Fix J-shop-search">
|
|
6
|
-
<div class="content-wrap">
|
|
7
|
-
<div class="shop-wrap">
|
|
8
|
-
<div class="content">
|
|
9
|
-
<div class="shop-list J_shop-list shop-all-list" id="shop-all-list">
|
|
10
|
-
<ul>
|
|
11
|
-
<li class="">
|
|
12
|
-
<div class="pic">
|
|
13
|
-
<a href="https://www.dianping.com/shop/H20FrTRI6kbXbgTu" data-shopid="H20FrTRI6kbXbgTu" title="">
|
|
14
|
-
<img title="芈重山老火锅(五道口店)" alt="芈重山老火锅(五道口店)" src="placeholder.png">
|
|
15
|
-
</a>
|
|
16
|
-
</div>
|
|
17
|
-
<div class="txt">
|
|
18
|
-
<div class="tit">
|
|
19
|
-
<a data-shopid="H20FrTRI6kbXbgTu" title="芈重山老火锅(五道口店)" href="https://www.dianping.com/shop/H20FrTRI6kbXbgTu">
|
|
20
|
-
<h4>芈重山老火锅(五道口店)</h4>
|
|
21
|
-
</a>
|
|
22
|
-
<div class="promo-icon J_promo_icon">
|
|
23
|
-
<a href="https://www.dianping.com/shop/H20FrTRI6kbXbgTu#promo=0" title="" class="ipromote icon-only" data-shopid="H20FrTRI6kbXbgTu"></a>
|
|
24
|
-
</div>
|
|
25
|
-
</div>
|
|
26
|
-
<div class="comment">
|
|
27
|
-
<div class="nebula_star">
|
|
28
|
-
<div class="star_icon">
|
|
29
|
-
<span class="star star_50 star_sml"></span>
|
|
30
|
-
<span class="star star_50 star_sml"></span>
|
|
31
|
-
<span class="star star_50 star_sml"></span>
|
|
32
|
-
<span class="star star_50 star_sml"></span>
|
|
33
|
-
<span class="star star_50 star_sml"></span>
|
|
34
|
-
</div>
|
|
35
|
-
</div>
|
|
36
|
-
<a href="https://www.dianping.com/shop/H20FrTRI6kbXbgTu#comment" class="review-num" data-shopid="H20FrTRI6kbXbgTu">
|
|
37
|
-
<b>21231</b>
|
|
38
|
-
条评价</a>
|
|
39
|
-
<em class="sep">|</em>
|
|
40
|
-
<a href="https://www.dianping.com/shop/H20FrTRI6kbXbgTu" class="mean-price" data-shopid="H20FrTRI6kbXbgTu">
|
|
41
|
-
人均
|
|
42
|
-
<b>¥109</b>
|
|
43
|
-
</a>
|
|
44
|
-
</div>
|
|
45
|
-
<div class="tag-addr">
|
|
46
|
-
<a href="https://www.dianping.com/beijing/ch10/g32733" data-shopid="H20FrTRI6kbXbgTu"><span class="tag">重庆火锅</span></a>
|
|
47
|
-
<em class="sep">|</em>
|
|
48
|
-
<a href="https://www.dianping.com/beijing/ch0/r1489" data-shopid="H20FrTRI6kbXbgTu"><span class="tag">五道口</span></a>
|
|
49
|
-
</div>
|
|
50
|
-
</div>
|
|
51
|
-
<div class="svr-info">
|
|
52
|
-
<a href="https://www.dianping.com/shop/H20FrTRI6kbXbgTu#promo=0" title="" data-shopid="H20FrTRI6kbXbgTu" class="tuan ">
|
|
53
|
-
<span class="tit">优惠:</span>此餐馆有优惠券
|
|
54
|
-
</a>
|
|
55
|
-
</div>
|
|
56
|
-
<div class="operate J_operate Hide">
|
|
57
|
-
<a href="javascript:void(0);" title="" class="o-nearby J_o-nearby" data-shopid="H20FrTRI6kbXbgTu">附近</a>
|
|
58
|
-
</div>
|
|
59
|
-
</li>
|
|
60
|
-
<li class="">
|
|
61
|
-
<div class="pic">
|
|
62
|
-
<a href="https://www.dianping.com/shop/H6uJDRHtNUreCoBa" data-shopid="H6uJDRHtNUreCoBa" title="">
|
|
63
|
-
<img title="百年前门铜锅涮肉(前门总店)" alt="百年前门铜锅涮肉(前门总店)" src="placeholder.png">
|
|
64
|
-
</a>
|
|
65
|
-
</div>
|
|
66
|
-
<div class="txt">
|
|
67
|
-
<div class="tit">
|
|
68
|
-
<a data-shopid="H6uJDRHtNUreCoBa" title="百年前门铜锅涮肉(前门总店)" href="https://www.dianping.com/shop/H6uJDRHtNUreCoBa">
|
|
69
|
-
<h4>百年前门铜锅涮肉(前门总店)</h4>
|
|
70
|
-
</a>
|
|
71
|
-
<div class="promo-icon J_promo_icon">
|
|
72
|
-
<a data-shopid="H6uJDRHtNUreCoBa" href="http://t.dianping.com/deal/671044080" title="百年前门铜锅涮肉!【春季新品】拔草必点超值 2-3人餐✨13店通用" class="igroup">
|
|
73
|
-
</a>
|
|
74
|
-
<a href="https://www.dianping.com/shop/H6uJDRHtNUreCoBa#promo=0" title="" class="ipromote icon-only" data-shopid="H6uJDRHtNUreCoBa"></a>
|
|
75
|
-
</div>
|
|
76
|
-
</div>
|
|
77
|
-
<div class="comment">
|
|
78
|
-
<div class="nebula_star">
|
|
79
|
-
<div class="star_icon">
|
|
80
|
-
<span class="star star_45 star_sml"></span>
|
|
81
|
-
<span class="star star_45 star_sml"></span>
|
|
82
|
-
<span class="star star_45 star_sml"></span>
|
|
83
|
-
<span class="star star_45 star_sml"></span>
|
|
84
|
-
<span class="star star_45 star_sml"></span>
|
|
85
|
-
</div>
|
|
86
|
-
</div>
|
|
87
|
-
<a href="https://www.dianping.com/shop/H6uJDRHtNUreCoBa#comment" class="review-num" data-shopid="H6uJDRHtNUreCoBa">
|
|
88
|
-
<b>15649</b>
|
|
89
|
-
条评价</a>
|
|
90
|
-
<em class="sep">|</em>
|
|
91
|
-
<a href="https://www.dianping.com/shop/H6uJDRHtNUreCoBa" class="mean-price" data-shopid="H6uJDRHtNUreCoBa">
|
|
92
|
-
人均
|
|
93
|
-
<b>¥81</b>
|
|
94
|
-
</a>
|
|
95
|
-
</div>
|
|
96
|
-
<div class="tag-addr">
|
|
97
|
-
<a href="https://www.dianping.com/beijing/ch10/g34277" data-shopid="H6uJDRHtNUreCoBa"><span class="tag">老北京火锅</span></a>
|
|
98
|
-
<em class="sep">|</em>
|
|
99
|
-
<a href="https://www.dianping.com/beijing/ch0/r1503" data-shopid="H6uJDRHtNUreCoBa"><span class="tag">前门/大栅栏</span></a>
|
|
100
|
-
</div>
|
|
101
|
-
</div>
|
|
102
|
-
<div class="svr-info">
|
|
103
|
-
<a href="https://www.dianping.com/shop/H6uJDRHtNUreCoBa#promo=0" title="" data-shopid="H6uJDRHtNUreCoBa" class="tuan privilege">
|
|
104
|
-
<span class="tit">优惠:</span>此餐馆有优惠券
|
|
105
|
-
</a>
|
|
106
|
-
</div>
|
|
107
|
-
<div class="operate J_operate Hide">
|
|
108
|
-
<a href="javascript:void(0);" title="" class="o-nearby J_o-nearby" data-shopid="H6uJDRHtNUreCoBa">附近</a>
|
|
109
|
-
</div>
|
|
110
|
-
</li>
|
|
111
|
-
<li class="">
|
|
112
|
-
<div class="pic">
|
|
113
|
-
<a href="https://www.dianping.com/shop/H7gQoQ1L5p7CoUEs" data-shopid="H7gQoQ1L5p7CoUEs" title="">
|
|
114
|
-
<img title="东来顺饭庄(前门大街店)" alt="东来顺饭庄(前门大街店)" src="placeholder.png">
|
|
115
|
-
</a>
|
|
116
|
-
</div>
|
|
117
|
-
<div class="txt">
|
|
118
|
-
<div class="tit">
|
|
119
|
-
<a data-shopid="H7gQoQ1L5p7CoUEs" title="东来顺饭庄(前门大街店)" href="https://www.dianping.com/shop/H7gQoQ1L5p7CoUEs">
|
|
120
|
-
<h4>东来顺饭庄(前门大街店)</h4>
|
|
121
|
-
</a>
|
|
122
|
-
<div class="promo-icon J_promo_icon">
|
|
123
|
-
<a data-shopid="H7gQoQ1L5p7CoUEs" href="http://t.dianping.com/deal/788879631" title="东来顺饭庄!仅售95元!价值100元的代金券1张,全场通用,可叠加使用10张,可免费使用包间。" class="igroup">
|
|
124
|
-
</a>
|
|
125
|
-
<a href="https://www.dianping.com/shop/H7gQoQ1L5p7CoUEs#promo=0" title="" class="ipromote icon-only" data-shopid="H7gQoQ1L5p7CoUEs"></a>
|
|
126
|
-
</div>
|
|
127
|
-
</div>
|
|
128
|
-
<div class="comment">
|
|
129
|
-
<div class="nebula_star">
|
|
130
|
-
<div class="star_icon">
|
|
131
|
-
<span class="star star_50 star_sml"></span>
|
|
132
|
-
<span class="star star_50 star_sml"></span>
|
|
133
|
-
<span class="star star_50 star_sml"></span>
|
|
134
|
-
<span class="star star_50 star_sml"></span>
|
|
135
|
-
<span class="star star_50 star_sml"></span>
|
|
136
|
-
</div>
|
|
137
|
-
</div>
|
|
138
|
-
<a href="https://www.dianping.com/shop/H7gQoQ1L5p7CoUEs#comment" class="review-num" data-shopid="H7gQoQ1L5p7CoUEs">
|
|
139
|
-
<b>21537</b>
|
|
140
|
-
条评价</a>
|
|
141
|
-
<em class="sep">|</em>
|
|
142
|
-
<a href="https://www.dianping.com/shop/H7gQoQ1L5p7CoUEs" class="mean-price" data-shopid="H7gQoQ1L5p7CoUEs">
|
|
143
|
-
人均
|
|
144
|
-
<b>¥124</b>
|
|
145
|
-
</a>
|
|
146
|
-
</div>
|
|
147
|
-
<div class="tag-addr">
|
|
148
|
-
<a href="https://www.dianping.com/beijing/ch10/g34277" data-shopid="H7gQoQ1L5p7CoUEs"><span class="tag">老北京火锅</span></a>
|
|
149
|
-
<em class="sep">|</em>
|
|
150
|
-
<a href="https://www.dianping.com/beijing/ch0/r1503" data-shopid="H7gQoQ1L5p7CoUEs"><span class="tag">前门/大栅栏</span></a>
|
|
151
|
-
</div>
|
|
152
|
-
</div>
|
|
153
|
-
<div class="svr-info">
|
|
154
|
-
<a href="https://www.dianping.com/shop/H7gQoQ1L5p7CoUEs#promo=0" title="" data-shopid="H7gQoQ1L5p7CoUEs" class="tuan privilege">
|
|
155
|
-
<span class="tit">优惠:</span>此餐馆有优惠券
|
|
156
|
-
</a>
|
|
157
|
-
</div>
|
|
158
|
-
<div class="operate J_operate Hide">
|
|
159
|
-
<a href="javascript:void(0);" title="" class="o-nearby J_o-nearby" data-shopid="H7gQoQ1L5p7CoUEs">附近</a>
|
|
160
|
-
</div>
|
|
161
|
-
</li>
|
|
162
|
-
</ul>
|
|
163
|
-
</div>
|
|
164
|
-
</div>
|
|
165
|
-
</div>
|
|
166
|
-
</div>
|
|
167
|
-
</div>
|
|
168
|
-
</body></html>
|
|
@@ -1,6 +0,0 @@
|
|
|
1
|
-
<!DOCTYPE html><html class="trancy-und"><head>
|
|
2
|
-
<title>【芈重山老火锅(五道口店)】电话_地址_价格_营业时间_五道口重庆火锅团购 - [undefined] - 大众点评网</title>
|
|
3
|
-
</head>
|
|
4
|
-
<body>
|
|
5
|
-
<div id="cocktail-root" class="cocktail-root"><div id="shop-head" class="shop-head shop-head-pc wx-view"><div id="pc-shop-head" class="wx-view"><div class="pc-shopInfo wx-view"><div class="leftPanel wx-view"><span class="shopName wx-text">芈重山老火锅(五道口店)</span><div class="smallPanel iconPanelPc wx-view"><div class="component-star"><div class="star-container star-50 wx-view"><div class="light wx-view">★</div><div class="light wx-view">★</div><div class="light wx-view">★</div><div class="light wx-view">★</div><div class="light wx-view">★</div><div class="star-score score-50 wx-view">4.8</div></div></div><div class="smallPanel wx-view"><span class="reviews wx-text">21241条</span><span class="price wx-text">¥109/人</span></div></div><div class="bottomPanel wx-view"><div class="wx-view"><span class="region wx-text">五道口</span><span class="category wx-text">重庆火锅</span></div></div><div class="middlePanel no-float wx-view"><span class="scoreText wx-text">口味:4.8 环境:4.8 服务:4.8 食材:4.9 </span></div><div class="rankPanel wx-view"><div class="rank-left wx-view"><img src="placeholder.png" class="rank-icon"><div class="rank-text wx-view">海淀区重庆火锅口味榜 · 第1名</div></div><div class="rank-right wx-view"><div class="rank-entry wx-view"></div></div></div><div class="shop-info wx-view"><div class="shopinfo wx-view"><div class="shopinf-wrap wx-view"><div class="key-services retina-boder-top wx-view"><div class="left-service wx-view"><div class="biz-title wx-view"><span class="biz-txt wx-text">营业中</span><span class="biz-time wx-text">11:00-次日02:00</span></div><div class="shop-tag-title wx-view"><div class="shop-feature wx-view"><span class="feature-txt wx-text">有包厢</span></div><div class="shop-feature wx-view"><span class="feature-txt wx-text">有大桌</span></div><div class="shop-feature wx-view"><span class="feature-txt wx-text">付费停车</span></div></div></div><div class="wx-view"><div class="entry wx-view"></div></div></div></div></div></div><div class="wx-view"><div id="shop-map" class="shopmap wx-view"><div class="shopmap-wrap wx-view"><div class="desc-content wx-view"><div class="desc-left wx-view"><div class="desc-info wx-view"><div class="iconAddress wx-view"></div><span class="addressText wx-text"> 成府路35号东源大厦2层东侧</span></div><div class="desc-addr wx-view"><span class="desc-addr-txt wx-text">距地铁13号线五道口站A北口步行90m</span></div></div><div class="desc-right wx-view"><div class="desc-car wx-view"><span class="tips wx-text">到店</span></div><div class="desc-phone wx-view"></div></div></div></div></div></div></div><div class="rightPanel wx-view"><img src="placeholder.png" class="shopPic fetchImgStart fecthImgEnd"><div class="picCount wx-view">7万+</div></div></div></div></div><div class="component-review-list-v2" id="review-list-new-pc"><div class="review-list-container wx-view"><div class="component-review-header"><div class="review-header wx-view"><div class="review-title wx-view"><span class="count-text wx-text">评价(21241)</span><span class="tip-text wx-text">1小时前有新增评价</span></div></div></div></div></div></div>
|
|
6
|
-
</body></html>
|
package/clis/dianping/auth.js
DELETED
|
@@ -1,49 +0,0 @@
|
|
|
1
|
-
import { AuthRequiredError, CommandExecutionError } from '@agentrhq/webcmd/errors';
|
|
2
|
-
import { registerSiteAuthCommands } from '../_shared/site-auth.js';
|
|
3
|
-
|
|
4
|
-
async function hasDianpingSessionCookie(page) {
|
|
5
|
-
const cookies = await page.getCookies({ url: 'https://www.dianping.com' });
|
|
6
|
-
return cookies.some(c => c.name === 'dper' && c.value);
|
|
7
|
-
}
|
|
8
|
-
|
|
9
|
-
async function verifyDianpingIdentity(page) {
|
|
10
|
-
if (!await hasDianpingSessionCookie(page)) {
|
|
11
|
-
throw new AuthRequiredError('dianping.com', 'Dianping dper cookie missing');
|
|
12
|
-
}
|
|
13
|
-
await page.goto('https://www.dianping.com/member/myinformation');
|
|
14
|
-
await page.wait(2);
|
|
15
|
-
const finalUrl = await page.evaluate(`location.href`);
|
|
16
|
-
if (/account\.dianping\.com\/(pc)?login/.test(String(finalUrl || ''))) {
|
|
17
|
-
throw new AuthRequiredError('dianping.com', `Dianping member page redirected to login: ${finalUrl}`);
|
|
18
|
-
}
|
|
19
|
-
const info = await page.evaluate(`
|
|
20
|
-
(() => {
|
|
21
|
-
const nicknameEl = document.querySelector('.user-name, .username, .nickname, .user-info .name');
|
|
22
|
-
const nickname = (nicknameEl?.textContent || '').trim();
|
|
23
|
-
const profileLink = Array.from(document.querySelectorAll('a[href*="/member/"]'))
|
|
24
|
-
.map(a => a.getAttribute('href') || '')
|
|
25
|
-
.find(h => /\\/member\\/\\d+/.test(h));
|
|
26
|
-
const uidMatch = String(profileLink || '').match(/\\/member\\/(\\d+)/);
|
|
27
|
-
return { user_id: uidMatch?.[1] || '', nickname };
|
|
28
|
-
})()
|
|
29
|
-
`);
|
|
30
|
-
if (!info?.user_id) {
|
|
31
|
-
throw new CommandExecutionError('Dianping member page rendered but no user_id link found — stale dper or layout drift');
|
|
32
|
-
}
|
|
33
|
-
return { user_id: String(info.user_id), nickname: String(info.nickname || '') };
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
registerSiteAuthCommands({
|
|
37
|
-
site: 'dianping',
|
|
38
|
-
domain: 'dianping.com',
|
|
39
|
-
loginUrl: 'https://account.dianping.com/pclogin',
|
|
40
|
-
columns: ['user_id', 'nickname'],
|
|
41
|
-
quickCheck: hasDianpingSessionCookie,
|
|
42
|
-
verify: verifyDianpingIdentity,
|
|
43
|
-
poll: async (page) => {
|
|
44
|
-
if (!await hasDianpingSessionCookie(page)) {
|
|
45
|
-
throw new AuthRequiredError('dianping.com', 'Waiting for Dianping dper cookie');
|
|
46
|
-
}
|
|
47
|
-
return verifyDianpingIdentity(page);
|
|
48
|
-
},
|
|
49
|
-
});
|