publishport-opencli 1.0.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/LICENSE +214 -0
- package/README.md +299 -0
- package/README.zh-CN.md +341 -0
- package/cli-manifest.json +51513 -0
- package/clis/12306/auth.js +25 -0
- package/clis/12306/me.js +9 -0
- package/clis/12306/orders.js +13 -0
- package/clis/12306/passengers.js +14 -0
- package/clis/12306/price.js +1 -0
- package/clis/12306/stations.js +1 -0
- package/clis/12306/train.js +1 -0
- package/clis/12306/trains.js +1 -0
- package/clis/12306/utils.js +1 -0
- package/clis/1688/assets.js +127 -0
- package/clis/1688/auth.js +1 -0
- package/clis/1688/download.js +1 -0
- package/clis/1688/item.js +21 -0
- package/clis/1688/search.js +129 -0
- package/clis/1688/shared.js +11 -0
- package/clis/1688/store.js +26 -0
- package/clis/1point3acres/auth.js +18 -0
- package/clis/1point3acres/digest.js +1 -0
- package/clis/1point3acres/forum.js +1 -0
- package/clis/1point3acres/forums.js +1 -0
- package/clis/1point3acres/hot.js +1 -0
- package/clis/1point3acres/latest.js +1 -0
- package/clis/1point3acres/notifications.js +1 -0
- package/clis/1point3acres/search.js +1 -0
- package/clis/1point3acres/thread.js +2 -0
- package/clis/1point3acres/user.js +1 -0
- package/clis/1point3acres/utils.js +6 -0
- package/clis/36kr/article.js +20 -0
- package/clis/36kr/hot.js +16 -0
- package/clis/36kr/news.js +1 -0
- package/clis/36kr/search.js +36 -0
- package/clis/51job/company.js +36 -0
- package/clis/51job/detail.js +35 -0
- package/clis/51job/hot.js +1 -0
- package/clis/51job/search.js +1 -0
- package/clis/51job/utils.js +21 -0
- package/clis/_atlassian/shared.js +21 -0
- package/clis/_shared/article/auth.js +16 -0
- package/clis/_shared/article/douban-md2draft.js +4 -0
- package/clis/_shared/article/format.js +1 -0
- package/clis/_shared/article/images.js +95 -0
- package/clis/_shared/article/login.js +1 -0
- package/clis/_shared/article/page-runtime.js +745 -0
- package/clis/_shared/article/publish.js +34 -0
- package/clis/_shared/common.js +1 -0
- package/clis/_shared/content-guard.js +1 -0
- package/clis/_shared/desktop-commands.js +1 -0
- package/clis/_shared/search-adapter.js +1 -0
- package/clis/_shared/site-auth.js +1 -0
- package/clis/_shared/token-auth.js +2 -0
- package/clis/_shared/video-publish.js +62 -0
- package/clis/aibase/news.js +31 -0
- package/clis/amazon/auth.js +19 -0
- package/clis/amazon/bestsellers.js +1 -0
- package/clis/amazon/discussion.js +20 -0
- package/clis/amazon/movers-shakers.js +1 -0
- package/clis/amazon/new-releases.js +1 -0
- package/clis/amazon/offer.js +29 -0
- package/clis/amazon/product.js +25 -0
- package/clis/amazon/rankings.js +68 -0
- package/clis/amazon/search.js +16 -0
- package/clis/amazon/shared.js +11 -0
- package/clis/antigravity/SKILL.md +38 -0
- package/clis/antigravity/_actions.js +201 -0
- package/clis/antigravity/audit-extras.js +78 -0
- package/clis/antigravity/delete.js +1 -0
- package/clis/antigravity/dump.js +1 -0
- package/clis/antigravity/extract-code.js +18 -0
- package/clis/antigravity/history.js +1 -0
- package/clis/antigravity/mark-read.js +1 -0
- package/clis/antigravity/model.js +90 -0
- package/clis/antigravity/new.js +9 -0
- package/clis/antigravity/read.js +10 -0
- package/clis/antigravity/rename.js +1 -0
- package/clis/antigravity/send.js +11 -0
- package/clis/antigravity/serve.js +97 -0
- package/clis/antigravity/status.js +1 -0
- package/clis/antigravity/storage.js +12 -0
- package/clis/antigravity/watch.js +6 -0
- package/clis/apple-podcasts/episodes.js +1 -0
- package/clis/apple-podcasts/search.js +1 -0
- package/clis/apple-podcasts/top.js +1 -0
- package/clis/apple-podcasts/utils.js +1 -0
- package/clis/archive/item.js +1 -0
- package/clis/archive/search.js +1 -0
- package/clis/archive/snapshots.js +1 -0
- package/clis/archive/wayback.js +1 -0
- package/clis/arxiv/author.js +1 -0
- package/clis/arxiv/paper.js +1 -0
- package/clis/arxiv/recent.js +1 -0
- package/clis/arxiv/search.js +1 -0
- package/clis/arxiv/utils.js +1 -0
- package/clis/autohome/__fixtures__/catalog.html +11 -0
- package/clis/autohome/__fixtures__/koubei.json +116 -0
- package/clis/autohome/brand.js +1 -0
- package/clis/autohome/score.js +1 -0
- package/clis/autohome/utils.js +1 -0
- package/clis/baidu-scholar/search.js +63 -0
- package/clis/baijiahao/article.js +1 -0
- package/clis/baijiahao/lists.js +1 -0
- package/clis/baijiahao/login.js +1 -0
- package/clis/baijiahao/publish.js +57 -0
- package/clis/baijiahao/stats.js +1 -0
- package/clis/baijiahao/whoami.js +1 -0
- package/clis/band/auth.js +29 -0
- package/clis/band/bands.js +37 -0
- package/clis/band/mentions.js +6 -0
- package/clis/band/post.js +76 -0
- package/clis/band/posts.js +50 -0
- package/clis/barchart/flow.js +70 -0
- package/clis/barchart/greeks.js +88 -0
- package/clis/barchart/options.js +61 -0
- package/clis/barchart/quote.js +87 -0
- package/clis/bbc/news.js +1 -0
- package/clis/bbc/topic.js +1 -0
- package/clis/bbc/utils.js +1 -0
- package/clis/bilibili/article.js +1 -0
- package/clis/bilibili/auth.js +1 -0
- package/clis/bilibili/categories.js +1 -0
- package/clis/bilibili/coin.js +1 -0
- package/clis/bilibili/comment-del.js +1 -0
- package/clis/bilibili/comment-like.js +1 -0
- package/clis/bilibili/comment.js +1 -0
- package/clis/bilibili/comments.js +1 -0
- package/clis/bilibili/dm-list.js +1 -0
- package/clis/bilibili/dm-read.js +1 -0
- package/clis/bilibili/dm-send.js +1 -0
- package/clis/bilibili/download.js +7 -0
- package/clis/bilibili/drafts.js +1 -0
- package/clis/bilibili/dynamic-post.js +24 -0
- package/clis/bilibili/dynamic.js +1 -0
- package/clis/bilibili/favorite-add.js +1 -0
- package/clis/bilibili/favorite.js +1 -0
- package/clis/bilibili/feed.js +2 -0
- package/clis/bilibili/follow.js +1 -0
- package/clis/bilibili/following.js +1 -0
- package/clis/bilibili/history.js +1 -0
- package/clis/bilibili/hot.js +15 -0
- package/clis/bilibili/like.js +1 -0
- package/clis/bilibili/me.js +1 -0
- package/clis/bilibili/partitions.js +1 -0
- package/clis/bilibili/ranking.js +1 -0
- package/clis/bilibili/search.js +1 -0
- package/clis/bilibili/stats.js +1 -0
- package/clis/bilibili/subtitle.js +21 -0
- package/clis/bilibili/summary.js +1 -0
- package/clis/bilibili/topics.js +1 -0
- package/clis/bilibili/unfollow.js +1 -0
- package/clis/bilibili/upload.js +1 -0
- package/clis/bilibili/user-videos.js +1 -0
- package/clis/bilibili/utils.js +50 -0
- package/clis/bilibili/video-drafts.js +1 -0
- package/clis/bilibili/video.js +1 -0
- package/clis/binance/asks.js +1 -0
- package/clis/binance/depth.js +1 -0
- package/clis/binance/gainers.js +1 -0
- package/clis/binance/klines.js +1 -0
- package/clis/binance/losers.js +1 -0
- package/clis/binance/pairs.js +1 -0
- package/clis/binance/price.js +1 -0
- package/clis/binance/prices.js +1 -0
- package/clis/binance/ticker.js +1 -0
- package/clis/binance/top.js +1 -0
- package/clis/binance/trades.js +1 -0
- package/clis/bloomberg/businessweek.js +12 -0
- package/clis/bloomberg/crypto.js +1 -0
- package/clis/bloomberg/economics.js +1 -0
- package/clis/bloomberg/feeds.js +1 -0
- package/clis/bloomberg/green.js +1 -0
- package/clis/bloomberg/industries.js +1 -0
- package/clis/bloomberg/main.js +1 -0
- package/clis/bloomberg/markets.js +1 -0
- package/clis/bloomberg/news.js +57 -0
- package/clis/bloomberg/opinions.js +1 -0
- package/clis/bloomberg/politics.js +1 -0
- package/clis/bloomberg/pursuits.js +1 -0
- package/clis/bloomberg/tech.js +1 -0
- package/clis/bloomberg/utils.js +17 -0
- package/clis/bluesky/post.js +1 -0
- package/clis/bluesky/shared.js +56 -0
- package/clis/bluesky/whoami.js +1 -0
- package/clis/booking/search.js +93 -0
- package/clis/boss/auth.js +13 -0
- package/clis/boss/batchgreet.js +1 -0
- package/clis/boss/chatlist.js +1 -0
- package/clis/boss/chatmsg.js +1 -0
- package/clis/boss/detail.js +1 -0
- package/clis/boss/exchange.js +1 -0
- package/clis/boss/greet.js +1 -0
- package/clis/boss/invite.js +4 -0
- package/clis/boss/joblist.js +1 -0
- package/clis/boss/mark.js +1 -0
- package/clis/boss/recommend.js +1 -0
- package/clis/boss/resume.js +90 -0
- package/clis/boss/search.js +1 -0
- package/clis/boss/send.js +1 -0
- package/clis/boss/stats.js +1 -0
- package/clis/boss/utils.js +161 -0
- package/clis/brave/search.js +23 -0
- package/clis/chaoxing/assignments.js +1 -0
- package/clis/chaoxing/auth.js +21 -0
- package/clis/chaoxing/exams.js +1 -0
- package/clis/chaoxing/utils.js +58 -0
- package/clis/chatgpt/ask.js +1 -0
- package/clis/chatgpt/auth.js +17 -0
- package/clis/chatgpt/detail.js +1 -0
- package/clis/chatgpt/history.js +1 -0
- package/clis/chatgpt/image.js +1 -0
- package/clis/chatgpt/model.js +1 -0
- package/clis/chatgpt/new.js +1 -0
- package/clis/chatgpt/project-file-add.js +1 -0
- package/clis/chatgpt/project-list.js +1 -0
- package/clis/chatgpt/read.js +1 -0
- package/clis/chatgpt/send.js +1 -0
- package/clis/chatgpt/status.js +1 -0
- package/clis/chatgpt/utils.js +1092 -0
- package/clis/chatgpt-app/ask.js +1 -0
- package/clis/chatgpt-app/ax.js +512 -0
- package/clis/chatgpt-app/model.js +1 -0
- package/clis/chatgpt-app/new.js +1 -0
- package/clis/chatgpt-app/read.js +1 -0
- package/clis/chatgpt-app/send.js +1 -0
- package/clis/chatgpt-app/status.js +1 -0
- package/clis/chatwise/ask.js +1 -0
- package/clis/chatwise/export.js +21 -0
- package/clis/chatwise/history.js +26 -0
- package/clis/chatwise/model.js +48 -0
- package/clis/chatwise/new.js +1 -0
- package/clis/chatwise/read.js +25 -0
- package/clis/chatwise/screenshot.js +1 -0
- package/clis/chatwise/send.js +1 -0
- package/clis/chatwise/status.js +1 -0
- package/clis/chatwise/utils.js +75 -0
- package/clis/chess/analyze.js +1 -0
- package/clis/chess/game.js +1 -0
- package/clis/chess/games.js +1 -0
- package/clis/chess/stats.js +1 -0
- package/clis/chess/utils.js +1 -0
- package/clis/claude/ask.js +4 -0
- package/clis/claude/auth.js +19 -0
- package/clis/claude/detail.js +1 -0
- package/clis/claude/history.js +1 -0
- package/clis/claude/new.js +1 -0
- package/clis/claude/read.js +1 -0
- package/clis/claude/send.js +1 -0
- package/clis/claude/status.js +1 -0
- package/clis/claude/utils.js +179 -0
- package/clis/cnblogs/article.js +1 -0
- package/clis/cnblogs/login.js +1 -0
- package/clis/cnblogs/stats.js +37 -0
- package/clis/cnblogs/whoami.js +1 -0
- package/clis/cnki/search.js +38 -0
- package/clis/codex/_actions.js +72 -0
- package/clis/codex/archive.js +1 -0
- package/clis/codex/ask.js +23 -0
- package/clis/codex/dump.js +1 -0
- package/clis/codex/export.js +12 -0
- package/clis/codex/extract-diff.js +28 -0
- package/clis/codex/history.js +1 -0
- package/clis/codex/model.js +118 -0
- package/clis/codex/new.js +1 -0
- package/clis/codex/pin.js +1 -0
- package/clis/codex/projects.js +1 -0
- package/clis/codex/read.js +16 -0
- package/clis/codex/rename.js +34 -0
- package/clis/codex/screenshot.js +1 -0
- package/clis/codex/send.js +16 -0
- package/clis/codex/sidebar.js +1 -0
- package/clis/codex/status.js +1 -0
- package/clis/coingecko/categories.js +1 -0
- package/clis/coingecko/coin.js +1 -0
- package/clis/coingecko/derivatives.js +1 -0
- package/clis/coingecko/exchanges.js +1 -0
- package/clis/coingecko/global.js +1 -0
- package/clis/coingecko/top.js +1 -0
- package/clis/coingecko/trending.js +1 -0
- package/clis/confluence/create.js +1 -0
- package/clis/confluence/page.js +1 -0
- package/clis/confluence/search.js +1 -0
- package/clis/confluence/shared.js +1 -0
- package/clis/confluence/update.js +1 -0
- package/clis/coupang/add-to-cart.js +86 -0
- package/clis/coupang/auth.js +16 -0
- package/clis/coupang/product.js +161 -0
- package/clis/coupang/search.js +385 -0
- package/clis/coupang/utils.js +1 -0
- package/clis/crates/crate.js +1 -0
- package/clis/crates/search.js +1 -0
- package/clis/crates/utils.js +1 -0
- package/clis/csdn/article.js +29 -0
- package/clis/csdn/columns.js +1 -0
- package/clis/csdn/login.js +1 -0
- package/clis/csdn/stats.js +71 -0
- package/clis/csdn/whoami.js +1 -0
- package/clis/cto51/article.js +1 -0
- package/clis/cto51/whoami.js +1 -0
- package/clis/ctrip/auth.js +1 -0
- package/clis/ctrip/flight.js +17 -0
- package/clis/ctrip/hotel-search.js +24 -0
- package/clis/ctrip/hotel-suggest.js +1 -0
- package/clis/ctrip/search.js +1 -0
- package/clis/ctrip/utils.js +119 -0
- package/clis/cursor/ask.js +22 -0
- package/clis/cursor/composer.js +12 -0
- package/clis/cursor/dump.js +1 -0
- package/clis/cursor/export.js +23 -0
- package/clis/cursor/extract-code.js +18 -0
- package/clis/cursor/history.js +26 -0
- package/clis/cursor/model.js +18 -0
- package/clis/cursor/new.js +1 -0
- package/clis/cursor/read.js +27 -0
- package/clis/cursor/screenshot.js +1 -0
- package/clis/cursor/send.js +12 -0
- package/clis/cursor/status.js +1 -0
- package/clis/dblp/author.js +1 -0
- package/clis/dblp/paper.js +1 -0
- package/clis/dblp/search.js +1 -0
- package/clis/dblp/utils.js +1 -0
- package/clis/dblp/venue.js +1 -0
- package/clis/deepseek/ask.js +1 -0
- package/clis/deepseek/auth.js +22 -0
- package/clis/deepseek/detail.js +1 -0
- package/clis/deepseek/history.js +1 -0
- package/clis/deepseek/new.js +1 -0
- package/clis/deepseek/read.js +1 -0
- package/clis/deepseek/send.js +50 -0
- package/clis/deepseek/status.js +1 -0
- package/clis/deepseek/utils.js +202 -0
- package/clis/defillama/protocol.js +1 -0
- package/clis/defillama/protocols.js +1 -0
- package/clis/defillama/utils.js +1 -0
- package/clis/devto/auth.js +9 -0
- package/clis/devto/latest.js +1 -0
- package/clis/devto/publish.js +17 -0
- package/clis/devto/read.js +3 -0
- package/clis/devto/stats.js +27 -0
- package/clis/devto/tag.js +1 -0
- package/clis/devto/top.js +1 -0
- package/clis/devto/user.js +1 -0
- package/clis/dianping/__fixtures__/search.html +168 -0
- package/clis/dianping/__fixtures__/shop.html +6 -0
- package/clis/dianping/auth.js +10 -0
- package/clis/dianping/cityResolver.js +4 -0
- package/clis/dianping/search.js +1 -0
- package/clis/dianping/shop.js +1 -0
- package/clis/dianping/utils.js +1 -0
- package/clis/dictionary/examples.js +1 -0
- package/clis/dictionary/search.js +1 -0
- package/clis/dictionary/synonyms.js +1 -0
- package/clis/discord-app/channels.js +1 -0
- package/clis/discord-app/delete.js +66 -0
- package/clis/discord-app/goto.js +1 -0
- package/clis/discord-app/members.js +21 -0
- package/clis/discord-app/read.js +1 -0
- package/clis/discord-app/search.js +29 -0
- package/clis/discord-app/send.js +10 -0
- package/clis/discord-app/servers.js +1 -0
- package/clis/discord-app/status.js +1 -0
- package/clis/discord-app/thread-read.js +1 -0
- package/clis/discord-app/threads.js +1 -0
- package/clis/discord-app/utils.js +226 -0
- package/clis/discord-web/auth.js +10 -0
- package/clis/discord-web/send.js +13 -0
- package/clis/dockerhub/image.js +1 -0
- package/clis/dockerhub/search.js +1 -0
- package/clis/dockerhub/utils.js +1 -0
- package/clis/dongchedi/__fixtures__/search.json +60 -0
- package/clis/dongchedi/__fixtures__/series-detail.json +911 -0
- package/clis/dongchedi/__fixtures__/series-score.json +1396 -0
- package/clis/dongchedi/koubei.js +1 -0
- package/clis/dongchedi/models.js +1 -0
- package/clis/dongchedi/score.js +1 -0
- package/clis/dongchedi/search.js +1 -0
- package/clis/dongchedi/series.js +1 -0
- package/clis/dongchedi/specs.js +1 -0
- package/clis/dongchedi/utils.js +1 -0
- package/clis/douban/article.js +53 -0
- package/clis/douban/auth.js +21 -0
- package/clis/douban/book-hot.js +1 -0
- package/clis/douban/download.js +1 -0
- package/clis/douban/marks.js +59 -0
- package/clis/douban/movie-hot.js +1 -0
- package/clis/douban/photos.js +1 -0
- package/clis/douban/reviews.js +53 -0
- package/clis/douban/search.js +1 -0
- package/clis/douban/subject.js +1 -0
- package/clis/douban/top250.js +50 -0
- package/clis/douban/utils.js +344 -0
- package/clis/doubao/ask.js +1 -0
- package/clis/doubao/auth.js +28 -0
- package/clis/doubao/detail.js +1 -0
- package/clis/doubao/history.js +1 -0
- package/clis/doubao/meeting-summary.js +1 -0
- package/clis/doubao/meeting-transcript.js +1 -0
- package/clis/doubao/new.js +1 -0
- package/clis/doubao/read.js +1 -0
- package/clis/doubao/send.js +1 -0
- package/clis/doubao/status.js +1 -0
- package/clis/doubao/utils.js +704 -0
- package/clis/doubao-app/ask.js +1 -0
- package/clis/doubao-app/dump.js +1 -0
- package/clis/doubao-app/new.js +1 -0
- package/clis/doubao-app/read.js +1 -0
- package/clis/doubao-app/screenshot.js +1 -0
- package/clis/doubao-app/send.js +1 -0
- package/clis/doubao-app/status.js +1 -0
- package/clis/doubao-app/utils.js +64 -0
- package/clis/douyin/_shared/browser-fetch.js +28 -0
- package/clis/douyin/_shared/creation-id.js +1 -0
- package/clis/douyin/_shared/evaluate-result.js +1 -0
- package/clis/douyin/_shared/imagex-upload.js +1 -0
- package/clis/douyin/_shared/public-api.js +1 -0
- package/clis/douyin/_shared/sts2.js +1 -0
- package/clis/douyin/_shared/text-extra.js +1 -0
- package/clis/douyin/_shared/timing.js +1 -0
- package/clis/douyin/_shared/tos-upload.js +5 -0
- package/clis/douyin/_shared/transcode.js +1 -0
- package/clis/douyin/_shared/types.js +1 -0
- package/clis/douyin/_shared/vod-upload.js +5 -0
- package/clis/douyin/activities.js +1 -0
- package/clis/douyin/auth.js +1 -0
- package/clis/douyin/collections.js +1 -0
- package/clis/douyin/delete.js +76 -0
- package/clis/douyin/draft.js +166 -0
- package/clis/douyin/drafts.js +1 -0
- package/clis/douyin/hashtag.js +1 -0
- package/clis/douyin/location.js +1 -0
- package/clis/douyin/profile.js +1 -0
- package/clis/douyin/publish-image.js +64 -0
- package/clis/douyin/publish.js +14 -0
- package/clis/douyin/search.js +51 -0
- package/clis/douyin/stats.js +1 -0
- package/clis/douyin/update.js +1 -0
- package/clis/douyin/user-videos.js +1 -0
- package/clis/douyin/videos.js +1 -0
- package/clis/duckduckgo/search.js +1 -0
- package/clis/duckduckgo/suggest.js +1 -0
- package/clis/eastmoney/_secid.js +1 -0
- package/clis/eastmoney/announcement.js +1 -0
- package/clis/eastmoney/article.js +1 -0
- package/clis/eastmoney/convertible.js +1 -0
- package/clis/eastmoney/etf.js +1 -0
- package/clis/eastmoney/holders.js +1 -0
- package/clis/eastmoney/hot-rank.js +30 -0
- package/clis/eastmoney/index-board.js +1 -0
- package/clis/eastmoney/kline.js +1 -0
- package/clis/eastmoney/kuaixun.js +1 -0
- package/clis/eastmoney/longhu.js +1 -0
- package/clis/eastmoney/money-flow.js +1 -0
- package/clis/eastmoney/northbound.js +1 -0
- package/clis/eastmoney/quote.js +1 -0
- package/clis/eastmoney/rank.js +1 -0
- package/clis/eastmoney/sectors.js +1 -0
- package/clis/eastmoney/whoami.js +1 -0
- package/clis/endoflife/product.js +1 -0
- package/clis/endoflife/utils.js +1 -0
- package/clis/facebook/__fixtures__/notifications-page.html +13 -0
- package/clis/facebook/add-friend.js +24 -0
- package/clis/facebook/auth.js +1 -0
- package/clis/facebook/comment.js +18 -0
- package/clis/facebook/events.js +26 -0
- package/clis/facebook/feed.js +209 -0
- package/clis/facebook/friends.js +24 -0
- package/clis/facebook/groups.js +32 -0
- package/clis/facebook/join-group.js +25 -0
- package/clis/facebook/like.js +29 -0
- package/clis/facebook/marketplace-inbox.js +34 -0
- package/clis/facebook/marketplace-listings.js +33 -0
- package/clis/facebook/memories.js +21 -0
- package/clis/facebook/notifications.js +31 -0
- package/clis/facebook/post.js +88 -0
- package/clis/facebook/profile.js +18 -0
- package/clis/facebook/search.js +22 -0
- package/clis/flathub/app.js +1 -0
- package/clis/flathub/search.js +1 -0
- package/clis/flathub/utils.js +1 -0
- package/clis/flomo/auth.js +22 -0
- package/clis/flomo/memos.js +13 -0
- package/clis/gemini/ask.js +1 -0
- package/clis/gemini/auth.js +14 -0
- package/clis/gemini/deep-research-result.js +4 -0
- package/clis/gemini/deep-research.js +1 -0
- package/clis/gemini/detail.js +1 -0
- package/clis/gemini/history.js +1 -0
- package/clis/gemini/image.js +3 -0
- package/clis/gemini/new.js +1 -0
- package/clis/gemini/read.js +1 -0
- package/clis/gemini/status.js +1 -0
- package/clis/gemini/utils.js +1234 -0
- package/clis/geogebra/add-circle.js +1 -0
- package/clis/geogebra/add-line.js +1 -0
- package/clis/geogebra/add-point.js +1 -0
- package/clis/geogebra/add-polygon.js +1 -0
- package/clis/geogebra/eval.js +1 -0
- package/clis/geogebra/hexagon.js +1 -0
- package/clis/geogebra/info.js +13 -0
- package/clis/geogebra/list.js +1 -0
- package/clis/geogebra/triangle.js +1 -0
- package/clis/geogebra/utils.js +99 -0
- package/clis/ghost/publish.js +1 -0
- package/clis/ghost/shared.js +1 -0
- package/clis/ghost/whoami.js +1 -0
- package/clis/gitee/auth.js +12 -0
- package/clis/gitee/index.js +1 -0
- package/clis/gitee/search.js +1 -0
- package/clis/gitee/trending.js +240 -0
- package/clis/gitee/user.js +71 -0
- package/clis/github/auth.js +7 -0
- package/clis/github-trending/repos.js +1 -0
- package/clis/google/news.js +1 -0
- package/clis/google/search.js +90 -0
- package/clis/google/suggest.js +1 -0
- package/clis/google/trends.js +1 -0
- package/clis/google/utils.js +1 -0
- package/clis/google-scholar/cite.js +20 -0
- package/clis/google-scholar/profile.js +36 -0
- package/clis/google-scholar/search.js +35 -0
- package/clis/goproxy/module.js +1 -0
- package/clis/goproxy/utils.js +1 -0
- package/clis/goproxy/versions.js +1 -0
- package/clis/gov-law/recent.js +1 -0
- package/clis/gov-law/search.js +14 -0
- package/clis/gov-law/shared.js +29 -0
- package/clis/gov-policy/__fixtures__/recent.html +16 -0
- package/clis/gov-policy/__fixtures__/search.html +41 -0
- package/clis/gov-policy/recent.js +8 -0
- package/clis/gov-policy/search.js +8 -0
- package/clis/gov-policy/utils.js +1 -0
- package/clis/grok/ask.js +1 -0
- package/clis/grok/auth.js +17 -0
- package/clis/grok/delete.js +1 -0
- package/clis/grok/detail.js +1 -0
- package/clis/grok/export-all.js +170 -0
- package/clis/grok/export-utils.js +1 -0
- package/clis/grok/export.js +106 -0
- package/clis/grok/history.js +1 -0
- package/clis/grok/image.js +119 -0
- package/clis/grok/image.test.ts +127 -0
- package/clis/grok/new.js +1 -0
- package/clis/grok/pin.js +1 -0
- package/clis/grok/read.js +1 -0
- package/clis/grok/send.js +1 -0
- package/clis/grok/status.js +1 -0
- package/clis/grok/utils.js +337 -0
- package/clis/guazi/__fixtures__/detail.html +7 -0
- package/clis/guazi/__fixtures__/list.html +5 -0
- package/clis/guazi/browse.js +1 -0
- package/clis/guazi/car.js +1 -0
- package/clis/guazi/utils.js +1 -0
- package/clis/hackernews/ask.js +1 -0
- package/clis/hackernews/auth.js +9 -0
- package/clis/hackernews/best.js +1 -0
- package/clis/hackernews/comment.js +61 -0
- package/clis/hackernews/jobs.js +1 -0
- package/clis/hackernews/new.js +1 -0
- package/clis/hackernews/read.js +11 -0
- package/clis/hackernews/search.js +1 -0
- package/clis/hackernews/show.js +1 -0
- package/clis/hackernews/submit.js +65 -0
- package/clis/hackernews/top.js +1 -0
- package/clis/hackernews/user.js +1 -0
- package/clis/hashnode/auth.js +11 -0
- package/clis/hashnode/publish.js +92 -0
- package/clis/hf/auth.js +12 -0
- package/clis/hf/datasets.js +1 -0
- package/clis/hf/models.js +1 -0
- package/clis/hf/paper.js +1 -0
- package/clis/hf/spaces.js +1 -0
- package/clis/hf/top.js +1 -0
- package/clis/homebrew/cask.js +1 -0
- package/clis/homebrew/formula.js +1 -0
- package/clis/homebrew/popular.js +1 -0
- package/clis/homebrew/utils.js +1 -0
- package/clis/huodongxing/events.js +1 -0
- package/clis/hupu/__fixtures__/hot-home.html +64 -0
- package/clis/hupu/auth.js +14 -0
- package/clis/hupu/detail.js +7 -0
- package/clis/hupu/hot.js +14 -0
- package/clis/hupu/like.js +1 -0
- package/clis/hupu/mentions.js +91 -0
- package/clis/hupu/reply.js +1 -0
- package/clis/hupu/search.js +1 -0
- package/clis/hupu/unlike.js +1 -0
- package/clis/hupu/utils.js +243 -0
- package/clis/imdb/person.js +140 -0
- package/clis/imdb/reviews.js +40 -0
- package/clis/imdb/search.js +113 -0
- package/clis/imdb/title.js +1 -0
- package/clis/imdb/top.js +1 -0
- package/clis/imdb/trending.js +1 -0
- package/clis/imdb/utils.js +162 -0
- package/clis/imooc/article.js +59 -0
- package/clis/imooc/login.js +1 -0
- package/clis/imooc/whoami.js +1 -0
- package/clis/indeed/job.js +20 -0
- package/clis/indeed/search.js +37 -0
- package/clis/indeed/utils.js +1 -0
- package/clis/infoq/article.js +19 -0
- package/clis/infoq/login.js +1 -0
- package/clis/infoq/whoami.js +1 -0
- package/clis/instagram/_shared/private-publish.js +75 -0
- package/clis/instagram/_shared/protocol-capture.js +180 -0
- package/clis/instagram/_shared/runtime-info.js +33 -0
- package/clis/instagram/auth.js +22 -0
- package/clis/instagram/collection-create.js +38 -0
- package/clis/instagram/collection-delete.js +72 -0
- package/clis/instagram/comment.js +26 -0
- package/clis/instagram/detail.js +2 -0
- package/clis/instagram/download.js +83 -0
- package/clis/instagram/explore.js +27 -0
- package/clis/instagram/follow.js +24 -0
- package/clis/instagram/followers.js +30 -0
- package/clis/instagram/following.js +74 -0
- package/clis/instagram/like.js +25 -0
- package/clis/instagram/note.js +162 -0
- package/clis/instagram/post.js +718 -0
- package/clis/instagram/profile.js +25 -0
- package/clis/instagram/reel.js +452 -0
- package/clis/instagram/save.js +25 -0
- package/clis/instagram/saved.js +37 -0
- package/clis/instagram/search.js +23 -0
- package/clis/instagram/story.js +21 -0
- package/clis/instagram/unfollow.js +21 -0
- package/clis/instagram/unlike.js +25 -0
- package/clis/instagram/unsave.js +25 -0
- package/clis/instagram/user.js +1 -0
- package/clis/jd/add-cart.js +22 -0
- package/clis/jd/auth.js +12 -0
- package/clis/jd/cart.js +59 -0
- package/clis/jd/detail.js +42 -0
- package/clis/jd/item.js +98 -0
- package/clis/jd/item.test.ts +517 -0
- package/clis/jd/reviews.js +31 -0
- package/clis/jd/search.js +42 -0
- package/clis/jianshu/article.js +1 -0
- package/clis/jianshu/login.js +1 -0
- package/clis/jianshu/notebooks.js +1 -0
- package/clis/jianshu/whoami.js +1 -0
- package/clis/jianyu/auth.js +28 -0
- package/clis/jianyu/detail.js +1 -0
- package/clis/jianyu/search.js +73 -0
- package/clis/jianyu/shared/china-bid-search.js +86 -0
- package/clis/jianyu/shared/procurement-contract.js +1 -0
- package/clis/jianyu/shared/procurement-detail.js +18 -0
- package/clis/jike/auth.js +19 -0
- package/clis/jike/comment.js +82 -0
- package/clis/jike/create.js +83 -0
- package/clis/jike/feed.js +32 -0
- package/clis/jike/like.js +38 -0
- package/clis/jike/notifications.js +115 -0
- package/clis/jike/post.js +33 -0
- package/clis/jike/repost.js +67 -0
- package/clis/jike/search.js +29 -0
- package/clis/jike/topic.js +20 -0
- package/clis/jike/user.js +19 -0
- package/clis/jike/utils.js +15 -0
- package/clis/jimeng/auth.js +13 -0
- package/clis/jimeng/generate.js +60 -0
- package/clis/jimeng/history.js +32 -0
- package/clis/jimeng/new.js +26 -0
- package/clis/jimeng/workspaces.js +22 -0
- package/clis/jira/attachments.js +1 -0
- package/clis/jira/comments.js +1 -0
- package/clis/jira/issue.js +1 -0
- package/clis/jira/links.js +1 -0
- package/clis/jira/search.js +1 -0
- package/clis/jira/shared.js +1 -0
- package/clis/juejin/article.js +5 -0
- package/clis/juejin/categories.js +1 -0
- package/clis/juejin/hot.js +1 -0
- package/clis/juejin/login.js +1 -0
- package/clis/juejin/recommend.js +1 -0
- package/clis/juejin/stats.js +53 -0
- package/clis/juejin/tags.js +1 -0
- package/clis/juejin/utils.js +1 -0
- package/clis/juejin/whoami.js +1 -0
- package/clis/ke/auth.js +14 -0
- package/clis/ke/chengjiao.js +45 -0
- package/clis/ke/ershoufang.js +50 -0
- package/clis/ke/utils.js +21 -0
- package/clis/ke/xiaoqu.js +45 -0
- package/clis/ke/zufang.js +50 -0
- package/clis/kimi/_utils.js +38 -0
- package/clis/kimi/audit-extras.js +64 -0
- package/clis/kimi/auth.js +17 -0
- package/clis/kimi/chat.js +77 -0
- package/clis/kimi/storage.js +14 -0
- package/clis/kimi/ui.js +89 -0
- package/clis/kimi/usage.js +51 -0
- package/clis/kuaishou/auth.js +1 -0
- package/clis/kuaishou/publish.js +53 -0
- package/clis/lesswrong/_helpers.js +9 -0
- package/clis/lesswrong/comments.js +9 -0
- package/clis/lesswrong/curated.js +5 -0
- package/clis/lesswrong/frontpage.js +5 -0
- package/clis/lesswrong/new.js +5 -0
- package/clis/lesswrong/read.js +5 -0
- package/clis/lesswrong/sequences.js +5 -0
- package/clis/lesswrong/shortform.js +5 -0
- package/clis/lesswrong/tag.js +5 -0
- package/clis/lesswrong/tags.js +5 -0
- package/clis/lesswrong/top-month.js +5 -0
- package/clis/lesswrong/top-week.js +5 -0
- package/clis/lesswrong/top-year.js +5 -0
- package/clis/lesswrong/top.js +5 -0
- package/clis/lesswrong/user-posts.js +5 -0
- package/clis/lesswrong/user.js +5 -0
- package/clis/lichess/top.js +1 -0
- package/clis/lichess/user.js +1 -0
- package/clis/lichess/utils.js +1 -0
- package/clis/linkedin/auth.js +27 -0
- package/clis/linkedin/comment.js +1 -0
- package/clis/linkedin/connect.js +244 -0
- package/clis/linkedin/create.js +113 -0
- package/clis/linkedin/follow.js +1 -0
- package/clis/linkedin/inbox.js +1 -0
- package/clis/linkedin/job-detail.js +40 -0
- package/clis/linkedin/jobs-preferences.js +34 -0
- package/clis/linkedin/like.js +1 -0
- package/clis/linkedin/notifications.js +1 -0
- package/clis/linkedin/people-search.js +1 -0
- package/clis/linkedin/post-analytics.js +1 -0
- package/clis/linkedin/post-comments.js +1 -0
- package/clis/linkedin/post-detail.js +1 -0
- package/clis/linkedin/posts-core.js +138 -0
- package/clis/linkedin/posts.js +1 -0
- package/clis/linkedin/profile-analytics.js +1 -0
- package/clis/linkedin/profile-api.js +218 -0
- package/clis/linkedin/profile-experience.js +1 -0
- package/clis/linkedin/profile-projects.js +1 -0
- package/clis/linkedin/profile-read.js +3 -0
- package/clis/linkedin/reply.js +1 -0
- package/clis/linkedin/repost.js +1 -0
- package/clis/linkedin/safe-send.js +155 -0
- package/clis/linkedin/salesnav-inbox.js +21 -0
- package/clis/linkedin/salesnav-message.js +33 -0
- package/clis/linkedin/salesnav-search.js +15 -0
- package/clis/linkedin/salesnav-thread.js +1 -0
- package/clis/linkedin/search-api.js +42 -0
- package/clis/linkedin/search.js +50 -0
- package/clis/linkedin/sent-invitations.js +46 -0
- package/clis/linkedin/services-read.js +57 -0
- package/clis/linkedin/shared.js +10 -0
- package/clis/linkedin/social-api.js +260 -0
- package/clis/linkedin/thread-snapshot.js +81 -0
- package/clis/linkedin/timeline.js +37 -0
- package/clis/linkedin-learning/auth.js +27 -0
- package/clis/linkedin-learning/course.js +17 -0
- package/clis/linkedin-learning/search.js +17 -0
- package/clis/linkedin-learning/trending.js +17 -0
- package/clis/linux-do/auth.js +20 -0
- package/clis/linux-do/categories.js +1 -0
- package/clis/linux-do/feed.js +19 -0
- package/clis/linux-do/search.js +1 -0
- package/clis/linux-do/tags.js +1 -0
- package/clis/linux-do/topic-content.js +28 -0
- package/clis/linux-do/topic.js +1 -0
- package/clis/linux-do/user-posts.js +1 -0
- package/clis/linux-do/user-topics.js +1 -0
- package/clis/lobsters/active.js +1 -0
- package/clis/lobsters/domain.js +1 -0
- package/clis/lobsters/hot.js +1 -0
- package/clis/lobsters/newest.js +1 -0
- package/clis/lobsters/read.js +11 -0
- package/clis/lobsters/tag.js +1 -0
- package/clis/maimai/auth.js +19 -0
- package/clis/maimai/search-talents.js +37 -0
- package/clis/manus/_utils.js +28 -0
- package/clis/manus/auth.js +20 -0
- package/clis/manus/connectors.js +4 -0
- package/clis/manus/credits.js +4 -0
- package/clis/manus/list.js +7 -0
- package/clis/manus/read.js +7 -0
- package/clis/manus/skills.js +4 -0
- package/clis/manus/status.js +8 -0
- package/clis/mastodon/post.js +1 -0
- package/clis/mastodon/shared.js +48 -0
- package/clis/mastodon/whoami.js +1 -0
- package/clis/maven/artifact.js +1 -0
- package/clis/maven/search.js +1 -0
- package/clis/maven/utils.js +1 -0
- package/clis/mdn/search.js +1 -0
- package/clis/medium/article.js +12 -0
- package/clis/medium/feed.js +1 -0
- package/clis/medium/login.js +1 -0
- package/clis/medium/search.js +1 -0
- package/clis/medium/stats.js +56 -0
- package/clis/medium/tag.js +1 -0
- package/clis/medium/user.js +1 -0
- package/clis/medium/utils.js +62 -0
- package/clis/medium/whoami.js +1 -0
- package/clis/mubu/doc.js +1 -0
- package/clis/mubu/docs.js +1 -0
- package/clis/mubu/notes.js +1 -0
- package/clis/mubu/recent.js +1 -0
- package/clis/mubu/search.js +1 -0
- package/clis/mubu/utils.js +31 -0
- package/clis/note/auth.js +12 -0
- package/clis/note/note-utils.js +2 -0
- package/clis/note/publish.js +17 -0
- package/clis/notebooklm/add-source.js +46 -0
- package/clis/notebooklm/auth.js +21 -0
- package/clis/notebooklm/create.js +1 -0
- package/clis/notebooklm/current.js +1 -0
- package/clis/notebooklm/generate-audio.js +1 -0
- package/clis/notebooklm/generate-slides.js +1 -0
- package/clis/notebooklm/get.js +1 -0
- package/clis/notebooklm/history.js +1 -0
- package/clis/notebooklm/list.js +1 -0
- package/clis/notebooklm/note-list.js +1 -0
- package/clis/notebooklm/notes-get.js +1 -0
- package/clis/notebooklm/open.js +1 -0
- package/clis/notebooklm/rpc.js +36 -0
- package/clis/notebooklm/shared.js +1 -0
- package/clis/notebooklm/source-fulltext.js +1 -0
- package/clis/notebooklm/source-get.js +1 -0
- package/clis/notebooklm/source-guide.js +1 -0
- package/clis/notebooklm/source-list.js +1 -0
- package/clis/notebooklm/status.js +1 -0
- package/clis/notebooklm/summary.js +1 -0
- package/clis/notebooklm/utils.js +172 -0
- package/clis/notebooklm/write-note.js +1 -0
- package/clis/nowcoder/auth.js +24 -0
- package/clis/nowcoder/comment.js +1 -0
- package/clis/nowcoder/comments.js +1 -0
- package/clis/nowcoder/companies.js +1 -0
- package/clis/nowcoder/creators.js +1 -0
- package/clis/nowcoder/delete.js +1 -0
- package/clis/nowcoder/detail.js +46 -0
- package/clis/nowcoder/dm-list.js +1 -0
- package/clis/nowcoder/dm-read.js +1 -0
- package/clis/nowcoder/dm-send.js +1 -0
- package/clis/nowcoder/drafts.js +1 -0
- package/clis/nowcoder/experience.js +20 -0
- package/clis/nowcoder/hot.js +1 -0
- package/clis/nowcoder/inbox.js +1 -0
- package/clis/nowcoder/jobs.js +1 -0
- package/clis/nowcoder/like.js +1 -0
- package/clis/nowcoder/my.js +1 -0
- package/clis/nowcoder/notifications.js +16 -0
- package/clis/nowcoder/papers.js +22 -0
- package/clis/nowcoder/post.js +1 -0
- package/clis/nowcoder/practice.js +21 -0
- package/clis/nowcoder/recommend.js +1 -0
- package/clis/nowcoder/referral.js +21 -0
- package/clis/nowcoder/salary.js +22 -0
- package/clis/nowcoder/search.js +31 -0
- package/clis/nowcoder/suggest.js +17 -0
- package/clis/nowcoder/topics.js +1 -0
- package/clis/nowcoder/trending.js +1 -0
- package/clis/nowcoder/utils.js +68 -0
- package/clis/npm/downloads.js +1 -0
- package/clis/npm/package.js +1 -0
- package/clis/npm/search.js +1 -0
- package/clis/npm/utils.js +1 -0
- package/clis/nuget/package.js +1 -0
- package/clis/nuget/search.js +1 -0
- package/clis/nuget/utils.js +1 -0
- package/clis/nvd/cve.js +1 -0
- package/clis/oeis/search.js +1 -0
- package/clis/oeis/sequence.js +1 -0
- package/clis/oeis/utils.js +1 -0
- package/clis/ones/common.js +23 -0
- package/clis/ones/enrich-tasks.js +1 -0
- package/clis/ones/login.js +2 -0
- package/clis/ones/logout.js +1 -0
- package/clis/ones/me.js +1 -0
- package/clis/ones/my-tasks.js +1 -0
- package/clis/ones/resolve-labels.js +1 -0
- package/clis/ones/task-helpers.js +1 -0
- package/clis/ones/task.js +1 -0
- package/clis/ones/tasks.js +1 -0
- package/clis/ones/token-info.js +1 -0
- package/clis/ones/worklog.js +14 -0
- package/clis/openalex/search.js +1 -0
- package/clis/openalex/utils.js +1 -0
- package/clis/openalex/work.js +1 -0
- package/clis/openfda/drug-label.js +1 -0
- package/clis/openfda/food-recall.js +1 -0
- package/clis/openfda/utils.js +1 -0
- package/clis/openreview/author.js +1 -0
- package/clis/openreview/paper.js +1 -0
- package/clis/openreview/reviews.js +4 -0
- package/clis/openreview/search.js +1 -0
- package/clis/openreview/utils.js +1 -0
- package/clis/openreview/venue.js +1 -0
- package/clis/oschina/article.js +1 -0
- package/clis/oschina/catalogs.js +1 -0
- package/clis/oschina/login.js +1 -0
- package/clis/oschina/stats.js +54 -0
- package/clis/oschina/whoami.js +1 -0
- package/clis/osv/query.js +1 -0
- package/clis/osv/utils.js +1 -0
- package/clis/osv/vulnerability.js +1 -0
- package/clis/packagist/package.js +1 -0
- package/clis/packagist/search.js +1 -0
- package/clis/packagist/utils.js +1 -0
- package/clis/paperreview/feedback.js +1 -0
- package/clis/paperreview/review.js +1 -0
- package/clis/paperreview/submit.js +1 -0
- package/clis/paperreview/utils.js +1 -0
- package/clis/pinterest/api.js +1 -0
- package/clis/pinterest/auth.js +1 -0
- package/clis/pinterest/boards.js +1 -0
- package/clis/pinterest/client.js +20 -0
- package/clis/pinterest/publish.js +13 -0
- package/clis/pixiv/auth.js +17 -0
- package/clis/pixiv/detail.js +1 -0
- package/clis/pixiv/download.js +1 -0
- package/clis/pixiv/illusts.js +1 -0
- package/clis/pixiv/ranking.js +26 -0
- package/clis/pixiv/search.js +1 -0
- package/clis/pixiv/user.js +1 -0
- package/clis/pixiv/utils.js +18 -0
- package/clis/powerchina/auth.js +17 -0
- package/clis/powerchina/search.js +1 -0
- package/clis/producthunt/browse.js +54 -0
- package/clis/producthunt/hot.js +64 -0
- package/clis/producthunt/posts.js +1 -0
- package/clis/producthunt/today.js +1 -0
- package/clis/producthunt/utils.js +1 -0
- package/clis/pubmed/article.js +1 -0
- package/clis/pubmed/author.js +1 -0
- package/clis/pubmed/citations.js +1 -0
- package/clis/pubmed/clinical-trial.js +1 -0
- package/clis/pubmed/journal.js +1 -0
- package/clis/pubmed/mesh.js +1 -0
- package/clis/pubmed/related.js +1 -0
- package/clis/pubmed/review.js +1 -0
- package/clis/pubmed/search.js +1 -0
- package/clis/pubmed/utils.js +1 -0
- package/clis/pypi/downloads.js +1 -0
- package/clis/pypi/package.js +1 -0
- package/clis/pypi/utils.js +1 -0
- package/clis/qiita/auth.js +1 -0
- package/clis/qiita/gql.js +32 -0
- package/clis/qiita/publish.js +7 -0
- package/clis/qiita/stats.js +37 -0
- package/clis/qoder/_utils.js +113 -0
- package/clis/qoder/composer.js +1 -0
- package/clis/qoder/history.js +25 -0
- package/clis/qoder/quest.js +1 -0
- package/clis/qoder/read.js +1 -0
- package/clis/qoder/status.js +1 -0
- package/clis/qoder/ui.js +59 -0
- package/clis/quark/auth.js +16 -0
- package/clis/quark/ls.js +1 -0
- package/clis/quark/mkdir.js +1 -0
- package/clis/quark/mv.js +1 -0
- package/clis/quark/rename.js +1 -0
- package/clis/quark/rm.js +1 -0
- package/clis/quark/save.js +1 -0
- package/clis/quark/share-tree.js +1 -0
- package/clis/quark/utils.js +13 -0
- package/clis/quora/create-answer.js +22 -0
- package/clis/quora/create-question.js +24 -0
- package/clis/quora/shared.js +43 -0
- package/clis/quora/whoami.js +1 -0
- package/clis/qwen/ask.js +1 -0
- package/clis/qwen/auth.js +17 -0
- package/clis/qwen/detail.js +1 -0
- package/clis/qwen/history.js +1 -0
- package/clis/qwen/image.js +31 -0
- package/clis/qwen/new.js +1 -0
- package/clis/qwen/read.js +1 -0
- package/clis/qwen/send.js +1 -0
- package/clis/qwen/status.js +1 -0
- package/clis/qwen/utils.js +185 -0
- package/clis/reddit/auth.js +17 -0
- package/clis/reddit/comment.js +36 -0
- package/clis/reddit/frontpage.js +40 -0
- package/clis/reddit/home.js +32 -0
- package/clis/reddit/hot.js +46 -0
- package/clis/reddit/popular.js +46 -0
- package/clis/reddit/read.js +398 -0
- package/clis/reddit/reply.js +56 -0
- package/clis/reddit/save.js +30 -0
- package/clis/reddit/saved.js +24 -0
- package/clis/reddit/search.js +51 -0
- package/clis/reddit/submit.js +42 -0
- package/clis/reddit/subreddit-info.js +29 -0
- package/clis/reddit/subreddit.js +52 -0
- package/clis/reddit/subscribe.js +29 -0
- package/clis/reddit/subscribed.js +68 -0
- package/clis/reddit/upvote.js +43 -0
- package/clis/reddit/upvoted.js +24 -0
- package/clis/reddit/user-comments.js +20 -0
- package/clis/reddit/user-posts.js +17 -0
- package/clis/reddit/user.js +20 -0
- package/clis/reddit/whoami.js +19 -0
- package/clis/rednote/auth.js +19 -0
- package/clis/rednote/comments.js +1 -0
- package/clis/rednote/download.js +1 -0
- package/clis/rednote/feed.js +1 -0
- package/clis/rednote/note.js +1 -0
- package/clis/rednote/notifications.js +67 -0
- package/clis/rednote/search.js +32 -0
- package/clis/rednote/user.js +1 -0
- package/clis/rest-countries/country.js +1 -0
- package/clis/rest-countries/region.js +1 -0
- package/clis/rest-countries/utils.js +1 -0
- package/clis/reuters/article-detail.js +1 -0
- package/clis/reuters/auth.js +39 -0
- package/clis/reuters/search.js +1 -0
- package/clis/reuters/utils.js +50 -0
- package/clis/rfc/rfc.js +1 -0
- package/clis/rfc/utils.js +1 -0
- package/clis/rubygems/gem.js +1 -0
- package/clis/rubygems/search.js +1 -0
- package/clis/rubygems/utils.js +1 -0
- package/clis/segmentfault/_signed-request.js +43 -0
- package/clis/segmentfault/article.js +3 -0
- package/clis/segmentfault/channels.js +1 -0
- package/clis/segmentfault/login.js +1 -0
- package/clis/segmentfault/stats.js +82 -0
- package/clis/segmentfault/tags.js +1 -0
- package/clis/segmentfault/whoami.js +1 -0
- package/clis/semanticscholar/citations.js +1 -0
- package/clis/semanticscholar/paper.js +1 -0
- package/clis/semanticscholar/recommendations.js +1 -0
- package/clis/semanticscholar/search.js +1 -0
- package/clis/semanticscholar/utils.js +1 -0
- package/clis/sinablog/article.js +1 -0
- package/clis/sinablog/hot.js +1 -0
- package/clis/sinablog/search.js +1 -0
- package/clis/sinablog/user.js +1 -0
- package/clis/sinablog/utils.js +153 -0
- package/clis/sinafinance/news.js +1 -0
- package/clis/sinafinance/rolling-news.js +20 -0
- package/clis/sinafinance/stock-rank.js +41 -0
- package/clis/sinafinance/stock.js +1 -0
- package/clis/slock/attachment-download.js +1 -0
- package/clis/slock/attachment-upload.js +34 -0
- package/clis/slock/attachment-url.js +1 -0
- package/clis/slock/auth-verify.js +1 -0
- package/clis/slock/bookmark-add.js +11 -0
- package/clis/slock/bookmark-list.js +10 -0
- package/clis/slock/bookmark-remove.js +7 -0
- package/clis/slock/channel-action.js +1 -0
- package/clis/slock/channel-archive.js +1 -0
- package/clis/slock/channel-create.js +1 -0
- package/clis/slock/channel-files.js +1 -0
- package/clis/slock/channel-info.js +1 -0
- package/clis/slock/channel-join.js +1 -0
- package/clis/slock/channel-leave.js +1 -0
- package/clis/slock/channel-list.js +1 -0
- package/clis/slock/channel-mark.js +1 -0
- package/clis/slock/channel-members.js +1 -0
- package/clis/slock/channel-unarchive.js +1 -0
- package/clis/slock/dm-list.js +1 -0
- package/clis/slock/errors.js +1 -0
- package/clis/slock/in-page.js +113 -0
- package/clis/slock/inbox-done.js +9 -0
- package/clis/slock/inbox-read-all.js +1 -0
- package/clis/slock/inbox.js +1 -0
- package/clis/slock/login.js +1 -0
- package/clis/slock/message-read.js +61 -0
- package/clis/slock/message-search.js +24 -0
- package/clis/slock/message-send.js +55 -0
- package/clis/slock/reaction-add.js +1 -0
- package/clis/slock/reaction-remove.js +1 -0
- package/clis/slock/resolve.js +1 -0
- package/clis/slock/server-list.js +9 -0
- package/clis/slock/server-use.js +18 -0
- package/clis/slock/shared.js +1 -0
- package/clis/slock/task-claim.js +14 -0
- package/clis/slock/task-convert.js +35 -0
- package/clis/slock/task-create.js +24 -0
- package/clis/slock/task-delete.js +9 -0
- package/clis/slock/task-get.js +11 -0
- package/clis/slock/task-list-server.js +12 -0
- package/clis/slock/task-list.js +14 -0
- package/clis/slock/task-status.js +19 -0
- package/clis/slock/task-unclaim.js +13 -0
- package/clis/slock/thread-done.js +1 -0
- package/clis/slock/thread-follow.js +1 -0
- package/clis/slock/thread-list.js +1 -0
- package/clis/slock/thread-state.js +1 -0
- package/clis/slock/thread-undone.js +1 -0
- package/clis/slock/thread-unfollow.js +1 -0
- package/clis/slock/unread-summary.js +18 -0
- package/clis/slock/whoami.js +1 -0
- package/clis/smzdm/search.js +71 -0
- package/clis/sohu/article.js +1 -0
- package/clis/sohu/attributes.js +1 -0
- package/clis/sohu/categories.js +1 -0
- package/clis/sohu/channels.js +1 -0
- package/clis/sohu/columns.js +1 -0
- package/clis/sohu/login.js +1 -0
- package/clis/sohu/mpbp.js +1 -0
- package/clis/sohu/stats.js +95 -0
- package/clis/sohu/topics.js +1 -0
- package/clis/sohu/whoami.js +1 -0
- package/clis/spotify/spotify.js +1 -0
- package/clis/spotify/utils.js +8 -0
- package/clis/stackoverflow/bounties.js +1 -0
- package/clis/stackoverflow/hot.js +1 -0
- package/clis/stackoverflow/read.js +13 -0
- package/clis/stackoverflow/related.js +1 -0
- package/clis/stackoverflow/search.js +1 -0
- package/clis/stackoverflow/tag.js +1 -0
- package/clis/stackoverflow/unanswered.js +1 -0
- package/clis/stackoverflow/user.js +1 -0
- package/clis/stackoverflow/utils.js +1 -0
- package/clis/steam/app.js +1 -0
- package/clis/steam/search.js +1 -0
- package/clis/steam/top-sellers.js +1 -0
- package/clis/steam/utils.js +1 -0
- package/clis/substack/auth.js +11 -0
- package/clis/substack/feed.js +1 -0
- package/clis/substack/post-utils.js +2 -0
- package/clis/substack/publication.js +1 -0
- package/clis/substack/publish.js +10 -0
- package/clis/substack/search.js +1 -0
- package/clis/substack/utils.js +108 -0
- package/clis/suno/auth.js +21 -0
- package/clis/suno/download.js +17 -0
- package/clis/suno/generate.js +4 -0
- package/clis/suno/list.js +14 -0
- package/clis/suno/status.js +1 -0
- package/clis/suno/utils.js +102 -0
- package/clis/taobao/add-cart.js +93 -0
- package/clis/taobao/auth.js +8 -0
- package/clis/taobao/cart.js +68 -0
- package/clis/taobao/detail.js +48 -0
- package/clis/taobao/reviews.js +52 -0
- package/clis/taobao/search.js +64 -0
- package/clis/tdx/hot-rank.js +25 -0
- package/clis/telegram/send.js +18 -0
- package/clis/telegram/shared.js +21 -0
- package/clis/telegram/whoami.js +1 -0
- package/clis/test-utils.js +1 -0
- package/clis/threads/post.js +152 -0
- package/clis/threads/shared.js +27 -0
- package/clis/threads/whoami.js +1 -0
- package/clis/ths/hot-rank.js +27 -0
- package/clis/tieba/hot.js +16 -0
- package/clis/tieba/posts.js +1 -0
- package/clis/tieba/read.js +84 -0
- package/clis/tieba/search.js +54 -0
- package/clis/tieba/utils.js +1 -0
- package/clis/tiktok/auth.js +30 -0
- package/clis/tiktok/comment.js +69 -0
- package/clis/tiktok/creator-videos.js +45 -0
- package/clis/tiktok/explore.js +76 -0
- package/clis/tiktok/follow.js +49 -0
- package/clis/tiktok/following.js +103 -0
- package/clis/tiktok/friends.js +79 -0
- package/clis/tiktok/like.js +19 -0
- package/clis/tiktok/live.js +79 -0
- package/clis/tiktok/notifications.js +77 -0
- package/clis/tiktok/profile.js +26 -0
- package/clis/tiktok/publish.js +82 -0
- package/clis/tiktok/save.js +15 -0
- package/clis/tiktok/search.js +24 -0
- package/clis/tiktok/unfollow.js +59 -0
- package/clis/tiktok/unlike.js +19 -0
- package/clis/tiktok/unsave.js +17 -0
- package/clis/tiktok/user.js +143 -0
- package/clis/tiktok/utils.js +272 -0
- package/clis/toutiao/article.js +1 -0
- package/clis/toutiao/articles.js +6 -0
- package/clis/toutiao/auth.js +50 -0
- package/clis/toutiao/hot.js +1 -0
- package/clis/toutiao/utils.js +2 -0
- package/clis/trae-cn/activity.js +1 -0
- package/clis/trae-cn/approve.js +1 -0
- package/clis/trae-cn/ask.js +1 -0
- package/clis/trae-cn/dump.js +1 -0
- package/clis/trae-cn/export.js +3 -0
- package/clis/trae-cn/model.js +1 -0
- package/clis/trae-cn/new.js +1 -0
- package/clis/trae-cn/read.js +1 -0
- package/clis/trae-cn/screenshot.js +1 -0
- package/clis/trae-cn/select-model.js +1 -0
- package/clis/trae-cn/send.js +1 -0
- package/clis/trae-cn/setup.js +1 -0
- package/clis/trae-cn/status.js +1 -0
- package/clis/trae-cn/targets.js +1 -0
- package/clis/trae-cn/utils.js +456 -0
- package/clis/trae-cn/watch.js +3 -0
- package/clis/trae-solo/_actions.js +41 -0
- package/clis/trae-solo/_fs.js +6 -0
- package/clis/trae-solo/_state.js +2 -0
- package/clis/trae-solo/automation.js +43 -0
- package/clis/trae-solo/history.js +15 -0
- package/clis/trae-solo/mode.js +31 -0
- package/clis/trae-solo/model.js +50 -0
- package/clis/trae-solo/renderer-storage.js +11 -0
- package/clis/trae-solo/settings.js +1 -0
- package/clis/trae-solo/skill-fs.js +1 -0
- package/clis/trae-solo/skill.js +81 -0
- package/clis/trae-solo/state-fs.js +2 -0
- package/clis/trae-solo/status.js +1 -0
- package/clis/trae-solo/task-fs.js +5 -0
- package/clis/trae-solo/user-rules.js +1 -0
- package/clis/trae-solo/workspaces-fs.js +1 -0
- package/clis/tumblr/auth.js +24 -0
- package/clis/tumblr/publish.js +14 -0
- package/clis/tvmaze/search.js +1 -0
- package/clis/tvmaze/show.js +1 -0
- package/clis/tvmaze/utils.js +1 -0
- package/clis/twitter/accept.js +116 -0
- package/clis/twitter/article.js +116 -0
- package/clis/twitter/auth.js +4 -0
- package/clis/twitter/block.js +62 -0
- package/clis/twitter/bookmark-folder.js +4 -0
- package/clis/twitter/bookmark-folders.js +4 -0
- package/clis/twitter/bookmark.js +44 -0
- package/clis/twitter/bookmarks.js +27 -0
- package/clis/twitter/delete.js +36 -0
- package/clis/twitter/device-follow.js +13 -0
- package/clis/twitter/dm-list.js +1 -0
- package/clis/twitter/dm-read.js +1 -0
- package/clis/twitter/dm-send.js +13 -0
- package/clis/twitter/dm-shared.js +6 -0
- package/clis/twitter/download.js +38 -0
- package/clis/twitter/follow-batch.js +43 -0
- package/clis/twitter/follow.js +39 -0
- package/clis/twitter/followers.js +59 -0
- package/clis/twitter/following.js +4 -0
- package/clis/twitter/hide-reply.js +57 -0
- package/clis/twitter/like.js +48 -0
- package/clis/twitter/likes.js +14 -0
- package/clis/twitter/list-add-batch.js +1 -0
- package/clis/twitter/list-add-core.js +35 -0
- package/clis/twitter/list-add.js +1 -0
- package/clis/twitter/list-batch-utils.js +1 -0
- package/clis/twitter/list-create.js +12 -0
- package/clis/twitter/list-delete.js +36 -0
- package/clis/twitter/list-remove-batch.js +1 -0
- package/clis/twitter/list-remove-core.js +127 -0
- package/clis/twitter/list-remove.js +1 -0
- package/clis/twitter/list-tweets.js +27 -0
- package/clis/twitter/lists.js +27 -0
- package/clis/twitter/notifications.js +4 -0
- package/clis/twitter/post.js +158 -0
- package/clis/twitter/profile.js +66 -0
- package/clis/twitter/quote.js +123 -0
- package/clis/twitter/reply-dm.js +112 -0
- package/clis/twitter/reply.js +97 -0
- package/clis/twitter/retweet.js +62 -0
- package/clis/twitter/schedule.js +96 -0
- package/clis/twitter/scheduled-delete.js +60 -0
- package/clis/twitter/scheduled-list.js +15 -0
- package/clis/twitter/scheduled-utils.js +18 -0
- package/clis/twitter/search.js +12 -0
- package/clis/twitter/shared.js +76 -0
- package/clis/twitter/thread.js +4 -0
- package/clis/twitter/timeline.js +4 -0
- package/clis/twitter/trending.js +18 -0
- package/clis/twitter/tweets.js +12 -0
- package/clis/twitter/unblock.js +45 -0
- package/clis/twitter/unbookmark.js +41 -0
- package/clis/twitter/unfollow.js +45 -0
- package/clis/twitter/unlike.js +48 -0
- package/clis/twitter/unretweet.js +62 -0
- package/clis/twitter/utils.js +55 -0
- package/clis/uisdc/news.js +25 -0
- package/clis/uiverse/_shared.js +257 -0
- package/clis/uiverse/code.js +1 -0
- package/clis/uiverse/preview.js +1 -0
- package/clis/upwork/auth.js +19 -0
- package/clis/upwork/detail.js +22 -0
- package/clis/upwork/feed.js +21 -0
- package/clis/upwork/search.js +21 -0
- package/clis/upwork/utils.js +1 -0
- package/clis/v2ex/auth.js +10 -0
- package/clis/v2ex/daily.js +41 -0
- package/clis/v2ex/hot.js +1 -0
- package/clis/v2ex/latest.js +1 -0
- package/clis/v2ex/me.js +58 -0
- package/clis/v2ex/member.js +1 -0
- package/clis/v2ex/node.js +1 -0
- package/clis/v2ex/nodes.js +1 -0
- package/clis/v2ex/notifications.js +40 -0
- package/clis/v2ex/replies.js +1 -0
- package/clis/v2ex/topic.js +1 -0
- package/clis/v2ex/user.js +1 -0
- package/clis/vk/post.js +1 -0
- package/clis/vk/shared.js +8 -0
- package/clis/vk/whoami.js +1 -0
- package/clis/wanfang/search.js +42 -0
- package/clis/web/read.js +260 -0
- package/clis/wechat-channels/auth.js +31 -0
- package/clis/wechat-channels/publish.js +298 -0
- package/clis/weibo/article.js +1 -0
- package/clis/weibo/auth.js +17 -0
- package/clis/weibo/comments.js +28 -0
- package/clis/weibo/delete.js +84 -0
- package/clis/weibo/favorites.js +27 -0
- package/clis/weibo/feed.js +33 -0
- package/clis/weibo/hot.js +17 -0
- package/clis/weibo/me.js +51 -0
- package/clis/weibo/post.js +46 -0
- package/clis/weibo/publish.js +98 -0
- package/clis/weibo/search.js +47 -0
- package/clis/weibo/user-posts.js +92 -0
- package/clis/weibo/user.js +37 -0
- package/clis/weibo/utils.js +16 -0
- package/clis/weixin/article.js +1 -0
- package/clis/weixin/create-draft.js +152 -0
- package/clis/weixin/download.js +100 -0
- package/clis/weixin/drafts.js +27 -0
- package/clis/weixin/login.js +1 -0
- package/clis/weixin/search.js +44 -0
- package/clis/weixin/stats.js +43 -0
- package/clis/weixin/whoami.js +1 -0
- package/clis/weread/ai-outline.js +2 -0
- package/clis/weread/auth.js +24 -0
- package/clis/weread/book-search.js +2 -0
- package/clis/weread/book.js +3 -0
- package/clis/weread/highlights.js +1 -0
- package/clis/weread/notebooks.js +1 -0
- package/clis/weread/notes.js +1 -0
- package/clis/weread/ranking.js +1 -0
- package/clis/weread/search.js +1 -0
- package/clis/weread/shelf.js +1 -0
- package/clis/weread/utils.js +67 -0
- package/clis/weread-official/book.js +1 -0
- package/clis/weread-official/discover.js +1 -0
- package/clis/weread-official/list-apis.js +1 -0
- package/clis/weread-official/notes.js +1 -0
- package/clis/weread-official/readdata.js +1 -0
- package/clis/weread-official/review.js +1 -0
- package/clis/weread-official/search.js +1 -0
- package/clis/weread-official/shelf.js +1 -0
- package/clis/weread-official/utils.js +1 -0
- package/clis/wikidata/entity.js +1 -0
- package/clis/wikidata/search.js +1 -0
- package/clis/wikidata/utils.js +1 -0
- package/clis/wikipedia/page.js +3 -0
- package/clis/wikipedia/random.js +1 -0
- package/clis/wikipedia/search.js +1 -0
- package/clis/wikipedia/summary.js +1 -0
- package/clis/wikipedia/trending.js +1 -0
- package/clis/wikipedia/utils.js +1 -0
- package/clis/wordpress/login.js +1 -0
- package/clis/wordpress/publish.js +1 -0
- package/clis/wordpress/shared.js +54 -0
- package/clis/wordpress/whoami.js +1 -0
- package/clis/woshipm/article.js +1 -0
- package/clis/woshipm/login.js +1 -0
- package/clis/woshipm/stats.js +52 -0
- package/clis/woshipm/whoami.js +1 -0
- package/clis/wttr/current.js +1 -0
- package/clis/wttr/forecast.js +1 -0
- package/clis/wttr/utils.js +1 -0
- package/clis/xianyu/auth.js +11 -0
- package/clis/xianyu/chat.js +1 -0
- package/clis/xianyu/im.js +240 -0
- package/clis/xianyu/inbox.js +1 -0
- package/clis/xianyu/item.js +97 -0
- package/clis/xianyu/messages.js +1 -0
- package/clis/xianyu/publish.js +245 -0
- package/clis/xianyu/reply.js +1 -0
- package/clis/xianyu/search.js +141 -0
- package/clis/xianyu/utils.js +1 -0
- package/clis/xiaoe/auth.js +10 -0
- package/clis/xiaoe/catalog.js +134 -0
- package/clis/xiaoe/content.js +16 -0
- package/clis/xiaoe/courses.js +43 -0
- package/clis/xiaoe/detail.js +19 -0
- package/clis/xiaoe/play-url.js +97 -0
- package/clis/xiaohongshu/ask.js +130 -0
- package/clis/xiaohongshu/auth.js +13 -0
- package/clis/xiaohongshu/collection-helpers.js +64 -0
- package/clis/xiaohongshu/comments.js +89 -0
- package/clis/xiaohongshu/creator-note-detail.js +80 -0
- package/clis/xiaohongshu/creator-notes-summary.js +1 -0
- package/clis/xiaohongshu/creator-notes.js +107 -0
- package/clis/xiaohongshu/creator-profile.js +13 -0
- package/clis/xiaohongshu/creator-stats.js +13 -0
- package/clis/xiaohongshu/delete-note.js +69 -0
- package/clis/xiaohongshu/download.js +200 -0
- package/clis/xiaohongshu/draft-clear.js +44 -0
- package/clis/xiaohongshu/draft-delete.js +37 -0
- package/clis/xiaohongshu/draft-open.js +1 -0
- package/clis/xiaohongshu/draft-utils.js +36 -0
- package/clis/xiaohongshu/drafts.js +1 -0
- package/clis/xiaohongshu/feed.js +38 -0
- package/clis/xiaohongshu/follow.js +75 -0
- package/clis/xiaohongshu/liked.js +1 -0
- package/clis/xiaohongshu/note-helpers.js +1 -0
- package/clis/xiaohongshu/note.js +32 -0
- package/clis/xiaohongshu/notifications.js +1 -0
- package/clis/xiaohongshu/publish-video.js +87 -0
- package/clis/xiaohongshu/publish.js +637 -0
- package/clis/xiaohongshu/saved.js +1 -0
- package/clis/xiaohongshu/search.js +194 -0
- package/clis/xiaohongshu/unfollow.js +98 -0
- package/clis/xiaohongshu/user-helpers.js +1 -0
- package/clis/xiaohongshu/user.js +30 -0
- package/clis/xiaoyuzhou/auth.js +3 -0
- package/clis/xiaoyuzhou/download.js +1 -0
- package/clis/xiaoyuzhou/episode.js +1 -0
- package/clis/xiaoyuzhou/podcast-episodes.js +1 -0
- package/clis/xiaoyuzhou/podcast.js +1 -0
- package/clis/xiaoyuzhou/transcript.js +1 -0
- package/clis/xiaoyuzhou/utils.js +1 -0
- package/clis/xueqiu/article.js +4 -0
- package/clis/xueqiu/auth.js +27 -0
- package/clis/xueqiu/comments.js +38 -0
- package/clis/xueqiu/danjuan-utils.js +84 -0
- package/clis/xueqiu/earnings-date.js +1 -0
- package/clis/xueqiu/events.js +17 -0
- package/clis/xueqiu/feed.js +1 -0
- package/clis/xueqiu/fund-holdings.js +1 -0
- package/clis/xueqiu/fund-snapshot.js +1 -0
- package/clis/xueqiu/groups.js +1 -0
- package/clis/xueqiu/hashtags.js +26 -0
- package/clis/xueqiu/hot-stock.js +1 -0
- package/clis/xueqiu/hot.js +1 -0
- package/clis/xueqiu/kline.js +1 -0
- package/clis/xueqiu/search.js +1 -0
- package/clis/xueqiu/stock.js +1 -0
- package/clis/xueqiu/stocks.js +13 -0
- package/clis/xueqiu/users.js +12 -0
- package/clis/xueqiu/utils.js +9 -0
- package/clis/xueqiu/watchlist.js +1 -0
- package/clis/yahoo/search.js +21 -0
- package/clis/yahoo-finance/quote.js +50 -0
- package/clis/yollomi/background.js +1 -0
- package/clis/yollomi/edit.js +1 -0
- package/clis/yollomi/face-swap.js +1 -0
- package/clis/yollomi/generate.js +1 -0
- package/clis/yollomi/models.js +1 -0
- package/clis/yollomi/object-remover.js +1 -0
- package/clis/yollomi/remove-bg.js +1 -0
- package/clis/yollomi/restore.js +1 -0
- package/clis/yollomi/try-on.js +1 -0
- package/clis/yollomi/upload.js +17 -0
- package/clis/yollomi/upscale.js +1 -0
- package/clis/yollomi/utils.js +16 -0
- package/clis/yollomi/video.js +1 -0
- package/clis/youdao/note.js +113 -0
- package/clis/youtube/auth.js +20 -0
- package/clis/youtube/channel.js +118 -0
- package/clis/youtube/comments.js +64 -0
- package/clis/youtube/feed.js +89 -0
- package/clis/youtube/history.js +87 -0
- package/clis/youtube/like.js +33 -0
- package/clis/youtube/playlist.js +47 -0
- package/clis/youtube/publish.js +56 -0
- package/clis/youtube/search.js +39 -0
- package/clis/youtube/subscribe.js +42 -0
- package/clis/youtube/subscriptions.js +26 -0
- package/clis/youtube/transcript-group.js +2 -0
- package/clis/youtube/transcript.js +417 -0
- package/clis/youtube/unlike.js +33 -0
- package/clis/youtube/unsubscribe.js +42 -0
- package/clis/youtube/utils.js +34 -0
- package/clis/youtube/video.js +96 -0
- package/clis/youtube/watch-later.js +41 -0
- package/clis/yuanbao/ask.js +145 -0
- package/clis/yuanbao/auth.js +23 -0
- package/clis/yuanbao/detail.js +1 -0
- package/clis/yuanbao/history.js +1 -0
- package/clis/yuanbao/new.js +16 -0
- package/clis/yuanbao/read.js +1 -0
- package/clis/yuanbao/send.js +1 -0
- package/clis/yuanbao/shared.js +127 -0
- package/clis/yuanbao/status.js +1 -0
- package/clis/yuque/article.js +1 -0
- package/clis/yuque/whoami.js +1 -0
- package/clis/zhihu/answer-comments.js +11 -0
- package/clis/zhihu/answer-detail.js +11 -0
- package/clis/zhihu/answer.js +15 -0
- package/clis/zhihu/article-transform.js +1 -0
- package/clis/zhihu/article.js +7 -0
- package/clis/zhihu/auth.js +11 -0
- package/clis/zhihu/collection.js +7 -0
- package/clis/zhihu/collections.js +7 -0
- package/clis/zhihu/comment.js +17 -0
- package/clis/zhihu/download.js +39 -0
- package/clis/zhihu/favorite.js +39 -0
- package/clis/zhihu/follow.js +19 -0
- package/clis/zhihu/followers.js +1 -0
- package/clis/zhihu/following.js +1 -0
- package/clis/zhihu/hot.js +21 -0
- package/clis/zhihu/like.js +16 -0
- package/clis/zhihu/paginate.js +11 -0
- package/clis/zhihu/pin.js +24 -0
- package/clis/zhihu/pins.js +1 -0
- package/clis/zhihu/question.js +7 -0
- package/clis/zhihu/recommend.js +7 -0
- package/clis/zhihu/search.js +11 -0
- package/clis/zhihu/stats.js +41 -0
- package/clis/zhihu/target.js +1 -0
- package/clis/zhihu/text.js +6 -0
- package/clis/zhihu/user-answers.js +1 -0
- package/clis/zhihu/user-arg.js +1 -0
- package/clis/zhihu/user-articles.js +1 -0
- package/clis/zhihu/user.js +11 -0
- package/clis/zhihu/write-shared.js +71 -0
- package/clis/zlibrary/info.js +1 -0
- package/clis/zlibrary/search.js +1 -0
- package/clis/zlibrary/utils.js +48 -0
- package/clis/zsxq/auth.js +33 -0
- package/clis/zsxq/dynamics.js +1 -0
- package/clis/zsxq/groups.js +1 -0
- package/clis/zsxq/search.js +1 -0
- package/clis/zsxq/topic.js +1 -0
- package/clis/zsxq/topics.js +1 -0
- package/clis/zsxq/utils.js +72 -0
- package/dist/src/adapter-shadow.d.ts +11 -0
- package/dist/src/adapter-shadow.js +2 -0
- package/dist/src/adapter-shadow.test.d.ts +1 -0
- package/dist/src/adapter-source.d.ts +11 -0
- package/dist/src/adapter-source.js +1 -0
- package/dist/src/adapter-source.test.d.ts +1 -0
- package/dist/src/browser/analyze.d.ts +118 -0
- package/dist/src/browser/analyze.js +1 -0
- package/dist/src/browser/analyze.test.d.ts +1 -0
- package/dist/src/browser/article-extract.d.ts +57 -0
- package/dist/src/browser/article-extract.e2e.test.d.ts +1 -0
- package/dist/src/browser/article-extract.js +2 -0
- package/dist/src/browser/article-extract.test.d.ts +1 -0
- package/dist/src/browser/ax-snapshot.d.ts +37 -0
- package/dist/src/browser/ax-snapshot.js +2 -0
- package/dist/src/browser/ax-snapshot.test.d.ts +1 -0
- package/dist/src/browser/base-page.d.ts +151 -0
- package/dist/src/browser/base-page.js +225 -0
- package/dist/src/browser/base-page.test.d.ts +1 -0
- package/dist/src/browser/bridge-readiness.d.ts +14 -0
- package/dist/src/browser/bridge-readiness.js +1 -0
- package/dist/src/browser/bridge-readiness.test.d.ts +1 -0
- package/dist/src/browser/bridge.d.ts +26 -0
- package/dist/src/browser/bridge.js +1 -0
- package/dist/src/browser/cdp-click-fixture.test.d.ts +1 -0
- package/dist/src/browser/cdp.d.ts +51 -0
- package/dist/src/browser/cdp.js +1 -0
- package/dist/src/browser/cdp.test.d.ts +1 -0
- package/dist/src/browser/compound.d.ts +59 -0
- package/dist/src/browser/compound.js +82 -0
- package/dist/src/browser/compound.test.d.ts +1 -0
- package/dist/src/browser/config.d.ts +2 -0
- package/dist/src/browser/config.js +1 -0
- package/dist/src/browser/daemon-client.d.ts +79 -0
- package/dist/src/browser/daemon-client.js +1 -0
- package/dist/src/browser/daemon-client.test.d.ts +1 -0
- package/dist/src/browser/daemon-lifecycle.d.ts +37 -0
- package/dist/src/browser/daemon-lifecycle.js +12 -0
- package/dist/src/browser/daemon-transport.d.ts +55 -0
- package/dist/src/browser/daemon-transport.js +1 -0
- package/dist/src/browser/daemon-version.d.ts +4 -0
- package/dist/src/browser/daemon-version.js +2 -0
- package/dist/src/browser/dom-helpers.d.ts +41 -0
- package/dist/src/browser/dom-helpers.js +166 -0
- package/dist/src/browser/dom-helpers.test.d.ts +1 -0
- package/dist/src/browser/dom-snapshot.d.ts +93 -0
- package/dist/src/browser/dom-snapshot.js +809 -0
- package/dist/src/browser/dom-snapshot.test.d.ts +11 -0
- package/dist/src/browser/errors.d.ts +38 -0
- package/dist/src/browser/errors.js +5 -0
- package/dist/src/browser/errors.test.d.ts +1 -0
- package/dist/src/browser/extract.d.ts +69 -0
- package/dist/src/browser/extract.js +42 -0
- package/dist/src/browser/extract.test.d.ts +1 -0
- package/dist/src/browser/find.d.ts +84 -0
- package/dist/src/browser/find.js +328 -0
- package/dist/src/browser/find.test.d.ts +1 -0
- package/dist/src/browser/fingerprint.d.ts +44 -0
- package/dist/src/browser/fingerprint.js +82 -0
- package/dist/src/browser/html-tree.d.ts +75 -0
- package/dist/src/browser/html-tree.js +61 -0
- package/dist/src/browser/html-tree.test.d.ts +1 -0
- package/dist/src/browser/index.d.ts +14 -0
- package/dist/src/browser/index.js +1 -0
- package/dist/src/browser/managed-chrome.d.ts +89 -0
- package/dist/src/browser/managed-chrome.js +1 -0
- package/dist/src/browser/network-cache.d.ts +49 -0
- package/dist/src/browser/network-cache.js +1 -0
- package/dist/src/browser/network-cache.test.d.ts +1 -0
- package/dist/src/browser/network-key.d.ts +22 -0
- package/dist/src/browser/network-key.js +1 -0
- package/dist/src/browser/network-key.test.d.ts +1 -0
- package/dist/src/browser/page.d.ts +83 -0
- package/dist/src/browser/page.js +15 -0
- package/dist/src/browser/page.test.d.ts +1 -0
- package/dist/src/browser/profile.d.ts +96 -0
- package/dist/src/browser/profile.js +2 -0
- package/dist/src/browser/proxy-test.d.ts +28 -0
- package/dist/src/browser/proxy-test.js +12 -0
- package/dist/src/browser/shape-filter.d.ts +52 -0
- package/dist/src/browser/shape-filter.js +1 -0
- package/dist/src/browser/shape-filter.test.d.ts +1 -0
- package/dist/src/browser/shape.d.ts +23 -0
- package/dist/src/browser/shape.js +1 -0
- package/dist/src/browser/shape.test.d.ts +1 -0
- package/dist/src/browser/stealth.d.ts +18 -0
- package/dist/src/browser/stealth.js +391 -0
- package/dist/src/browser/stealth.test.d.ts +1 -0
- package/dist/src/browser/tabs.d.ts +13 -0
- package/dist/src/browser/tabs.js +2 -0
- package/dist/src/browser/target-errors.d.ts +39 -0
- package/dist/src/browser/target-errors.js +1 -0
- package/dist/src/browser/target-errors.test.d.ts +1 -0
- package/dist/src/browser/target-resolver.d.ts +158 -0
- package/dist/src/browser/target-resolver.js +423 -0
- package/dist/src/browser/target-resolver.test.d.ts +1 -0
- package/dist/src/browser/trace.d.ts +21 -0
- package/dist/src/browser/trace.js +2 -0
- package/dist/src/browser/utils.d.ts +20 -0
- package/dist/src/browser/utils.js +1 -0
- package/dist/src/browser/utils.test.d.ts +1 -0
- package/dist/src/browser/verify-fixture.d.ts +65 -0
- package/dist/src/browser/verify-fixture.js +2 -0
- package/dist/src/browser/verify-fixture.test.d.ts +1 -0
- package/dist/src/browser/visual-refs.d.ts +11 -0
- package/dist/src/browser/visual-refs.js +94 -0
- package/dist/src/browser-session-lock.d.ts +13 -0
- package/dist/src/browser-session-lock.js +1 -0
- package/dist/src/browser-session-lock.test.d.ts +1 -0
- package/dist/src/browser.test.d.ts +1 -0
- package/dist/src/build-manifest.d.ts +103 -0
- package/dist/src/build-manifest.js +16 -0
- package/dist/src/build-manifest.test.d.ts +1 -0
- package/dist/src/capabilityRouting.d.ts +19 -0
- package/dist/src/capabilityRouting.js +1 -0
- package/dist/src/capabilityRouting.test.d.ts +1 -0
- package/dist/src/cli-argv-preprocess.d.ts +63 -0
- package/dist/src/cli-argv-preprocess.js +1 -0
- package/dist/src/cli-argv-preprocess.test.d.ts +1 -0
- package/dist/src/cli.d.ts +79 -0
- package/dist/src/cli.js +132 -0
- package/dist/src/cli.test.d.ts +1 -0
- package/dist/src/commanderAdapter.d.ts +21 -0
- package/dist/src/commanderAdapter.js +3 -0
- package/dist/src/commanderAdapter.test.d.ts +1 -0
- package/dist/src/commands/auth.d.ts +40 -0
- package/dist/src/commands/auth.js +2 -0
- package/dist/src/commands/auth.test.d.ts +1 -0
- package/dist/src/commands/daemon.d.ts +25 -0
- package/dist/src/commands/daemon.js +1 -0
- package/dist/src/commands/daemon.test.d.ts +1 -0
- package/dist/src/completion-fast.d.ts +22 -0
- package/dist/src/completion-fast.js +1 -0
- package/dist/src/completion-shared.d.ts +13 -0
- package/dist/src/completion-shared.js +30 -0
- package/dist/src/completion.d.ts +21 -0
- package/dist/src/completion.js +1 -0
- package/dist/src/completion.test.d.ts +1 -0
- package/dist/src/constants.d.ts +22 -0
- package/dist/src/constants.js +1 -0
- package/dist/src/convention-audit.d.ts +50 -0
- package/dist/src/convention-audit.js +2 -0
- package/dist/src/convention-audit.test.d.ts +1 -0
- package/dist/src/daemon-utils.d.ts +18 -0
- package/dist/src/daemon-utils.js +1 -0
- package/dist/src/daemon.d.ts +22 -0
- package/dist/src/daemon.js +1 -0
- package/dist/src/daemon.test.d.ts +1 -0
- package/dist/src/discovery.d.ts +43 -0
- package/dist/src/discovery.js +2 -0
- package/dist/src/doctor.d.ts +38 -0
- package/dist/src/doctor.js +13 -0
- package/dist/src/doctor.test.d.ts +1 -0
- package/dist/src/download/article-download.d.ts +72 -0
- package/dist/src/download/article-download.js +21 -0
- package/dist/src/download/article-download.test.d.ts +1 -0
- package/dist/src/download/index.d.ts +71 -0
- package/dist/src/download/index.js +7 -0
- package/dist/src/download/index.test.d.ts +1 -0
- package/dist/src/download/media-download.d.ts +49 -0
- package/dist/src/download/media-download.js +1 -0
- package/dist/src/download/media-download.test.d.ts +1 -0
- package/dist/src/download/progress.d.ts +36 -0
- package/dist/src/download/progress.js +5 -0
- package/dist/src/download/progress.test.d.ts +1 -0
- package/dist/src/electron-apps.d.ts +31 -0
- package/dist/src/electron-apps.js +1 -0
- package/dist/src/electron-apps.test.d.ts +1 -0
- package/dist/src/engine.test.d.ts +1 -0
- package/dist/src/errors.d.ts +117 -0
- package/dist/src/errors.js +2 -0
- package/dist/src/errors.test.d.ts +1 -0
- package/dist/src/execution.d.ts +24 -0
- package/dist/src/execution.js +2 -0
- package/dist/src/execution.test.d.ts +1 -0
- package/dist/src/extension-manifest-regression.test.d.ts +1 -0
- package/dist/src/external-clis.yaml +109 -0
- package/dist/src/external.d.ts +49 -0
- package/dist/src/external.js +1 -0
- package/dist/src/external.test.d.ts +1 -0
- package/dist/src/help.d.ts +88 -0
- package/dist/src/help.js +8 -0
- package/dist/src/help.test.d.ts +1 -0
- package/dist/src/hooks.d.ts +46 -0
- package/dist/src/hooks.js +1 -0
- package/dist/src/hooks.test.d.ts +4 -0
- package/dist/src/interceptor.d.ts +44 -0
- package/dist/src/interceptor.js +123 -0
- package/dist/src/interceptor.test.d.ts +4 -0
- package/dist/src/launcher.d.ts +41 -0
- package/dist/src/launcher.js +7 -0
- package/dist/src/launcher.test.d.ts +1 -0
- package/dist/src/logger.d.ts +26 -0
- package/dist/src/logger.js +9 -0
- package/dist/src/main.d.ts +5 -0
- package/dist/src/main.js +10 -0
- package/dist/src/manifest-types.d.ts +43 -0
- package/dist/src/manifest-types.js +1 -0
- package/dist/src/node-network.d.ts +10 -0
- package/dist/src/node-network.js +1 -0
- package/dist/src/node-network.test.d.ts +1 -0
- package/dist/src/observation/artifact.d.ts +16 -0
- package/dist/src/observation/artifact.js +8 -0
- package/dist/src/observation/artifact.test.d.ts +1 -0
- package/dist/src/observation/events.d.ts +89 -0
- package/dist/src/observation/events.js +1 -0
- package/dist/src/observation/index.d.ts +7 -0
- package/dist/src/observation/index.js +1 -0
- package/dist/src/observation/manager.d.ts +9 -0
- package/dist/src/observation/manager.js +1 -0
- package/dist/src/observation/manager.test.d.ts +1 -0
- package/dist/src/observation/redaction.d.ts +11 -0
- package/dist/src/observation/redaction.js +2 -0
- package/dist/src/observation/redaction.test.d.ts +1 -0
- package/dist/src/observation/retention.d.ts +32 -0
- package/dist/src/observation/retention.js +1 -0
- package/dist/src/observation/retention.test.d.ts +1 -0
- package/dist/src/observation/ring-buffer.d.ts +22 -0
- package/dist/src/observation/ring-buffer.js +1 -0
- package/dist/src/observation/ring-buffer.test.d.ts +1 -0
- package/dist/src/observation/session.d.ts +25 -0
- package/dist/src/observation/session.js +1 -0
- package/dist/src/output.d.ts +14 -0
- package/dist/src/output.js +2 -0
- package/dist/src/output.test.d.ts +1 -0
- package/dist/src/package-exports.test.d.ts +1 -0
- package/dist/src/package-paths.d.ts +8 -0
- package/dist/src/package-paths.js +1 -0
- package/dist/src/pipeline/executor.d.ts +11 -0
- package/dist/src/pipeline/executor.js +1 -0
- package/dist/src/pipeline/executor.test.d.ts +4 -0
- package/dist/src/pipeline/index.d.ts +5 -0
- package/dist/src/pipeline/index.js +1 -0
- package/dist/src/pipeline/registry.d.ts +28 -0
- package/dist/src/pipeline/registry.js +1 -0
- package/dist/src/pipeline/steps/browser.d.ts +13 -0
- package/dist/src/pipeline/steps/browser.js +1 -0
- package/dist/src/pipeline/steps/download.d.ts +18 -0
- package/dist/src/pipeline/steps/download.js +1 -0
- package/dist/src/pipeline/steps/download.test.d.ts +1 -0
- package/dist/src/pipeline/steps/fetch.d.ts +5 -0
- package/dist/src/pipeline/steps/fetch.js +31 -0
- package/dist/src/pipeline/steps/fetch.test.d.ts +1 -0
- package/dist/src/pipeline/steps/intercept.d.ts +5 -0
- package/dist/src/pipeline/steps/intercept.js +1 -0
- package/dist/src/pipeline/steps/tap.d.ts +12 -0
- package/dist/src/pipeline/steps/tap.js +53 -0
- package/dist/src/pipeline/steps/transform.d.ts +9 -0
- package/dist/src/pipeline/steps/transform.js +1 -0
- package/dist/src/pipeline/template.d.ts +17 -0
- package/dist/src/pipeline/template.js +1 -0
- package/dist/src/pipeline/template.test.d.ts +4 -0
- package/dist/src/pipeline/transform.test.d.ts +4 -0
- package/dist/src/plugin-manifest.d.ts +70 -0
- package/dist/src/plugin-manifest.js +1 -0
- package/dist/src/plugin-manifest.test.d.ts +4 -0
- package/dist/src/plugin-scaffold.d.ts +28 -0
- package/dist/src/plugin-scaffold.js +75 -0
- package/dist/src/plugin-scaffold.test.d.ts +4 -0
- package/dist/src/plugin.d.ts +145 -0
- package/dist/src/plugin.js +20 -0
- package/dist/src/plugin.test.d.ts +4 -0
- package/dist/src/rate-limit.d.ts +15 -0
- package/dist/src/rate-limit.js +2 -0
- package/dist/src/rate-limit.test.d.ts +1 -0
- package/dist/src/registry-api.d.ts +13 -0
- package/dist/src/registry-api.js +1 -0
- package/dist/src/registry.d.ts +130 -0
- package/dist/src/registry.js +1 -0
- package/dist/src/registry.test.d.ts +4 -0
- package/dist/src/runtime-detect.d.ts +31 -0
- package/dist/src/runtime-detect.js +1 -0
- package/dist/src/runtime-detect.test.d.ts +1 -0
- package/dist/src/runtime.d.ts +57 -0
- package/dist/src/runtime.js +1 -0
- package/dist/src/scripts/framework.d.ts +7 -0
- package/dist/src/scripts/framework.js +1 -0
- package/dist/src/scripts/interact.d.ts +4 -0
- package/dist/src/scripts/interact.js +1 -0
- package/dist/src/scripts/store.d.ts +13 -0
- package/dist/src/scripts/store.js +1 -0
- package/dist/src/serialization.d.ts +42 -0
- package/dist/src/serialization.js +4 -0
- package/dist/src/serialization.test.d.ts +1 -0
- package/dist/src/skills.d.ts +14 -0
- package/dist/src/skills.js +6 -0
- package/dist/src/skills.test.d.ts +1 -0
- package/dist/src/snapshotFormatter.d.ts +11 -0
- package/dist/src/snapshotFormatter.js +3 -0
- package/dist/src/snapshotFormatter.test.d.ts +7 -0
- package/dist/src/tui.d.ts +28 -0
- package/dist/src/tui.js +16 -0
- package/dist/src/tui.test.d.ts +1 -0
- package/dist/src/types.d.ts +236 -0
- package/dist/src/types.js +1 -0
- package/dist/src/utils.d.ts +57 -0
- package/dist/src/utils.js +38 -0
- package/dist/src/utils.test.d.ts +1 -0
- package/dist/src/validate.d.ts +21 -0
- package/dist/src/validate.js +3 -0
- package/dist/src/validate.test.d.ts +9 -0
- package/dist/src/verify.d.ts +27 -0
- package/dist/src/verify.js +2 -0
- package/dist/src/verify.test.d.ts +8 -0
- package/dist/src/version.d.ts +4 -0
- package/dist/src/version.js +1 -0
- package/dist/src/weixin-download.test.d.ts +1 -0
- package/docs/guide/browser-bridge.md +94 -0
- package/docs/guide/electron-app-cli.md +199 -0
- package/docs/guide/exit-codes.md +24 -0
- package/docs/guide/extending-opencli.md +134 -0
- package/docs/guide/getting-started.md +81 -0
- package/docs/guide/installation.md +52 -0
- package/docs/guide/plugins.md +226 -0
- package/docs/guide/remote-orchestration.md +116 -0
- package/docs/guide/troubleshooting.md +69 -0
- package/package.json +116 -0
- package/scripts/check-doc-coverage.sh +81 -0
- package/scripts/check-listing-id-pairing.mjs +193 -0
- package/scripts/check-silent-column-drop.mjs +105 -0
- package/scripts/check-typed-error-lint.mjs +118 -0
- package/scripts/clean-dist.cjs +13 -0
- package/scripts/copy-yaml.cjs +12 -0
- package/scripts/fetch-adapters.js +293 -0
- package/scripts/minify-release.mjs +115 -0
- package/scripts/postinstall.js +174 -0
- package/scripts/silent-column-drop-baseline.json +910 -0
- package/scripts/typed-error-lint-baseline.json +1098 -0
- package/skills/opencli-adapter-author/SKILL.md +256 -0
- package/skills/opencli-adapter-author/references/adapter-template.md +471 -0
- package/skills/opencli-adapter-author/references/api-discovery.md +295 -0
- package/skills/opencli-adapter-author/references/coverage-matrix.md +81 -0
- package/skills/opencli-adapter-author/references/field-conventions.md +172 -0
- package/skills/opencli-adapter-author/references/field-decode-playbook.md +181 -0
- package/skills/opencli-adapter-author/references/jsdom-fixture-pattern.md +196 -0
- package/skills/opencli-adapter-author/references/output-design.md +149 -0
- package/skills/opencli-adapter-author/references/site-memory/bilibili.md +70 -0
- package/skills/opencli-adapter-author/references/site-memory/eastmoney.md +70 -0
- package/skills/opencli-adapter-author/references/site-memory/tonghuashun.md +51 -0
- package/skills/opencli-adapter-author/references/site-memory/xueqiu.md +58 -0
- package/skills/opencli-adapter-author/references/site-memory.md +231 -0
- package/skills/opencli-adapter-author/references/site-recon.md +134 -0
- package/skills/opencli-adapter-author/references/strategy-selection.md +169 -0
- package/skills/opencli-adapter-author/references/success-rate-pitfalls.md +162 -0
- package/skills/opencli-adapter-author/references/typed-errors.md +234 -0
- package/skills/opencli-autofix/SKILL.md +297 -0
- package/skills/opencli-browser/SKILL.md +468 -0
- package/skills/opencli-browser-sitemap/SKILL.md +96 -0
- package/skills/opencli-sitemap-author/SKILL.md +161 -0
- package/skills/opencli-sitemap-author/references/sitemap-schema.md +660 -0
- package/skills/opencli-usage/SKILL.md +168 -0
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import{cli as a,Strategy as n}from"@jackwener/opencli/registry";import{CommandExecutionError as c}from"@jackwener/opencli/errors";import{requireObjectEvaluateResult as l,unwrapEvaluateResult as u}from"./utils.js";a({site:"weibo",name:"post",access:"read",description:"Get a single Weibo post",domain:"weibo.com",strategy:n.COOKIE,args:[{name:"id",required:!0,positional:!0,help:"Post ID (numeric idstr or mblogid from URL)"}],columns:["field","value"],func:async(t,s)=>{await t.goto("https://weibo.com");await t.wait(2);const r=String(s.id),e=l(u(await t.evaluate(`
|
|
2
|
+
(async () => {
|
|
3
|
+
const id = ${JSON.stringify(r)};
|
|
4
|
+
const strip = (html) => (html || '').replace(/<[^>]+>/g, '').replace(/ /g, ' ').replace(/</g, '<').replace(/>/g, '>').replace(/&/g, '&').trim();
|
|
5
|
+
|
|
6
|
+
const resp = await fetch('/ajax/statuses/show?id=' + encodeURIComponent(id), {credentials: 'include'});
|
|
7
|
+
if (!resp.ok) return {error: 'HTTP ' + resp.status};
|
|
8
|
+
const s = await resp.json();
|
|
9
|
+
if (!s.ok && !s.idstr) return {error: 'Post not found'};
|
|
10
|
+
|
|
11
|
+
// Fetch long text if needed
|
|
12
|
+
let fullText = s.text_raw || strip(s.text || '');
|
|
13
|
+
if (s.isLongText || s.is_long_text) {
|
|
14
|
+
try {
|
|
15
|
+
const ltResp = await fetch('/ajax/statuses/longtext?id=' + s.idstr, {credentials: 'include'});
|
|
16
|
+
if (ltResp.ok) {
|
|
17
|
+
const lt = await ltResp.json();
|
|
18
|
+
if (lt.data?.longTextContent) fullText = strip(lt.data.longTextContent);
|
|
19
|
+
}
|
|
20
|
+
} catch {}
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
const u = s.user || {};
|
|
24
|
+
const result = {
|
|
25
|
+
id: s.idstr || String(s.id),
|
|
26
|
+
mblogid: s.mblogid,
|
|
27
|
+
author: u.screen_name || '',
|
|
28
|
+
text: fullText,
|
|
29
|
+
created_at: s.created_at,
|
|
30
|
+
source: strip(s.source || ''),
|
|
31
|
+
reposts: s.reposts_count || 0,
|
|
32
|
+
comments: s.comments_count || 0,
|
|
33
|
+
likes: s.attitudes_count || 0,
|
|
34
|
+
pic_count: s.pic_num || 0,
|
|
35
|
+
url: 'https://weibo.com/' + (u.id || '') + '/' + (s.mblogid || ''),
|
|
36
|
+
};
|
|
37
|
+
|
|
38
|
+
if (s.retweeted_status) {
|
|
39
|
+
const rt = s.retweeted_status;
|
|
40
|
+
result.retweeted_from = (rt.user?.screen_name || '[deleted]');
|
|
41
|
+
result.retweeted_text = rt.text_raw || strip(rt.text || '');
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
return result;
|
|
45
|
+
})()
|
|
46
|
+
`)),"weibo post");if(e.error)throw new c(String(e.error));return Object.entries(e).map(([o,i])=>({field:o,value:String(i)}))}});
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
import*as f from"node:fs";import*as D from"node:path";import{cli as U,Strategy as x}from"@jackwener/opencli/registry";import{ArgumentError as y,AuthRequiredError as A,CommandExecutionError as J}from"@jackwener/opencli/errors";import{getSelfUid as h}from"./utils.js";const N=9,F=1500,I=30000,W=300,G=1e4,X=500,c=20000,C=new Set([".jpg",".jpeg",".png",".gif",".webp"]),k=['textarea[placeholder*="有什么新鲜事"]','textarea[placeholder*="新鲜事"]',"textarea._input_13iqr_8"],R='input[type="file"][class*="_file_"]';function w(z){const K=String(z??"").trim();if(!K)throw new y("weibo publish text cannot be empty");if(K.length>2000)throw new y("weibo publish text exceeds 2000 characters");return K}function b(z){if(!z)return[];const K=z.split(",").map((Z)=>Z.trim()).filter(Boolean);if(K.length>N)throw new y(`Too many images: ${K.length} (max ${N})`);return K.map((Z)=>{const Q=D.resolve(Z),Y=D.extname(Q).toLowerCase();if(!C.has(Y))throw new y(`Unsupported image format "${Y}". Supported: jpg, png, gif, webp`);const q=f.statSync(Q,{throwIfNoEntry:!1});if(!q||!q.isFile())throw new y(`Not a valid file: ${Q}`);return Q})}U({site:"weibo",name:"publish",access:"write",description:"Publish a new Weibo post immediately",domain:"weibo.com",strategy:x.UI,browser:!0,args:[{name:"text",type:"string",required:!0,positional:!0,help:"Weibo text content (max 2000 chars)"},{name:"images",type:"string",required:!1,help:`Image paths, comma-separated, max ${N} (jpg/png/gif/webp)`}],columns:["status","message","text"],func:async(z,K)=>{if(!z)throw new J("Browser session required for weibo publish");const Z=w(K.text),Q=b(K.images);await z.goto("https://weibo.com",{waitUntil:"load",settleMs:2000});await z.wait({time:2});try{await h(z)}catch(H){if(H instanceof A)throw H;throw new J("Not logged into Weibo. Please login at weibo.com in your Chrome browser.")}let Y=null;for(let H=0;H<Math.ceil(G/W);H++){Y=await z.evaluate(`
|
|
2
|
+
() => {
|
|
3
|
+
const visible = el => !!el && el.offsetParent !== null && !el.disabled;
|
|
4
|
+
const buttons = document.querySelectorAll('button[title="发微博"], button[title="写微博"]');
|
|
5
|
+
for (const btn of buttons) {
|
|
6
|
+
if (visible(btn)) {
|
|
7
|
+
btn.click();
|
|
8
|
+
return { ok: true };
|
|
9
|
+
}
|
|
10
|
+
}
|
|
11
|
+
return { ok: false, message: 'Could not find 发微博 button' };
|
|
12
|
+
}
|
|
13
|
+
`);if(Y?.ok)break;await z.wait({time:W/1000})}if(!Y?.ok)throw new J(Y?.message??"Could not open compose editor.");let q=!1;for(let H=0;H<Math.ceil(G/W);H++){const V=await z.evaluate(`
|
|
14
|
+
(selectors => {
|
|
15
|
+
// Pick the LAST visible match across all selectors so
|
|
16
|
+
// the modal (rendered on top of the home-feed strip)
|
|
17
|
+
// wins over earlier matches. See TEXTAREA_SELECTORS.
|
|
18
|
+
let last = null;
|
|
19
|
+
for (const sel of selectors) {
|
|
20
|
+
for (const t of document.querySelectorAll(sel)) {
|
|
21
|
+
if (t.offsetParent !== null) last = t;
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
if (!last) return { found: false };
|
|
25
|
+
return { found: true, visible: true, rectTop: last.getBoundingClientRect().top };
|
|
26
|
+
})(${JSON.stringify(k)})
|
|
27
|
+
`);if(V?.found&&V.visible&&V.rectTop>=0){q=!0;break}await z.wait({time:W/1000})}if(!q)throw new J("Weibo compose editor did not appear");if(Q.length>0){if(!z.setFileInput)throw new J("Browser extension does not support file upload. Please update the extension.");let H=!1;for(let j=0;j<Math.ceil(G/W);j++){H=await z.evaluate(`
|
|
28
|
+
() => {
|
|
29
|
+
const input = document.querySelector('input[type="file"][class*="_file_"]');
|
|
30
|
+
return !!input;
|
|
31
|
+
}
|
|
32
|
+
`);if(H)break;await z.wait({time:W/1000})}if(!H)throw new J("Could not find image file input on Weibo compose page. UI may have changed.");await z.setFileInput(Q,R);let V=null;for(let j=0;j<Math.ceil(I/F);j++){await z.wait({time:F/1000});V=await z.evaluateWithArgs(`
|
|
33
|
+
(() => {
|
|
34
|
+
const expectedCount = expected;
|
|
35
|
+
const uploading = document.querySelector('[class*="upload"], [class*="progress"]');
|
|
36
|
+
if (uploading && uploading.offsetParent !== null) return null;
|
|
37
|
+
const pics = document.querySelectorAll('img[class*="pic"], [class*="imgItem"], [class*="picture"] img');
|
|
38
|
+
if (pics.length >= expectedCount) return { ok: true, count: pics.length };
|
|
39
|
+
return null;
|
|
40
|
+
})()
|
|
41
|
+
`,{expected:Q.length});if(V!==null)break}if(!V?.ok)throw new J(V?.message??"Image upload did not complete before timeout")}const v=await z.evaluateWithArgs(`
|
|
42
|
+
((selectors) => {
|
|
43
|
+
let ta = null;
|
|
44
|
+
for (const sel of selectors) {
|
|
45
|
+
for (const t of document.querySelectorAll(sel)) {
|
|
46
|
+
if (t.offsetParent !== null) ta = t;
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
if (!ta) return { ok: false, message: 'textarea not visible' };
|
|
50
|
+
ta.focus();
|
|
51
|
+
const nativeSetter = Object.getOwnPropertyDescriptor(HTMLTextAreaElement.prototype, 'value')?.set;
|
|
52
|
+
if (nativeSetter) {
|
|
53
|
+
nativeSetter.call(ta, textContent);
|
|
54
|
+
} else {
|
|
55
|
+
ta.value = textContent;
|
|
56
|
+
}
|
|
57
|
+
ta.dispatchEvent(new Event('input', { bubbles: true }));
|
|
58
|
+
ta.dispatchEvent(new Event('change', { bubbles: true }));
|
|
59
|
+
return { ok: true, valueLength: ta.value.length };
|
|
60
|
+
})(${JSON.stringify(k)})
|
|
61
|
+
`,{textContent:Z});if(!v?.ok)throw new J(v?.message??"Could not insert text.");await z.wait({time:0.5});let B=null;for(let H=0;H<Math.ceil(G/W);H++){B=await z.evaluate(`
|
|
62
|
+
() => {
|
|
63
|
+
const visible = el => !!el && el.offsetParent !== null && !el.disabled;
|
|
64
|
+
const labels = ['发送', '发布'];
|
|
65
|
+
for (const label of labels) {
|
|
66
|
+
const allBtns = document.querySelectorAll('button, [role="button"]');
|
|
67
|
+
for (const btn of allBtns) {
|
|
68
|
+
const t = (btn.innerText || btn.textContent || '').trim();
|
|
69
|
+
if (t === label && visible(btn)) {
|
|
70
|
+
btn.click();
|
|
71
|
+
return { ok: true, label };
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
return { ok: false, message: 'Could not find send button' };
|
|
76
|
+
}
|
|
77
|
+
`);if(B?.ok)break;await z.wait({time:W/1000})}if(!B?.ok)throw new J(B?.message??"Could not click publish.");let $=null;for(let H=0;H<Math.ceil(c/X);H++){await z.wait({time:X/1000});$=await z.evaluate(`
|
|
78
|
+
(() => {
|
|
79
|
+
const successMarkers = ['发布成功', '已发布', '发送成功'];
|
|
80
|
+
const errorMarkers = ['发布失败', '发送失败', '内容违规', '请稍后再试', '频繁'];
|
|
81
|
+
for (const el of document.querySelectorAll('*')) {
|
|
82
|
+
if (el.children.length > 3) continue;
|
|
83
|
+
const txt = (el.innerText || '').trim();
|
|
84
|
+
if (!txt || txt.length > 100) continue;
|
|
85
|
+
for (const m of successMarkers) {
|
|
86
|
+
if (txt.includes(m) && (txt.includes('成功') || txt.includes('微博'))) {
|
|
87
|
+
return { ok: true, message: txt };
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
for (const m of errorMarkers) {
|
|
91
|
+
if (txt.includes(m)) {
|
|
92
|
+
return { ok: false, message: txt };
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
return null;
|
|
97
|
+
})()
|
|
98
|
+
`);if($!==null)break}if(!$)throw new J("Publish button clicked but result was unclear. Check Weibo manually.");if(!$.ok)throw new J($.message||"Weibo publish failed");return[{status:"success",message:$.message||"Published successfully",text:Z}]}});export const __test__={validateText:w,validateImagePaths:b};
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import{cli as c,Strategy as l}from"@jackwener/opencli/registry";import{CliError as s}from"@jackwener/opencli/errors";import{requireArrayEvaluateResult as u,unwrapEvaluateResult as h}from"./utils.js";c({site:"weibo",name:"search",access:"read",description:"搜索微博",domain:"weibo.com",browser:!0,strategy:l.COOKIE,args:[{name:"keyword",required:!0,positional:!0,help:"Search keyword"},{name:"limit",type:"int",default:10,help:"Number of results (max 50)"}],columns:["rank","id","title","author","time","url"],func:async(t,e)=>{const o=Math.max(1,Math.min(Number(e.limit)||10,50)),a=encodeURIComponent(String(e.keyword??"").trim());await t.goto(`https://s.weibo.com/weibo?q=${a}`);await t.wait(2);const r=u(h(await t.evaluate(`
|
|
2
|
+
(() => {
|
|
3
|
+
const clean = (value) => (value || '').replace(/\\s+/g, ' ').trim();
|
|
4
|
+
const absoluteUrl = (href) => {
|
|
5
|
+
if (!href) return '';
|
|
6
|
+
if (href.startsWith('http://') || href.startsWith('https://')) return href;
|
|
7
|
+
if (href.startsWith('//')) return window.location.protocol + href;
|
|
8
|
+
if (href.startsWith('/')) return window.location.origin + href;
|
|
9
|
+
return href;
|
|
10
|
+
};
|
|
11
|
+
|
|
12
|
+
const cards = Array.from(document.querySelectorAll('.card-wrap'));
|
|
13
|
+
const rows = [];
|
|
14
|
+
|
|
15
|
+
for (const card of cards) {
|
|
16
|
+
const contentEl =
|
|
17
|
+
card.querySelector('[node-type="feed_list_content_full"]') ||
|
|
18
|
+
card.querySelector('[node-type="feed_list_content"]') ||
|
|
19
|
+
card.querySelector('.txt');
|
|
20
|
+
const authorEl =
|
|
21
|
+
card.querySelector('.info .name') ||
|
|
22
|
+
card.querySelector('.name');
|
|
23
|
+
const timeEl = card.querySelector('.from a');
|
|
24
|
+
const urlEl =
|
|
25
|
+
card.querySelector('.from a[href*="/detail/"]') ||
|
|
26
|
+
card.querySelector('.from a[href*="/status/"]') ||
|
|
27
|
+
timeEl;
|
|
28
|
+
const url = absoluteUrl(urlEl && urlEl.getAttribute('href'));
|
|
29
|
+
const idMatch =
|
|
30
|
+
url.match(/^https?:\\/\\/(?:www\\.)?weibo\\.com\\/\\d+\\/([A-Za-z0-9]+)(?:[?#/]|$)/) ||
|
|
31
|
+
url.match(/^https?:\\/\\/(?:www\\.)?weibo\\.com\\/(?:detail|status)\\/([A-Za-z0-9]+)(?:[?#/]|$)/);
|
|
32
|
+
|
|
33
|
+
const title = clean(contentEl && contentEl.textContent);
|
|
34
|
+
if (!title) continue;
|
|
35
|
+
|
|
36
|
+
rows.push({
|
|
37
|
+
id: idMatch ? idMatch[1] : '',
|
|
38
|
+
title,
|
|
39
|
+
author: clean(authorEl && authorEl.textContent),
|
|
40
|
+
time: clean(timeEl && timeEl.textContent),
|
|
41
|
+
url,
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
return rows;
|
|
46
|
+
})()
|
|
47
|
+
`)),"weibo search");if(r.length===0)throw new s("NOT_FOUND","No Weibo search results found","Try a different keyword or ensure you are logged into weibo.com");return r.slice(0,o).map((i,n)=>({rank:n+1,...i}))}});
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
import{cli as $,Strategy as x}from"@jackwener/opencli/registry";import{ArgumentError as a,AuthRequiredError as D,CommandExecutionError as u,EmptyResultError as q}from"@jackwener/opencli/errors";import{unwrapEvaluateResult as v}from"./utils.js";const p=100,w=20,E=/^\d{4}-\d{2}-\d{2}$/;function h(e){const t=String(e??"").trim();if(!t)throw new a("weibo user-posts id cannot be empty");return t}function b(e){const t=e===void 0||e===null||e===""?w:Number(e);if(!Number.isInteger(t)||t<1||t>p)throw new a(`weibo user-posts limit must be an integer between 1 and ${p}`);return t}function m(e,t){if(e===void 0||e===null||e==="")return null;const r=String(e).trim();if(!E.test(r))throw new a(`weibo user-posts ${t} must use YYYY-MM-DD`);const o=new Date(`${r}T00:00:00+08:00`);if(!Number.isFinite(o.getTime())||r!==R(o))throw new a(`weibo user-posts ${t} must be a valid calendar date`);return r}function R(e){const t=new Intl.DateTimeFormat("en-CA",{timeZone:"Asia/Shanghai",year:"numeric",month:"2-digit",day:"2-digit"}).formatToParts(e),r=(o)=>t.find((n)=>n.type===o)?.value;return`${r("year")}-${r("month")}-${r("day")}`}function d(e){return Math.floor(new Date(`${e}T00:00:00+08:00`).getTime()/1000)}function Y(e,t){if(e&&t&&d(e)>d(t))throw new a("weibo user-posts start must be <= end")}function M(e){const t=String(e??"").trim();if(!t)throw new u("weibo user-posts failed without an error message");if(/login|cookie|登录|auth|forbidden|permission|权限|unauthorized/i.test(t))throw new D("weibo.com",t);throw new u(t)}export const testInternals={readRequiredId:h,readLimit:b,readDate:m,dateToTimestamp:d};$({site:"weibo",name:"user-posts",access:"read",description:"List Weibo posts from a user, optionally filtered by date range",domain:"weibo.com",strategy:x.COOKIE,args:[{name:"id",positional:!0,required:!0,help:"User ID (numeric uid) or screen name"},{name:"start",help:"Start date in Asia/Shanghai (YYYY-MM-DD)"},{name:"end",help:"End date in Asia/Shanghai (YYYY-MM-DD)"},{name:"limit",type:"int",default:w,help:`Number of posts (1-${p})`},{name:"include-retweets",type:"boolean",default:!1,help:"Include retweets"}],columns:["rank","id","mblogid","author","uid","text","time","reposts","comments","likes","pic_count","url"],func:async(e,t)=>{const r=h(t.id),o=b(t.limit),n=m(t.start,"start"),c=m(t.end,"end");Y(n,c);const y=Boolean(t["include-retweets"]),f=n?d(n):null,g=c?d(c)+86400-1:null;await e.goto("https://weibo.com");await e.wait(2);const I=await e.evaluate(`
|
|
2
|
+
(async () => {
|
|
3
|
+
const rawId = ${JSON.stringify(r)};
|
|
4
|
+
const limit = ${o};
|
|
5
|
+
const includeRetweets = ${y};
|
|
6
|
+
const starttime = ${f===null?"null":f};
|
|
7
|
+
const endtime = ${g===null?"null":g};
|
|
8
|
+
const strip = (html) => (html || '')
|
|
9
|
+
.replace(/<[^>]+>/g, '')
|
|
10
|
+
.replace(/ /g, ' ')
|
|
11
|
+
.replace(/</g, '<')
|
|
12
|
+
.replace(/>/g, '>')
|
|
13
|
+
.replace(/&/g, '&')
|
|
14
|
+
.replace(/\\s+/g, ' ')
|
|
15
|
+
.trim();
|
|
16
|
+
|
|
17
|
+
async function readJson(url) {
|
|
18
|
+
const resp = await fetch(url, { credentials: 'include' });
|
|
19
|
+
if (resp.status === 401 || resp.status === 403) {
|
|
20
|
+
return { error: 'login required: HTTP ' + resp.status };
|
|
21
|
+
}
|
|
22
|
+
if (!resp.ok) {
|
|
23
|
+
return { error: 'HTTP ' + resp.status };
|
|
24
|
+
}
|
|
25
|
+
try {
|
|
26
|
+
return await resp.json();
|
|
27
|
+
} catch {
|
|
28
|
+
return { error: 'Malformed JSON response' };
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
let uid = rawId;
|
|
33
|
+
if (!/^\\d+$/.test(rawId)) {
|
|
34
|
+
const profile = await readJson('/ajax/profile/info?screen_name=' + encodeURIComponent(rawId));
|
|
35
|
+
if (profile.error) return profile;
|
|
36
|
+
if (!profile.ok || !profile.data?.user?.id) return [rawId, [], true, false];
|
|
37
|
+
uid = String(profile.data.user.id);
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
const rows = [];
|
|
41
|
+
let sawList = false;
|
|
42
|
+
let sawPostCandidates = false;
|
|
43
|
+
for (let page = 1; page <= 20 && rows.length < limit; page++) {
|
|
44
|
+
const qs = new URLSearchParams();
|
|
45
|
+
qs.set('uid', uid);
|
|
46
|
+
qs.set('page', String(page));
|
|
47
|
+
qs.set('hasori', '1');
|
|
48
|
+
qs.set('hasret', includeRetweets ? '1' : '0');
|
|
49
|
+
if (starttime !== null) qs.set('starttime', String(starttime));
|
|
50
|
+
if (endtime !== null) qs.set('endtime', String(endtime));
|
|
51
|
+
|
|
52
|
+
const data = await readJson('/ajax/statuses/searchProfile?' + qs.toString());
|
|
53
|
+
if (data.error) return data;
|
|
54
|
+
if (data.ok === false) {
|
|
55
|
+
return { error: 'Weibo user posts API error: ' + (data.msg || data.message || 'request failed') };
|
|
56
|
+
}
|
|
57
|
+
const list = data.data?.list;
|
|
58
|
+
if (!Array.isArray(list)) {
|
|
59
|
+
return { error: 'Weibo user posts response did not include data.list' };
|
|
60
|
+
}
|
|
61
|
+
sawList = true;
|
|
62
|
+
if (list.length > 0) sawPostCandidates = true;
|
|
63
|
+
if (list.length === 0) break;
|
|
64
|
+
|
|
65
|
+
for (const post of list) {
|
|
66
|
+
if (rows.length >= limit) break;
|
|
67
|
+
const postId = post.idstr || (post.id === undefined || post.id === null ? '' : String(post.id));
|
|
68
|
+
const mblogid = post.mblogid || '';
|
|
69
|
+
const user = post.user || {};
|
|
70
|
+
const text = post.text_raw || strip(post.text || '');
|
|
71
|
+
if (!postId || !mblogid || !text) continue;
|
|
72
|
+
rows.push({
|
|
73
|
+
id: postId,
|
|
74
|
+
mblogid,
|
|
75
|
+
author: user.screen_name || '',
|
|
76
|
+
uid: user.id === undefined || user.id === null ? uid : String(user.id),
|
|
77
|
+
text,
|
|
78
|
+
time: post.created_at || '',
|
|
79
|
+
reposts: post.reposts_count ?? 0,
|
|
80
|
+
comments: post.comments_count ?? 0,
|
|
81
|
+
likes: post.attitudes_count ?? 0,
|
|
82
|
+
pic_count: post.pic_num ?? Object.keys(post.pic_infos || {}).length,
|
|
83
|
+
url: 'https://weibo.com/' + (user.id || uid) + '/' + mblogid,
|
|
84
|
+
});
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
if (list.length < 10) break;
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
return [uid, rows, sawList, sawPostCandidates];
|
|
91
|
+
})()
|
|
92
|
+
`),i=v(I);if(i&&!Array.isArray(i)&&typeof i==="object"&&"error"in i)M(i.error);if(!Array.isArray(i)||i.length!==4||!Array.isArray(i[1]))throw new u("weibo user-posts returned malformed extraction payload");const[S,l,A,T]=i;if(!A&&l.length===0)throw new u("weibo user-posts did not observe a valid posts list");if(T&&l.length===0)throw new u("weibo user-posts found post candidates but could not extract valid rows");if(l.length===0)throw new q("weibo user-posts","No Weibo posts found for this user/date range");return l.slice(0,o).map((s,_)=>({rank:_+1,id:String(s.id),mblogid:s.mblogid||"",author:s.author||"",uid:String(s.uid||S||""),text:s.text||"",time:s.time||"",reposts:s.reposts??0,comments:s.comments??0,likes:s.likes??0,pic_count:s.pic_count??0,url:s.url||""}))}});
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import{cli as a,Strategy as o}from"@jackwener/opencli/registry";import{CommandExecutionError as n}from"@jackwener/opencli/errors";import{requireObjectEvaluateResult as s,unwrapEvaluateResult as d}from"./utils.js";a({site:"weibo",name:"user",access:"read",description:"Get Weibo user profile",domain:"weibo.com",strategy:o.COOKIE,args:[{name:"id",required:!0,positional:!0,help:"User ID (numeric uid) or screen name"}],columns:["screen_name","uid","followers","following","statuses","verified","description","location","url"],func:async(e,r)=>{await e.goto("https://weibo.com");await e.wait(2);const i=String(r.id),t=s(d(await e.evaluate(`
|
|
2
|
+
(async () => {
|
|
3
|
+
const id = ${JSON.stringify(i)};
|
|
4
|
+
const isUid = /^\\d+$/.test(id);
|
|
5
|
+
const query = isUid ? 'uid=' + id : 'screen_name=' + encodeURIComponent(id);
|
|
6
|
+
|
|
7
|
+
const resp = await fetch('/ajax/profile/info?' + query, {credentials: 'include'});
|
|
8
|
+
if (!resp.ok) return {error: 'HTTP ' + resp.status};
|
|
9
|
+
const data = await resp.json();
|
|
10
|
+
if (!data.ok || !data.data?.user) return {error: 'User not found'};
|
|
11
|
+
|
|
12
|
+
const u = data.data.user;
|
|
13
|
+
|
|
14
|
+
// Fetch detail info
|
|
15
|
+
const detailResp = await fetch('/ajax/profile/detail?uid=' + u.id, {credentials: 'include'});
|
|
16
|
+
const detail = detailResp.ok ? await detailResp.json() : null;
|
|
17
|
+
const d = detail?.data || {};
|
|
18
|
+
|
|
19
|
+
return {
|
|
20
|
+
screen_name: u.screen_name,
|
|
21
|
+
uid: u.id,
|
|
22
|
+
followers: u.followers_count,
|
|
23
|
+
following: u.friends_count,
|
|
24
|
+
statuses: u.statuses_count,
|
|
25
|
+
verified: u.verified || false,
|
|
26
|
+
verified_reason: u.verified_reason || '',
|
|
27
|
+
description: u.description || d.description || '',
|
|
28
|
+
location: u.location || '',
|
|
29
|
+
gender: u.gender === 'm' ? 'male' : u.gender === 'f' ? 'female' : '',
|
|
30
|
+
avatar: u.avatar_hd || u.avatar_large || '',
|
|
31
|
+
url: 'https://weibo.com' + (u.profile_url || '/u/' + u.id),
|
|
32
|
+
birthday: d.birthday || '',
|
|
33
|
+
created_at: d.created_at || '',
|
|
34
|
+
ip_location: d.ip_location || '',
|
|
35
|
+
};
|
|
36
|
+
})()
|
|
37
|
+
`)),"weibo user");if(t.error)throw new n(String(t.error));return t}});
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import{AuthRequiredError as J,CommandExecutionError as D}from"@jackwener/opencli/errors";export function unwrapEvaluateResult(z){if(z&&!Array.isArray(z)&&typeof z==="object"&&"session"in z&&"data"in z)return z.data;return z}export function requireArrayEvaluateResult(z,B){if(!Array.isArray(z)){if(z&&typeof z==="object"&&"error"in z)throw new D(`${B}: ${String(z.error)}`);throw new D(`${B} returned malformed extraction payload`)}return z}export function requireObjectEvaluateResult(z,B){if(!z||Array.isArray(z)||typeof z!=="object")throw new D(`${B} returned malformed extraction payload`);return z}export async function getSelfUid(z){const B=unwrapEvaluateResult(await z.evaluate(`
|
|
2
|
+
(() => {
|
|
3
|
+
const app = document.querySelector('#app')?.__vue_app__;
|
|
4
|
+
const store = app?.config?.globalProperties?.$store;
|
|
5
|
+
const uid = store?.state?.config?.config?.uid;
|
|
6
|
+
if (uid) return String(uid);
|
|
7
|
+
return null;
|
|
8
|
+
})()
|
|
9
|
+
`));if(B)return B;const H=unwrapEvaluateResult(await z.evaluate(`
|
|
10
|
+
(async () => {
|
|
11
|
+
const resp = await fetch('/ajax/config/get_config', {credentials: 'include'});
|
|
12
|
+
if (!resp.ok) return null;
|
|
13
|
+
const data = await resp.json();
|
|
14
|
+
return data.ok && data.data?.uid ? String(data.data.uid) : null;
|
|
15
|
+
})()
|
|
16
|
+
`));if(H)return H;throw new J("weibo.com")}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{CliError as W,CommandExecutionError as S}from"@jackwener/opencli/errors";import{cli as J,Strategy as P}from"@jackwener/opencli/registry";import{publishArticle as T}from"../_shared/article/publish.js";import{readFile as I,stat as y}from"node:fs/promises";function R(B){if(!B.execute)throw new W("INVALID_INPUT","微信公众号写操作需要 --execute 确认,避免误发。注意:本报错仅表示缺少 --execute,并未校验其余参数,不能当 dry-run 预览用")}async function C(B){const L=typeof B.text==="string"?B.text:void 0,z=typeof B.file==="string"?B.file:void 0;if(L&&z)throw new W("INVALID_INPUT","请只提供 <text> 或 --file 中的一种,不能同时使用。");let D=L??"";if(z){let G;try{G=await y(z)}catch{throw new W("INVALID_INPUT",`文件不存在:${z}`)}if(!G.isFile())throw new W("INVALID_INPUT",`路径不是可读文本文件:${z}`);let H;try{H=await I(z)}catch{throw new W("INVALID_INPUT",`文件无法读取:${z}`)}try{D=new TextDecoder("utf-8",{fatal:!0}).decode(H)}catch{throw new W("INVALID_INPUT",`文件无法解码为 UTF-8:${z}`)}}if(!D.trim())throw new W("INVALID_INPUT","正文不能为空。");return D}function b(B,L,z,D,G={}){return[{status:"success",outcome:D,message:B,target_type:L,target:z,...G}]}export const weixinProfile={home:"https://mp.weixin.qq.com",outputFormat:"html",preprocessConfig:{removeLinks:!0,keepLinkDomains:["mp.weixin.qq.com","weixin.qq.com"],compactHtml:!0},image:{skip:["mmbiz.qpic.cn","mmbiz.qlogo.cn"],uploadFn:async(B,L)=>{const z=document.documentElement.innerHTML,D=z.match(/data:\s*\{[\s\S]*?t:\s*["']([^"']+)["']/),G=z.match(/ticket:\s*["']([^"']+)["']/),H=z.match(/user_name:\s*["']([^"']+)["']/),V=z.match(/time:\s*["'](\d+)["']/);if(!D)throw Error("微信图片上传:页面中未找到 token,请确认已登录 mp.weixin.qq.com。");const K=D[1],X=G?G[1]:"",Q=H?H[1]:"",Z=V?Number(V[1]):Math.floor(Date.now()/1000),$=await fetch(B,{credentials:"omit"});if(!$.ok)throw Error("图片下载失败:"+B+"(HTTP "+$.status+")");const A=await $.blob(),F=Date.now(),q=F+".jpg",Y=new FormData;Y.append("type",A.type||"image/jpeg");Y.append("id",String(F));Y.append("name",q);Y.append("lastModifiedDate",new Date().toString());Y.append("size",String(A.size));Y.append("file",A,q);const _=Date.now(),j="https://mp.weixin.qq.com/cgi-bin/filetransfer?action=upload_material&f=json&scene=8&writetype=doublewrite&groupid=1&ticket_id="+encodeURIComponent(Q)+"&ticket="+encodeURIComponent(X)+"&svr_time="+Z+"&token="+encodeURIComponent(K)+"&lang=zh_CN&seq="+_+"&t="+Math.random(),U=await fetch(j,{method:"POST",credentials:"include",body:Y}),O=await U.json().catch(()=>({}));if(!U.ok||O.base_resp?.err_msg!=="ok"||!O.cdn_url)throw Error("微信图片上传失败:"+B+"("+(O.base_resp?.err_msg||"HTTP "+U.status)+")");return{url:O.cdn_url}}},checkAuth:async(B)=>{const z=await(await fetch("https://mp.weixin.qq.com/",{method:"GET",credentials:"include"})).text(),D=z.match(/user_name:\s*["']([^"']+)["']/),G=z.match(/nick_name:\s*["']([^"']+)["']/);if(!D&&!G)return{isAuthenticated:!1};const H=z.match(/class="weui-desktop-account__thumb"[^>]*src="([^"]+)"/),V=z.match(/head_img:\s*['"]([^'"]+)['"]/);let K=H?H[1]:V?V[1]:"";if(K.startsWith("http://"))K=K.replace("http://","https://");return{isAuthenticated:!0,userId:D?D[1]:"",username:G?G[1]:"",avatar:K}},publish:async(B,L)=>{const D=document.documentElement.innerHTML.match(/data:\s*\{[\s\S]*?t:\s*["']([^"']+)["']/);if(!D)return{ok:!1,stage:"auth",message:"页面中未找到 token,请确认已登录 mp.weixin.qq.com。"};const G=D[1],H=B.content,V=new URLSearchParams({token:G,lang:"zh_CN",f:"json",ajax:"1",random:String(Math.random()),AppMsgId:"",count:"1",data_seq:"0",operate_from:"Chrome",isnew:"0",ad_video_transition0:"",can_reward0:"0",related_video0:"",is_video_recommend0:"-1",title0:B.title,author0:"",writerid0:"0",fileid0:"",digest0:"",auto_gen_digest0:"1",content0:H,sourceurl0:"",need_open_comment0:"1",only_fans_can_comment0:"0",cdn_url0:"",cdn_235_1_url0:"",cdn_1_1_url0:"",cdn_url_back0:"",crop_list0:"",music_id0:"",video_id0:"",voteid0:"",voteismlt0:"",supervoteid0:"",cardid0:"",cardquantity0:"",cardlimit0:"",vid_type0:"",show_cover_pic0:"0",shortvideofileid0:"",copyright_type0:"0",releasefirst0:"",platform0:"",reprint_permit_type0:"",allow_reprint0:"",allow_reprint_modify0:"",original_article_type0:"",ori_white_list0:"",free_content0:"",fee0:"0",ad_id0:"",guide_words0:"",is_share_copyright0:"0",share_copyright_url0:"",source_article_type0:"",reprint_recommend_title0:"",reprint_recommend_content0:"",share_page_type0:"0",share_imageinfo0:'{"list":[]}',share_video_id0:"",dot0:"{}",share_voice_id0:"",insert_ad_mode0:"",categories_list0:"[]"}),K=await fetch("https://mp.weixin.qq.com/cgi-bin/operate_appmsg?t=ajax-response&sub=create&type=77&token="+encodeURIComponent(G)+"&lang=zh_CN",{method:"POST",credentials:"include",headers:{"Content-Type":"application/x-www-form-urlencoded"},body:V});var X=await K.text(),Q=null;try{Q=JSON.parse(X)}catch(q){}if(!K.ok||!Q||!Q.appMsgId){var Z=Q&&(Q.ret!=null?Q.ret:Q.base_resp&&Q.base_resp.ret),$={"-6":"请输入验证码","-8":"请输入验证码","-1":"系统错误,请注意备份内容后重试","-2":"参数错误,请注意备份内容后重试","-99":"内容超出字数,请调整","200003":"登录态超时,请重新登录","64507":"内容不能包含外部链接","64702":"标题超出 64 字长度限制","64705":"内容超出字数,请调整"},A=Z!=null&&$[String(Z)]||"发布失败(错误码:"+Z+"):"+X.slice(0,200);return{ok:!1,stage:"publish",status:K.status,message:A}}const F="https://mp.weixin.qq.com/cgi-bin/appmsg?t=media/appmsg_edit&action=edit&type=77&appmsgid="+Q.appMsgId+"&token="+encodeURIComponent(G)+"&lang=zh_CN";return{ok:!0,id:String(Q.appMsgId),url:F,draft:!0}}},weixinAuthProfile={home:weixinProfile.home,checkAuth:weixinProfile.checkAuth};J({site:"weixin",name:"article",access:"write",description:"通过 API 把文章发布到微信公众号草稿箱。正文默认 Markdown,外链图片自动转存到微信 CDN。",domain:"mp.weixin.qq.com",strategy:P.COOKIE,browser:!0,args:[{name:"title",positional:!0,required:!0,help:"文章标题(最长 64 字)"},{name:"text",positional:!0,help:"文章正文(默认 Markdown;加 --html 则当 HTML 处理)"},{name:"file",help:"正文文件路径(UTF-8,默认 Markdown)"},{name:"html",type:"boolean",help:"把正文当 HTML 处理而不是 Markdown"},{name:"draft",type:"boolean",help:"仅保存草稿(微信公众号目前只支持草稿,此参数保留兼容性)"},{name:"execute",type:"boolean",help:"实际执行发布。不加此参数时命令拒绝写入。"}],columns:["status","outcome","message","target_type","target","created_target","created_url"],func:async(B,L)=>{if(!B)throw new S("微信公众号 article 命令需要浏览器会话。");R(L);const z=String(L.title??"").trim();if(!z)throw new W("INVALID_INPUT","文章标题不能为空。");const D=await C(L),G=!0,H=await T(B,{title:z,body:D,format:L.html?"html":"markdown",draftOnly:G,profile:weixinProfile}),V=H.images.uploaded.length|0,K=H.images.failed.length|0;let X="已保存微信公众号草稿";if(V||K)X+="·图片:"+V+" 张已转存"+(K?","+K+" 张失败":"");return b(X,"article","","draft",{created_target:"article:"+H.id,created_url:H.url})}});
|
|
@@ -0,0 +1,152 @@
|
|
|
1
|
+
import{cli as Y,Strategy as Z}from"@jackwener/opencli/registry";import{CommandExecutionError as J}from"@jackwener/opencli/errors";const $="mp.weixin.qq.com",A="https://mp.weixin.qq.com/";async function F(q){return q.evaluate("(window.location.href.match(/token=(\\d+)/)||[])[1]")}async function H(q){await q.goto(A);await q.wait(3);const z=await F(q);if(!z)throw new J("Could not extract session token. Please log in to mp.weixin.qq.com");await q.goto(`https://mp.weixin.qq.com/cgi-bin/appmsg?t=media/appmsg_edit_v2&action=edit&isNew=1&type=77&token=${z}&lang=zh_CN`);for(let B=0;B<15;B++){if(await q.evaluate("!!document.querySelector('.ProseMirror')"))break;await q.wait(1)}await q.wait(2)}async function L(q,z,B){return q.evaluate(`(() => {
|
|
2
|
+
var el = document.querySelector(${JSON.stringify(z)});
|
|
3
|
+
if (!el) return { ok: false, reason: 'not found: ' + ${JSON.stringify(z)} };
|
|
4
|
+
el.focus();
|
|
5
|
+
var proto = el.tagName === 'TEXTAREA' ? HTMLTextAreaElement.prototype : HTMLInputElement.prototype;
|
|
6
|
+
var setter = Object.getOwnPropertyDescriptor(proto, 'value');
|
|
7
|
+
if (setter && setter.set) setter.set.call(el, ${JSON.stringify(B)});
|
|
8
|
+
else el.value = ${JSON.stringify(B)};
|
|
9
|
+
el.dispatchEvent(new Event('input', { bubbles: true }));
|
|
10
|
+
return { ok: true };
|
|
11
|
+
})()`)}async function V(q,z,B){const K=await q.evaluate(`(async () => {
|
|
12
|
+
var el = document.querySelector(${JSON.stringify(z)});
|
|
13
|
+
if (!el) return { ok: false, reason: 'not found: ' + ${JSON.stringify(z)} };
|
|
14
|
+
el.scrollIntoView({ block: 'center' });
|
|
15
|
+
el.focus();
|
|
16
|
+
|
|
17
|
+
var sel = window.getSelection();
|
|
18
|
+
var range = document.createRange();
|
|
19
|
+
|
|
20
|
+
// 清空
|
|
21
|
+
range.selectNodeContents(el);
|
|
22
|
+
sel.removeAllRanges();
|
|
23
|
+
sel.addRange(range);
|
|
24
|
+
var cleared = el.dispatchEvent(new InputEvent('beforeinput', {
|
|
25
|
+
bubbles: true, cancelable: true,
|
|
26
|
+
inputType: 'deleteContentBackward',
|
|
27
|
+
}));
|
|
28
|
+
// 兜底:execCommand delete
|
|
29
|
+
if ((el.innerText || '').length > 0) {
|
|
30
|
+
range.selectNodeContents(el);
|
|
31
|
+
sel.removeAllRanges();
|
|
32
|
+
sel.addRange(range);
|
|
33
|
+
try { document.execCommand('delete', false); } catch (e) {}
|
|
34
|
+
}
|
|
35
|
+
// 强制清空兜底
|
|
36
|
+
if ((el.innerText || '').length > 0) {
|
|
37
|
+
el.innerHTML = '';
|
|
38
|
+
el.dispatchEvent(new Event('input', { bubbles: true }));
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
// 把光标移到末尾,准备插入
|
|
42
|
+
range.selectNodeContents(el);
|
|
43
|
+
range.collapse(false);
|
|
44
|
+
sel.removeAllRanges();
|
|
45
|
+
sel.addRange(range);
|
|
46
|
+
|
|
47
|
+
// 派发 insertText(ProseMirror 拦截 beforeinput)
|
|
48
|
+
var beforeInput = new InputEvent('beforeinput', {
|
|
49
|
+
bubbles: true, cancelable: true,
|
|
50
|
+
inputType: 'insertText',
|
|
51
|
+
data: ${JSON.stringify(B)},
|
|
52
|
+
});
|
|
53
|
+
el.dispatchEvent(beforeInput);
|
|
54
|
+
el.dispatchEvent(new InputEvent('input', {
|
|
55
|
+
bubbles: true,
|
|
56
|
+
data: ${JSON.stringify(B)},
|
|
57
|
+
}));
|
|
58
|
+
// 兜底:execCommand insertText(老版 UEditor 仍可能用)
|
|
59
|
+
if ((el.innerText || '').length < ${JSON.stringify(B)}.length / 2) {
|
|
60
|
+
try {
|
|
61
|
+
document.execCommand('insertText', false, ${JSON.stringify(B)});
|
|
62
|
+
} catch (e) {}
|
|
63
|
+
}
|
|
64
|
+
return { ok: true, textLen: (el.innerText || '').length };
|
|
65
|
+
})()`);await q.wait(1);return K}async function j(q,z){const B=await import("node:fs"),G=(await import("node:path")).default.resolve(z);if(!B.default.existsSync(G))throw new J(`Image not found: ${G}`);if(!q.setFileInput)throw new J("Image upload requires Browser Bridge with CDP support");await q.evaluate(`(() => {
|
|
66
|
+
var li = document.querySelector('#js_editor_insertimage')
|
|
67
|
+
|| document.querySelector('.jsInsertIcon.img');
|
|
68
|
+
if (li) li.click();
|
|
69
|
+
})()`);await q.wait(1);await q.evaluate(`(() => {
|
|
70
|
+
var items = document.querySelectorAll('.js_img_dropdown_menu .tpl_dropdown_menu_item, .js_img_dropdown_menu li');
|
|
71
|
+
for (var i = 0; i < items.length; i++) {
|
|
72
|
+
var t = (items[i].textContent || '').trim();
|
|
73
|
+
if (t.includes('本地上传') || t.includes('上传')) { items[i].click(); return; }
|
|
74
|
+
}
|
|
75
|
+
if (items[0]) items[0].click();
|
|
76
|
+
})()`);await q.wait(1);await q.setFileInput([G],'input[type="file"][name="file"]');await q.wait(8);if(await q.evaluate(`(() => {
|
|
77
|
+
var editor = document.querySelector('.rich_media_content')
|
|
78
|
+
|| document.querySelector('#ueditor_0');
|
|
79
|
+
return editor ? editor.querySelectorAll('img[src*="mmbiz"]').length : 0;
|
|
80
|
+
})()`)===0)throw new J("Image did not upload to WeChat CDN")}async function D(q){await q.evaluate('document.querySelector("#js_cover_area")?.scrollIntoView()');await q.wait(1);await q.evaluate('document.querySelector(".js_cover_btn_area")?.click()');await q.wait(1);await q.evaluate(`(() => {
|
|
81
|
+
var links = document.querySelectorAll('a.pop-opr__button, button.pop-opr__button');
|
|
82
|
+
for (var i = 0; i < links.length; i++) {
|
|
83
|
+
var t = (links[i].textContent || '').trim();
|
|
84
|
+
if (t.includes('从正文选择')) { links[i].click(); return; }
|
|
85
|
+
}
|
|
86
|
+
})()`);await q.wait(2);await q.evaluate(`(() => {
|
|
87
|
+
// 新版可能没有 .weui-desktop-dialog_img-picker 包裹,用更通用的选择器
|
|
88
|
+
var img = document.querySelector('.appmsg_content_img')
|
|
89
|
+
|| document.querySelector('.weui-desktop-dialog img[src*="mmbiz"]')
|
|
90
|
+
|| document.querySelector('.weui-desktop-dialog_img-picker .appmsg_content_img');
|
|
91
|
+
if (img) img.click();
|
|
92
|
+
})()`);await q.wait(1);await q.evaluate(`(() => {
|
|
93
|
+
var btns = document.querySelectorAll('button');
|
|
94
|
+
for (var i = 0; i < btns.length; i++) {
|
|
95
|
+
if ((btns[i].textContent || '').trim() === '下一步' && !btns[i].disabled) { btns[i].click(); return; }
|
|
96
|
+
}
|
|
97
|
+
})()`);for(let B=0;B<8;B++){await q.wait(2);if(await q.evaluate(`(() => {
|
|
98
|
+
var btns = document.querySelectorAll('button');
|
|
99
|
+
for (var i = 0; i < btns.length; i++) {
|
|
100
|
+
if ((btns[i].textContent || '').trim() === '确认' && btns[i].offsetHeight > 0 && !btns[i].disabled) return true;
|
|
101
|
+
}
|
|
102
|
+
return false;
|
|
103
|
+
})()`))break}await q.evaluate(`(() => {
|
|
104
|
+
var btns = document.querySelectorAll('button');
|
|
105
|
+
for (var i = 0; i < btns.length; i++) {
|
|
106
|
+
if ((btns[i].textContent || '').trim() === '确认' && btns[i].offsetHeight > 0 && !btns[i].disabled) { btns[i].click(); return; }
|
|
107
|
+
}
|
|
108
|
+
})()`);await q.wait(2);return await q.evaluate(`(() => {
|
|
109
|
+
var area = document.querySelector('#js_cover_area');
|
|
110
|
+
if (!area) return false;
|
|
111
|
+
var found = false;
|
|
112
|
+
area.querySelectorAll('*').forEach(function(el) {
|
|
113
|
+
var bg = window.getComputedStyle(el).backgroundImage;
|
|
114
|
+
if (bg && bg.includes('mmbiz')) found = true;
|
|
115
|
+
});
|
|
116
|
+
return found;
|
|
117
|
+
})()`)}async function O(q){if(!(await q.evaluate(`(() => {
|
|
118
|
+
var btns = document.querySelectorAll('span, button, a');
|
|
119
|
+
for (var i = 0; i < btns.length; i++) {
|
|
120
|
+
if ((btns[i].textContent || '').trim() === '保存为草稿') { btns[i].click(); return { ok: true }; }
|
|
121
|
+
}
|
|
122
|
+
return { ok: false };
|
|
123
|
+
})()`))?.ok)throw new J("Save draft button not found");for(let B=0;B<5;B++){await q.wait(2);if(await q.evaluate(`(() => {
|
|
124
|
+
var el = document.querySelector('#js_save_success');
|
|
125
|
+
if (el && window.getComputedStyle(el).display !== 'none') return true;
|
|
126
|
+
return document.body.innerText.includes('已保存');
|
|
127
|
+
})()`))return!0}return!1}export const createDraftCommand=Y({site:"weixin",name:"create-draft",access:"write",description:"创建微信公众号图文草稿",domain:$,strategy:Z.COOKIE,browser:!0,navigateBefore:!1,args:[{name:"title",required:!0,help:"文章标题 (最长64字)"},{name:"content",required:!0,positional:!0,help:"文章正文"},{name:"author",help:"作者名 (最长8字)"},{name:"cover-image",help:"封面图片路径 (会先上传到正文再设为封面)"},{name:"summary",help:"文章摘要"},{name:"timeout",type:"int",required:!1,default:180,help:"Max seconds for the overall command (default: 180)"}],columns:["status","detail"],func:async(q,z)=>{await H(q);if(!(await V(q,".title-editor__input .ProseMirror",z.title))?.ok){if(!(await L(q,"textarea#title",z.title))?.ok)throw new J("Failed to fill title")}if(z.author){if(!(await L(q,"input#author",z.author))?.ok)throw new J("Failed to fill author")}if(!(await V(q,".rich_media_content.ProseMirror, .rich_media_content .ProseMirror",z.content))?.ok)throw new J("Failed to fill content");if(z["cover-image"]){await j(q,z["cover-image"]);const R=await D(q)}if(z.summary)await L(q,"textarea#js_description",z.summary);const G=await q.evaluate(`(() => {
|
|
128
|
+
var t = document.querySelector('.title-editor__input .ProseMirror');
|
|
129
|
+
var c = document.querySelector('.rich_media_content.ProseMirror, .rich_media_content .ProseMirror');
|
|
130
|
+
var tt = document.querySelector('textarea#title');
|
|
131
|
+
return {
|
|
132
|
+
titleLen: t ? (t.innerText || '').length : 0,
|
|
133
|
+
contentLen: c ? (c.innerText || '').length : 0,
|
|
134
|
+
titleText: t ? (t.innerText || '').slice(0, 40) : '',
|
|
135
|
+
contentText: c ? (c.innerText || '').slice(0, 40) : '',
|
|
136
|
+
textareaTitleValue: tt ? (tt.value || '').slice(0, 40) : '(no textarea#title)',
|
|
137
|
+
};
|
|
138
|
+
})()`);if(G.titleLen===0||G.contentLen===0)throw new J(`ProseMirror state not synced: title_len=${G.titleLen}, content_len=${G.contentLen}. title="${G.titleText}" content="${G.contentText}"`);await L(q,"textarea#title",z.title);await q.wait(3);const U=await O(q);await q.wait(3);const Q=await q.evaluate(`(() => {
|
|
139
|
+
var t = document.querySelector('.title-editor__input .ProseMirror');
|
|
140
|
+
var c = document.querySelector('.rich_media_content.ProseMirror, .rich_media_content .ProseMirror');
|
|
141
|
+
var tt = document.querySelector('textarea#title');
|
|
142
|
+
var url = window.location.href;
|
|
143
|
+
var appmsgidMatch = url.match(/appmsgid=(\\d+)/);
|
|
144
|
+
return {
|
|
145
|
+
titleLen: t ? (t.innerText || '').length : 0,
|
|
146
|
+
contentLen: c ? (c.innerText || '').length : 0,
|
|
147
|
+
textareaTitleValue: tt ? (tt.value || '').slice(0, 40) : '',
|
|
148
|
+
bodyHasUnsavedWarning: document.body.innerText.includes('未保存'),
|
|
149
|
+
url: url,
|
|
150
|
+
appmsgid: appmsgidMatch ? appmsgidMatch[1] : null,
|
|
151
|
+
};
|
|
152
|
+
})()`);return[{status:U?"draft saved":"save attempted, check browser to confirm",detail:`"${z.title}"${z.author?` by ${z.author}`:""}${z["cover-image"]?" (with cover)":""} appmsgid=${Q.appmsgid||"?"} title_len=${G.titleLen} content_len=${G.contentLen} pm_title_len_after_save=${Q.titleLen} content_len_after_save=${Q.contentLen}`}]}});
|