publishport-opencli 1.0.20 → 1.0.21
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/clis/12306/me.js +2 -2
- package/clis/12306/orders.js +3 -3
- package/clis/12306/passengers.js +3 -3
- package/clis/12306/price.js +1 -1
- package/clis/12306/stations.js +1 -1
- package/clis/12306/train.js +1 -1
- package/clis/12306/trains.js +1 -1
- package/clis/12306/utils.js +1 -1
- package/clis/1688/download.js +1 -1
- package/clis/1688/item.js +4 -4
- package/clis/1688/search.js +4 -4
- package/clis/1688/store.js +4 -4
- package/clis/1point3acres/forum.js +1 -1
- package/clis/1point3acres/forums.js +1 -1
- package/clis/1point3acres/notifications.js +1 -1
- package/clis/1point3acres/search.js +1 -1
- package/clis/1point3acres/thread.js +2 -2
- package/clis/1point3acres/user.js +1 -1
- package/clis/1point3acres/utils.js +2 -2
- package/clis/36kr/article.js +2 -2
- package/clis/36kr/hot.js +2 -2
- package/clis/36kr/news.js +1 -1
- package/clis/36kr/search.js +2 -2
- package/clis/51job/company.js +2 -2
- package/clis/51job/detail.js +2 -2
- package/clis/51job/hot.js +1 -1
- package/clis/51job/search.js +1 -1
- package/clis/51job/utils.js +7 -7
- package/clis/_atlassian/shared.js +9 -9
- package/clis/_shared/article/auth.js +4 -4
- package/clis/_shared/article/douban-md2draft.js +4 -4
- package/clis/_shared/article/format.js +1 -1
- package/clis/_shared/article/images.js +7 -7
- package/clis/_shared/article/login.js +1 -1
- package/clis/_shared/article/publish.js +11 -11
- package/clis/_shared/common.js +1 -1
- package/clis/_shared/content-guard.js +1 -1
- package/clis/_shared/desktop-commands.js +1 -1
- package/clis/_shared/file-inject.js +12 -12
- package/clis/_shared/self-hosted-sites.js +2 -2
- package/clis/_shared/site-auth.js +1 -1
- package/clis/_shared/token-auth.js +2 -2
- package/clis/_shared/video-publish.js +9 -9
- package/clis/amazon/offer.js +3 -3
- package/clis/amazon/product.js +5 -5
- package/clis/amazon/shared.js +6 -6
- package/clis/antigravity/_actions.js +13 -13
- package/clis/antigravity/audit-extras.js +10 -10
- package/clis/antigravity/delete.js +1 -1
- package/clis/antigravity/model.js +6 -6
- package/clis/antigravity/new.js +2 -2
- package/clis/antigravity/read.js +2 -2
- package/clis/antigravity/rename.js +1 -1
- package/clis/antigravity/send.js +3 -3
- package/clis/antigravity/serve.js +17 -17
- package/clis/antigravity/storage.js +6 -6
- package/clis/antigravity/watch.js +2 -2
- package/clis/apple-podcasts/episodes.js +1 -1
- package/clis/apple-podcasts/top.js +1 -1
- package/clis/apple-podcasts/utils.js +1 -1
- package/clis/archive/item.js +1 -1
- package/clis/archive/search.js +1 -1
- package/clis/archive/snapshots.js +1 -1
- package/clis/archive/wayback.js +1 -1
- package/clis/arxiv/author.js +1 -1
- package/clis/arxiv/utils.js +1 -1
- package/clis/autohome/brand.js +1 -1
- package/clis/autohome/score.js +1 -1
- package/clis/autohome/utils.js +1 -1
- package/clis/baijiahao/article.js +1 -1
- package/clis/baijiahao/lists.js +1 -1
- package/clis/baijiahao/login.js +1 -1
- package/clis/baijiahao/publish.js +9 -9
- package/clis/baijiahao/stats.js +1 -1
- package/clis/baijiahao/whoami.js +1 -1
- package/clis/band/bands.js +2 -2
- package/clis/band/mentions.js +2 -2
- package/clis/band/post.js +4 -4
- package/clis/band/posts.js +3 -3
- package/clis/barchart/flow.js +3 -3
- package/clis/barchart/greeks.js +2 -2
- package/clis/barchart/quote.js +3 -3
- package/clis/bbc/news.js +1 -1
- package/clis/bbc/topic.js +1 -1
- package/clis/bbc/utils.js +1 -1
- package/clis/bilibili/article.js +1 -1
- package/clis/bilibili/categories.js +1 -1
- package/clis/bilibili/coin.js +1 -1
- package/clis/bilibili/comment-del.js +1 -1
- package/clis/bilibili/comment-like.js +1 -1
- package/clis/bilibili/comment.js +1 -1
- package/clis/bilibili/comments.js +1 -1
- package/clis/bilibili/dm-list.js +1 -1
- package/clis/bilibili/dm-read.js +1 -1
- package/clis/bilibili/dm-send.js +1 -1
- package/clis/bilibili/download.js +2 -2
- package/clis/bilibili/drafts.js +1 -1
- package/clis/bilibili/dynamic-post.js +3 -3
- package/clis/bilibili/favorite-add.js +1 -1
- package/clis/bilibili/favorite.js +1 -1
- package/clis/bilibili/feed.js +2 -2
- package/clis/bilibili/follow.js +1 -1
- package/clis/bilibili/following.js +1 -1
- package/clis/bilibili/like.js +1 -1
- package/clis/bilibili/partitions.js +1 -1
- package/clis/bilibili/stats.js +1 -1
- package/clis/bilibili/subtitle.js +3 -3
- package/clis/bilibili/summary.js +1 -1
- package/clis/bilibili/topics.js +1 -1
- package/clis/bilibili/unfollow.js +1 -1
- package/clis/bilibili/upload.js +1 -1
- package/clis/bilibili/utils.js +10 -10
- package/clis/bilibili/video-drafts.js +1 -1
- package/clis/bilibili/video.js +1 -1
- package/clis/bloomberg/businessweek.js +4 -4
- package/clis/bloomberg/news.js +2 -2
- package/clis/bloomberg/utils.js +13 -13
- package/clis/bluesky/post.js +1 -1
- package/clis/bluesky/shared.js +11 -11
- package/clis/bluesky/whoami.js +1 -1
- package/clis/booking/search.js +2 -2
- package/clis/boss/accept.js +1 -1
- package/clis/boss/applied.js +1 -1
- package/clis/boss/auth.js +1 -1
- package/clis/boss/batchgreet.js +1 -1
- package/clis/boss/bossinfo.js +1 -1
- package/clis/boss/chatlist.js +1 -1
- package/clis/boss/chatmsg.js +1 -1
- package/clis/boss/cities.js +1 -1
- package/clis/boss/detail.js +1 -1
- package/clis/boss/exchange.js +1 -1
- package/clis/boss/greet.js +1 -1
- package/clis/boss/interviews.js +1 -1
- package/clis/boss/invite.js +1 -1
- package/clis/boss/joblist.js +1 -1
- package/clis/boss/mark.js +1 -1
- package/clis/boss/me.js +2 -2
- package/clis/boss/recommend.js +1 -1
- package/clis/boss/resumedelete.js +1 -1
- package/clis/boss/resumelist.js +1 -1
- package/clis/boss/resumeupload.js +11 -11
- package/clis/boss/search.js +1 -1
- package/clis/boss/send.js +1 -1
- package/clis/boss/sendresume.js +1 -1
- package/clis/boss/stats.js +1 -1
- package/clis/boss/unread.js +1 -1
- package/clis/boss/utils.js +13 -13
- package/clis/chaoxing/assignments.js +1 -1
- package/clis/chaoxing/exams.js +1 -1
- package/clis/chaoxing/utils.js +9 -9
- package/clis/chatgpt/ask.js +1 -1
- package/clis/chatgpt/auth.js +2 -2
- package/clis/chatgpt/detail.js +1 -1
- package/clis/chatgpt/image.js +1 -1
- package/clis/chatgpt/read.js +1 -1
- package/clis/chatgpt/send.js +1 -1
- package/clis/chatgpt/utils.js +59 -59
- package/clis/chatgpt-app/ask.js +1 -1
- package/clis/chatgpt-app/send.js +1 -1
- package/clis/chatwise/model.js +6 -6
- package/clis/chess/analyze.js +1 -1
- package/clis/chess/game.js +1 -1
- package/clis/chess/games.js +1 -1
- package/clis/chess/stats.js +1 -1
- package/clis/chess/utils.js +1 -1
- package/clis/claude/ask.js +2 -2
- package/clis/claude/detail.js +1 -1
- package/clis/claude/new.js +1 -1
- package/clis/claude/read.js +1 -1
- package/clis/claude/send.js +1 -1
- package/clis/claude/utils.js +23 -23
- package/clis/cnblogs/article.js +1 -1
- package/clis/cnblogs/login.js +1 -1
- package/clis/cnblogs/stats.js +7 -7
- package/clis/cnblogs/whoami.js +1 -1
- package/clis/codex/_actions.js +3 -3
- package/clis/codex/archive.js +1 -1
- package/clis/codex/ask.js +6 -6
- package/clis/codex/model.js +8 -8
- package/clis/codex/pin.js +1 -1
- package/clis/codex/rename.js +4 -4
- package/clis/codex/send.js +3 -3
- package/clis/codex/sidebar.js +1 -1
- package/clis/coingecko/categories.js +1 -1
- package/clis/coingecko/coin.js +1 -1
- package/clis/coingecko/derivatives.js +1 -1
- package/clis/coingecko/exchanges.js +1 -1
- package/clis/coingecko/global.js +1 -1
- package/clis/coingecko/trending.js +1 -1
- package/clis/confluence/search.js +1 -1
- package/clis/coupang/product.js +3 -3
- package/clis/coupang/utils.js +1 -1
- package/clis/crates/crate.js +1 -1
- package/clis/crates/search.js +1 -1
- package/clis/crates/utils.js +1 -1
- package/clis/csdn/article.js +13 -13
- package/clis/csdn/columns.js +1 -1
- package/clis/csdn/login.js +1 -1
- package/clis/csdn/stats.js +4 -4
- package/clis/csdn/whoami.js +1 -1
- package/clis/cto51/article.js +1 -1
- package/clis/cto51/whoami.js +1 -1
- package/clis/ctrip/flight.js +2 -2
- package/clis/ctrip/hotel-search.js +3 -3
- package/clis/ctrip/hotel-suggest.js +1 -1
- package/clis/ctrip/search.js +1 -1
- package/clis/ctrip/utils.js +6 -6
- package/clis/cursor/ask.js +5 -5
- package/clis/cursor/composer.js +2 -2
- package/clis/cursor/model.js +4 -4
- package/clis/cursor/send.js +2 -2
- package/clis/dblp/author.js +1 -1
- package/clis/dblp/paper.js +1 -1
- package/clis/dblp/search.js +1 -1
- package/clis/dblp/utils.js +1 -1
- package/clis/dblp/venue.js +1 -1
- package/clis/deepseek/ask.js +1 -1
- package/clis/deepseek/auth.js +2 -2
- package/clis/deepseek/detail.js +1 -1
- package/clis/deepseek/new.js +1 -1
- package/clis/deepseek/read.js +1 -1
- package/clis/deepseek/send.js +7 -7
- package/clis/deepseek/utils.js +25 -25
- package/clis/defillama/protocol.js +1 -1
- package/clis/defillama/protocols.js +1 -1
- package/clis/defillama/utils.js +1 -1
- package/clis/devto/auth.js +2 -2
- package/clis/devto/latest.js +1 -1
- package/clis/devto/publish.js +5 -5
- package/clis/devto/read.js +2 -2
- package/clis/devto/stats.js +3 -3
- package/clis/dianping/auth.js +2 -2
- package/clis/dianping/cityResolver.js +2 -2
- package/clis/dianping/search.js +1 -1
- package/clis/dianping/shop.js +1 -1
- package/clis/dianping/utils.js +1 -1
- package/clis/discord-app/delete.js +3 -3
- package/clis/discord-app/read.js +1 -1
- package/clis/discord-app/thread-read.js +1 -1
- package/clis/discord-web/auth.js +2 -2
- package/clis/discord-web/send.js +5 -5
- package/clis/dockerhub/image.js +1 -1
- package/clis/dockerhub/search.js +1 -1
- package/clis/dockerhub/utils.js +1 -1
- package/clis/dongchedi/koubei.js +1 -1
- package/clis/dongchedi/models.js +1 -1
- package/clis/dongchedi/score.js +1 -1
- package/clis/dongchedi/search.js +1 -1
- package/clis/dongchedi/series.js +1 -1
- package/clis/dongchedi/specs.js +1 -1
- package/clis/dongchedi/utils.js +1 -1
- package/clis/douban/article.js +3 -3
- package/clis/douban/auth.js +2 -2
- package/clis/douban/download.js +1 -1
- package/clis/douban/utils.js +23 -23
- package/clis/doubao/auth.js +3 -3
- package/clis/doubao/utils.js +39 -39
- package/clis/doubao-app/ask.js +1 -1
- package/clis/doubao-app/utils.js +4 -4
- package/clis/douyin/_shared/browser-fetch.js +7 -7
- package/clis/douyin/_shared/draft-cache.js +1 -1
- package/clis/douyin/_shared/imagex-upload.js +1 -1
- package/clis/douyin/_shared/sts2.js +1 -1
- package/clis/douyin/_shared/text-extra.js +1 -1
- package/clis/douyin/_shared/tos-upload.js +4 -4
- package/clis/douyin/_shared/transcode.js +1 -1
- package/clis/douyin/_shared/vod-upload.js +4 -4
- package/clis/douyin/draft.js +18 -18
- package/clis/douyin/drafts.js +1 -1
- package/clis/douyin/publish-image.js +12 -12
- package/clis/douyin/publish.js +9 -9
- package/clis/douyin/search.js +3 -3
- package/clis/douyin/videos.js +1 -1
- package/clis/eastmoney/_secid.js +1 -1
- package/clis/eastmoney/announcement.js +1 -1
- package/clis/eastmoney/article.js +1 -1
- package/clis/eastmoney/convertible.js +1 -1
- package/clis/eastmoney/etf.js +1 -1
- package/clis/eastmoney/holders.js +1 -1
- package/clis/eastmoney/index-board.js +1 -1
- package/clis/eastmoney/kline.js +1 -1
- package/clis/eastmoney/kuaixun.js +1 -1
- package/clis/eastmoney/longhu.js +1 -1
- package/clis/eastmoney/money-flow.js +1 -1
- package/clis/eastmoney/northbound.js +1 -1
- package/clis/eastmoney/quote.js +1 -1
- package/clis/eastmoney/rank.js +1 -1
- package/clis/eastmoney/sectors.js +1 -1
- package/clis/endoflife/product.js +1 -1
- package/clis/endoflife/utils.js +1 -1
- package/clis/facebook/comment.js +8 -8
- package/clis/facebook/feed.js +4 -4
- package/clis/facebook/like.js +5 -5
- package/clis/facebook/notifications.js +3 -3
- package/clis/facebook/post.js +11 -11
- package/clis/facebook/search.js +3 -3
- package/clis/flathub/app.js +1 -1
- package/clis/flathub/search.js +1 -1
- package/clis/flathub/utils.js +1 -1
- package/clis/flomo/memos.js +1 -1
- package/clis/gemini/deep-research-result.js +4 -4
- package/clis/gemini/deep-research.js +1 -1
- package/clis/gemini/detail.js +1 -1
- package/clis/gemini/history.js +1 -1
- package/clis/gemini/image.js +2 -2
- package/clis/gemini/status.js +1 -1
- package/clis/gemini/utils.js +43 -43
- package/clis/geogebra/hexagon.js +1 -1
- package/clis/geogebra/info.js +3 -3
- package/clis/geogebra/triangle.js +1 -1
- package/clis/geogebra/utils.js +11 -11
- package/clis/ghost/login.js +1 -1
- package/clis/ghost/shared.js +2 -2
- package/clis/gitee/auth.js +2 -2
- package/clis/github-trending/repos.js +1 -1
- package/clis/google/news.js +1 -1
- package/clis/google/search.js +2 -2
- package/clis/google/suggest.js +1 -1
- package/clis/google/trends.js +1 -1
- package/clis/google/utils.js +1 -1
- package/clis/goproxy/module.js +1 -1
- package/clis/goproxy/utils.js +1 -1
- package/clis/goproxy/versions.js +1 -1
- package/clis/gov-policy/recent.js +2 -2
- package/clis/gov-policy/search.js +2 -2
- package/clis/grok/ask.js +1 -1
- package/clis/grok/detail.js +1 -1
- package/clis/grok/image.js +8 -8
- package/clis/grok/pin.js +1 -1
- package/clis/grok/send.js +1 -1
- package/clis/grok/status.js +1 -1
- package/clis/grok/utils.js +21 -21
- package/clis/guazi/browse.js +1 -1
- package/clis/guazi/car.js +1 -1
- package/clis/guazi/utils.js +1 -1
- package/clis/hackernews/auth.js +2 -2
- package/clis/hackernews/comment.js +8 -8
- package/clis/hackernews/read.js +7 -7
- package/clis/hackernews/submit.js +7 -7
- package/clis/hashnode/auth.js +3 -3
- package/clis/hashnode/publish.js +14 -14
- package/clis/hf/auth.js +2 -2
- package/clis/hf/models.js +1 -1
- package/clis/hf/paper.js +1 -1
- package/clis/hf/spaces.js +1 -1
- package/clis/hf/top.js +1 -1
- package/clis/homebrew/cask.js +1 -1
- package/clis/homebrew/formula.js +1 -1
- package/clis/homebrew/popular.js +1 -1
- package/clis/homebrew/utils.js +1 -1
- package/clis/huodongxing/events.js +1 -1
- package/clis/hupu/detail.js +4 -4
- package/clis/hupu/hot.js +3 -3
- package/clis/hupu/reply.js +1 -1
- package/clis/hupu/search.js +1 -1
- package/clis/hupu/unlike.js +1 -1
- package/clis/hupu/utils.js +10 -10
- package/clis/imdb/person.js +2 -2
- package/clis/imdb/reviews.js +3 -3
- package/clis/imdb/search.js +2 -2
- package/clis/imdb/title.js +1 -1
- package/clis/imdb/top.js +1 -1
- package/clis/imdb/trending.js +1 -1
- package/clis/imdb/utils.js +13 -13
- package/clis/imooc/article.js +6 -6
- package/clis/imooc/login.js +1 -1
- package/clis/imooc/whoami.js +1 -1
- package/clis/indeed/job.js +2 -2
- package/clis/indeed/search.js +2 -2
- package/clis/indeed/utils.js +1 -1
- package/clis/infoq/article.js +2 -2
- package/clis/infoq/login.js +1 -1
- package/clis/infoq/whoami.js +1 -1
- package/clis/instagram/_shared/private-publish.js +4 -4
- package/clis/instagram/_shared/protocol-capture.js +9 -9
- package/clis/instagram/detail.js +3 -3
- package/clis/instagram/post.js +25 -25
- package/clis/instagram/reel.js +18 -18
- package/clis/instagram/story.js +4 -4
- package/clis/instagram/user.js +2 -2
- package/clis/jd/item.js +65 -65
- package/clis/jianshu/article.js +1 -1
- package/clis/jianshu/login.js +1 -1
- package/clis/jianshu/notebooks.js +1 -1
- package/clis/jianshu/whoami.js +1 -1
- package/clis/jianyu/search.js +6 -6
- package/clis/jianyu/shared/procurement-contract.js +1 -1
- package/clis/jike/api.js +6 -6
- package/clis/jike/auth.js +3 -3
- package/clis/jike/comment.js +1 -1
- package/clis/jike/create.js +6 -6
- package/clis/jike/feed.js +3 -3
- package/clis/jike/like.js +1 -1
- package/clis/jike/notifications.js +3 -3
- package/clis/jike/repost.js +13 -13
- package/clis/jike/search.js +3 -3
- package/clis/jimeng/auth.js +2 -2
- package/clis/jimeng/generate.js +10 -10
- package/clis/jira/shared.js +1 -1
- package/clis/juejin/article.js +4 -4
- package/clis/juejin/categories.js +1 -1
- package/clis/juejin/hot.js +1 -1
- package/clis/juejin/login.js +1 -1
- package/clis/juejin/recommend.js +1 -1
- package/clis/juejin/stats.js +3 -3
- package/clis/juejin/tags.js +1 -1
- package/clis/juejin/utils.js +1 -1
- package/clis/juejin/whoami.js +1 -1
- package/clis/ke/utils.js +4 -4
- package/clis/kimi/_utils.js +7 -7
- package/clis/kimi/audit-extras.js +14 -14
- package/clis/kimi/auth.js +3 -3
- package/clis/kimi/chat.js +15 -15
- package/clis/kimi/storage.js +5 -5
- package/clis/kimi/ui.js +13 -13
- package/clis/kimi/usage.js +3 -3
- package/clis/kuaishou/auth.js +1 -1
- package/clis/kuaishou/publish.js +6 -6
- package/clis/lesswrong/_helpers.js +5 -5
- package/clis/lesswrong/comments.js +5 -5
- package/clis/lichess/top.js +1 -1
- package/clis/lichess/user.js +1 -1
- package/clis/lichess/utils.js +1 -1
- package/clis/linkedin/comment.js +1 -1
- package/clis/linkedin/connect.js +11 -11
- package/clis/linkedin/create.js +5 -5
- package/clis/linkedin/follow.js +1 -1
- package/clis/linkedin/inbox.js +1 -1
- package/clis/linkedin/job-detail.js +3 -3
- package/clis/linkedin/like.js +1 -1
- package/clis/linkedin/notifications.js +1 -1
- package/clis/linkedin/people-search.js +1 -1
- package/clis/linkedin/post-comments.js +1 -1
- package/clis/linkedin/post-detail.js +1 -1
- package/clis/linkedin/profile-analytics.js +1 -1
- package/clis/linkedin/profile-api.js +13 -13
- package/clis/linkedin/profile-experience.js +1 -1
- package/clis/linkedin/profile-projects.js +1 -1
- package/clis/linkedin/profile-read.js +3 -3
- package/clis/linkedin/reply.js +1 -1
- package/clis/linkedin/repost.js +1 -1
- package/clis/linkedin/safe-send.js +8 -8
- package/clis/linkedin/salesnav-inbox.js +5 -5
- package/clis/linkedin/salesnav-message.js +3 -3
- package/clis/linkedin/salesnav-search.js +4 -4
- package/clis/linkedin/salesnav-thread.js +1 -1
- package/clis/linkedin/search-api.js +3 -3
- package/clis/linkedin/search.js +8 -8
- package/clis/linkedin/social-api.js +31 -31
- package/clis/linkedin/timeline.js +3 -3
- package/clis/linkedin-learning/search.js +2 -2
- package/clis/linkedin-learning/trending.js +2 -2
- package/clis/linux-do/feed.js +4 -4
- package/clis/linux-do/topic-content.js +8 -8
- package/clis/lobsters/domain.js +1 -1
- package/clis/lobsters/read.js +7 -7
- package/clis/maimai/auth.js +2 -2
- package/clis/maimai/search-talents.js +4 -4
- package/clis/manus/_utils.js +1 -1
- package/clis/mastodon/login.js +1 -1
- package/clis/mastodon/post.js +1 -1
- package/clis/mastodon/shared.js +12 -12
- package/clis/mastodon/whoami.js +1 -1
- package/clis/maven/artifact.js +1 -1
- package/clis/maven/search.js +1 -1
- package/clis/maven/utils.js +1 -1
- package/clis/mdn/search.js +1 -1
- package/clis/medium/article.js +5 -5
- package/clis/medium/login.js +1 -1
- package/clis/medium/stats.js +3 -3
- package/clis/medium/tag.js +1 -1
- package/clis/medium/whoami.js +1 -1
- package/clis/mubu/notes.js +1 -1
- package/clis/mubu/utils.js +15 -15
- package/clis/note/auth.js +2 -2
- package/clis/note/note-utils.js +2 -2
- package/clis/note/publish.js +8 -8
- package/clis/notebooklm/add-source.js +8 -8
- package/clis/notebooklm/create.js +1 -1
- package/clis/notebooklm/generate-slides.js +1 -1
- package/clis/notebooklm/notes-get.js +1 -1
- package/clis/notebooklm/rpc.js +8 -8
- package/clis/notebooklm/source-fulltext.js +1 -1
- package/clis/notebooklm/utils.js +10 -10
- package/clis/nowcoder/auth.js +2 -2
- package/clis/nowcoder/comment.js +1 -1
- package/clis/nowcoder/comments.js +1 -1
- package/clis/nowcoder/dm-list.js +1 -1
- package/clis/nowcoder/dm-read.js +1 -1
- package/clis/nowcoder/dm-send.js +1 -1
- package/clis/nowcoder/drafts.js +1 -1
- package/clis/nowcoder/inbox.js +1 -1
- package/clis/nowcoder/like.js +1 -1
- package/clis/nowcoder/my.js +1 -1
- package/clis/nowcoder/post.js +1 -1
- package/clis/nowcoder/utils.js +13 -13
- package/clis/npm/downloads.js +1 -1
- package/clis/npm/package.js +1 -1
- package/clis/npm/search.js +1 -1
- package/clis/npm/utils.js +1 -1
- package/clis/nuget/package.js +1 -1
- package/clis/nuget/search.js +1 -1
- package/clis/nuget/utils.js +1 -1
- package/clis/nvd/cve.js +1 -1
- package/clis/oeis/search.js +1 -1
- package/clis/oeis/sequence.js +1 -1
- package/clis/oeis/utils.js +1 -1
- package/clis/ones/common.js +6 -6
- package/clis/ones/enrich-tasks.js +1 -1
- package/clis/ones/my-tasks.js +1 -1
- package/clis/ones/resolve-labels.js +1 -1
- package/clis/ones/task-helpers.js +1 -1
- package/clis/ones/task.js +1 -1
- package/clis/ones/worklog.js +7 -7
- package/clis/openalex/search.js +1 -1
- package/clis/openalex/utils.js +1 -1
- package/clis/openalex/work.js +1 -1
- package/clis/openfda/drug-label.js +1 -1
- package/clis/openfda/food-recall.js +1 -1
- package/clis/openfda/utils.js +1 -1
- package/clis/openreview/author.js +1 -1
- package/clis/openreview/paper.js +1 -1
- package/clis/openreview/reviews.js +3 -3
- package/clis/openreview/search.js +1 -1
- package/clis/openreview/utils.js +1 -1
- package/clis/openreview/venue.js +1 -1
- package/clis/oschina/article.js +1 -1
- package/clis/oschina/catalogs.js +1 -1
- package/clis/oschina/login.js +1 -1
- package/clis/oschina/stats.js +6 -6
- package/clis/oschina/whoami.js +1 -1
- package/clis/osv/query.js +1 -1
- package/clis/osv/utils.js +1 -1
- package/clis/osv/vulnerability.js +1 -1
- package/clis/packagist/package.js +1 -1
- package/clis/packagist/search.js +1 -1
- package/clis/packagist/utils.js +1 -1
- package/clis/pinterest/api.js +1 -1
- package/clis/pinterest/auth.js +1 -1
- package/clis/pinterest/boards.js +1 -1
- package/clis/pinterest/client.js +6 -6
- package/clis/pinterest/publish.js +5 -5
- package/clis/pixiv/auth.js +2 -2
- package/clis/pixiv/download.js +1 -1
- package/clis/pixiv/illusts.js +1 -1
- package/clis/pixiv/search.js +1 -1
- package/clis/pixiv/utils.js +3 -3
- package/clis/powerchina/auth.js +2 -2
- package/clis/powerchina/search.js +1 -1
- package/clis/producthunt/browse.js +2 -2
- package/clis/producthunt/hot.js +2 -2
- package/clis/producthunt/posts.js +1 -1
- package/clis/producthunt/today.js +1 -1
- package/clis/producthunt/utils.js +1 -1
- package/clis/pypi/downloads.js +1 -1
- package/clis/pypi/package.js +1 -1
- package/clis/pypi/utils.js +1 -1
- package/clis/qiita/auth.js +1 -1
- package/clis/qiita/gql.js +6 -6
- package/clis/qiita/publish.js +4 -4
- package/clis/qiita/stats.js +4 -4
- package/clis/qoder/_utils.js +16 -16
- package/clis/qoder/composer.js +1 -1
- package/clis/qoder/quest.js +1 -1
- package/clis/qoder/ui.js +14 -14
- package/clis/quark/auth.js +2 -2
- package/clis/quark/utils.js +2 -2
- package/clis/quora/answer-comments.js +3 -3
- package/clis/quora/create-answer.js +4 -4
- package/clis/quora/create-question.js +3 -3
- package/clis/quora/shared.js +17 -17
- package/clis/quora/whoami.js +1 -1
- package/clis/qwen/ask.js +1 -1
- package/clis/qwen/auth.js +3 -3
- package/clis/qwen/detail.js +1 -1
- package/clis/qwen/image.js +5 -5
- package/clis/qwen/status.js +1 -1
- package/clis/qwen/utils.js +16 -16
- package/clis/reddit/home.js +3 -3
- package/clis/reddit/read.js +10 -10
- package/clis/reddit/reply.js +4 -4
- package/clis/reddit/submit.js +11 -11
- package/clis/reddit/subreddit-info.js +3 -3
- package/clis/reddit/subscribed.js +4 -4
- package/clis/reddit/whoami.js +2 -2
- package/clis/rednote/comments.js +1 -1
- package/clis/rednote/download.js +1 -1
- package/clis/rednote/feed.js +1 -1
- package/clis/rednote/note.js +1 -1
- package/clis/rednote/notifications.js +2 -2
- package/clis/rednote/search.js +2 -2
- package/clis/rest-countries/country.js +1 -1
- package/clis/rest-countries/region.js +1 -1
- package/clis/rest-countries/utils.js +1 -1
- package/clis/reuters/article-detail.js +1 -1
- package/clis/reuters/auth.js +3 -3
- package/clis/reuters/search.js +1 -1
- package/clis/reuters/utils.js +4 -4
- package/clis/rfc/rfc.js +1 -1
- package/clis/rfc/utils.js +1 -1
- package/clis/rubygems/gem.js +1 -1
- package/clis/rubygems/search.js +1 -1
- package/clis/rubygems/utils.js +1 -1
- package/clis/segmentfault/article.js +3 -3
- package/clis/segmentfault/channels.js +1 -1
- package/clis/segmentfault/login.js +1 -1
- package/clis/segmentfault/stats.js +4 -4
- package/clis/segmentfault/tags.js +1 -1
- package/clis/segmentfault/whoami.js +1 -1
- package/clis/semanticscholar/citations.js +1 -1
- package/clis/semanticscholar/paper.js +1 -1
- package/clis/semanticscholar/recommendations.js +1 -1
- package/clis/semanticscholar/search.js +1 -1
- package/clis/semanticscholar/utils.js +1 -1
- package/clis/sinafinance/news.js +1 -1
- package/clis/sinafinance/stock-rank.js +1 -1
- package/clis/sinafinance/stock.js +1 -1
- package/clis/slock/attachment-download.js +1 -1
- package/clis/slock/attachment-upload.js +7 -7
- package/clis/slock/attachment-url.js +1 -1
- package/clis/slock/auth-verify.js +1 -1
- package/clis/slock/bookmark-add.js +1 -1
- package/clis/slock/bookmark-remove.js +1 -1
- package/clis/slock/channel-action.js +1 -1
- package/clis/slock/channel-create.js +1 -1
- package/clis/slock/channel-files.js +1 -1
- package/clis/slock/channel-list.js +1 -1
- package/clis/slock/channel-mark.js +1 -1
- package/clis/slock/channel-members.js +1 -1
- package/clis/slock/channel-unarchive.js +1 -1
- package/clis/slock/dm-list.js +1 -1
- package/clis/slock/errors.js +1 -1
- package/clis/slock/in-page.js +28 -28
- package/clis/slock/inbox-done.js +5 -5
- package/clis/slock/inbox.js +1 -1
- package/clis/slock/message-read.js +22 -22
- package/clis/slock/message-search.js +10 -10
- package/clis/slock/message-send.js +25 -25
- package/clis/slock/reaction-add.js +1 -1
- package/clis/slock/reaction-remove.js +1 -1
- package/clis/slock/resolve.js +1 -1
- package/clis/slock/server-list.js +2 -2
- package/clis/slock/task-claim.js +4 -4
- package/clis/slock/task-convert.js +13 -13
- package/clis/slock/task-create.js +1 -1
- package/clis/slock/task-delete.js +5 -5
- package/clis/slock/task-get.js +5 -5
- package/clis/slock/task-list-server.js +4 -4
- package/clis/slock/task-list.js +5 -5
- package/clis/slock/task-status.js +3 -3
- package/clis/slock/task-unclaim.js +3 -3
- package/clis/slock/thread-follow.js +1 -1
- package/clis/slock/thread-state.js +1 -1
- package/clis/slock/unread-summary.js +5 -5
- package/clis/slock/whoami.js +1 -1
- package/clis/smzdm/search.js +3 -3
- package/clis/sohu/article.js +1 -1
- package/clis/sohu/attributes.js +1 -1
- package/clis/sohu/categories.js +1 -1
- package/clis/sohu/channels.js +1 -1
- package/clis/sohu/columns.js +1 -1
- package/clis/sohu/login.js +1 -1
- package/clis/sohu/stats.js +3 -3
- package/clis/sohu/topics.js +1 -1
- package/clis/sohu/whoami.js +1 -1
- package/clis/spotify/spotify.js +1 -1
- package/clis/stackoverflow/read.js +6 -6
- package/clis/stackoverflow/related.js +1 -1
- package/clis/stackoverflow/tag.js +1 -1
- package/clis/stackoverflow/user.js +1 -1
- package/clis/stackoverflow/utils.js +1 -1
- package/clis/steam/app.js +1 -1
- package/clis/steam/search.js +1 -1
- package/clis/steam/utils.js +1 -1
- package/clis/substack/auth.js +2 -2
- package/clis/substack/post-utils.js +2 -2
- package/clis/substack/publish.js +5 -5
- package/clis/suno/auth.js +2 -2
- package/clis/suno/download.js +5 -5
- package/clis/suno/generate.js +3 -3
- package/clis/suno/list.js +1 -1
- package/clis/suno/status.js +1 -1
- package/clis/suno/utils.js +29 -29
- package/clis/telegram/send.js +7 -7
- package/clis/telegram/shared.js +2 -2
- package/clis/telegram/whoami.js +1 -1
- package/clis/test-utils.js +1 -1
- package/clis/threads/post.js +23 -23
- package/clis/threads/shared.js +3 -3
- package/clis/threads/whoami.js +1 -1
- package/clis/tieba/hot.js +3 -3
- package/clis/tieba/posts.js +1 -1
- package/clis/tieba/read.js +2 -2
- package/clis/tieba/search.js +3 -3
- package/clis/tieba/utils.js +1 -1
- package/clis/tiktok/comment.js +2 -2
- package/clis/tiktok/creator-videos.js +3 -3
- package/clis/tiktok/explore.js +3 -3
- package/clis/tiktok/follow.js +8 -8
- package/clis/tiktok/following.js +4 -4
- package/clis/tiktok/friends.js +7 -7
- package/clis/tiktok/live.js +3 -3
- package/clis/tiktok/notifications.js +6 -6
- package/clis/tiktok/publish.js +17 -17
- package/clis/tiktok/unfollow.js +4 -4
- package/clis/tiktok/user.js +2 -2
- package/clis/tiktok/utils.js +1 -1
- package/clis/toutiao/article.js +1 -1
- package/clis/toutiao/articles.js +2 -2
- package/clis/toutiao/auth.js +2 -2
- package/clis/toutiao/hot.js +1 -1
- package/clis/toutiao/recommend.js +1 -1
- package/clis/toutiao/utils.js +2 -2
- package/clis/trae-solo/_actions.js +4 -4
- package/clis/trae-solo/_fs.js +5 -5
- package/clis/trae-solo/_state.js +2 -2
- package/clis/trae-solo/automation.js +4 -4
- package/clis/trae-solo/mode.js +4 -4
- package/clis/trae-solo/model.js +4 -4
- package/clis/trae-solo/renderer-storage.js +4 -4
- package/clis/trae-solo/settings.js +1 -1
- package/clis/trae-solo/skill-fs.js +1 -1
- package/clis/trae-solo/skill.js +12 -12
- package/clis/trae-solo/state-fs.js +2 -2
- package/clis/trae-solo/task-fs.js +5 -5
- package/clis/trae-solo/workspaces-fs.js +1 -1
- package/clis/tumblr/auth.js +2 -2
- package/clis/tumblr/publish.js +3 -3
- package/clis/tvmaze/search.js +1 -1
- package/clis/tvmaze/show.js +1 -1
- package/clis/tvmaze/utils.js +1 -1
- package/clis/twitter/accept.js +7 -7
- package/clis/twitter/article.js +7 -7
- package/clis/twitter/bookmark-folder.js +3 -3
- package/clis/twitter/bookmark-folders.js +3 -3
- package/clis/twitter/bookmarks.js +4 -4
- package/clis/twitter/delete.js +5 -5
- package/clis/twitter/device-follow.js +3 -3
- package/clis/twitter/dm-list.js +1 -1
- package/clis/twitter/dm-read.js +1 -1
- package/clis/twitter/dm-send.js +5 -5
- package/clis/twitter/dm-shared.js +3 -3
- package/clis/twitter/download.js +6 -6
- package/clis/twitter/followers.js +5 -5
- package/clis/twitter/following.js +2 -2
- package/clis/twitter/like.js +3 -3
- package/clis/twitter/likes.js +8 -8
- package/clis/twitter/list-add-core.js +9 -9
- package/clis/twitter/list-create.js +5 -5
- package/clis/twitter/list-remove-core.js +9 -9
- package/clis/twitter/list-tweets.js +7 -7
- package/clis/twitter/lists.js +6 -6
- package/clis/twitter/notifications.js +2 -2
- package/clis/twitter/post.js +24 -24
- package/clis/twitter/profile.js +7 -7
- package/clis/twitter/quote.js +7 -7
- package/clis/twitter/reply-dm.js +7 -7
- package/clis/twitter/reply.js +12 -12
- package/clis/twitter/retweet.js +3 -3
- package/clis/twitter/scheduled-delete.js +3 -3
- package/clis/twitter/scheduled-list.js +2 -2
- package/clis/twitter/scheduled-utils.js +3 -3
- package/clis/twitter/search.js +5 -5
- package/clis/twitter/shared.js +6 -6
- package/clis/twitter/thread.js +4 -4
- package/clis/twitter/timeline.js +3 -3
- package/clis/twitter/trending.js +2 -2
- package/clis/twitter/tweets.js +11 -11
- package/clis/twitter/unlike.js +3 -3
- package/clis/twitter/unretweet.js +3 -3
- package/clis/twitter/utils.js +6 -6
- package/clis/upwork/detail.js +2 -2
- package/clis/upwork/feed.js +2 -2
- package/clis/upwork/search.js +2 -2
- package/clis/upwork/utils.js +1 -1
- package/clis/v2ex/auth.js +2 -2
- package/clis/v2ex/daily.js +3 -3
- package/clis/v2ex/me.js +2 -2
- package/clis/v2ex/notifications.js +2 -2
- package/clis/vk/post.js +1 -1
- package/clis/vk/shared.js +2 -2
- package/clis/vk/whoami.js +1 -1
- package/clis/web/read.js +8 -8
- package/clis/wechat-channels/auth.js +2 -2
- package/clis/wechat-channels/publish.js +30 -30
- package/clis/weibo/article.js +1 -1
- package/clis/weibo/auth.js +3 -3
- package/clis/weibo/comments.js +1 -1
- package/clis/weibo/delete.js +2 -2
- package/clis/weibo/feed.js +3 -3
- package/clis/weibo/hot.js +1 -1
- package/clis/weibo/publish.js +10 -10
- package/clis/weibo/search.js +2 -2
- package/clis/weibo/user-posts.js +3 -3
- package/clis/weibo/user.js +2 -2
- package/clis/weibo/utils.js +3 -3
- package/clis/weixin/article.js +1 -1
- package/clis/weixin/create-draft.js +26 -26
- package/clis/weixin/download.js +2 -2
- package/clis/weixin/login.js +1 -1
- package/clis/weixin/search.js +2 -2
- package/clis/weixin/stats.js +3 -3
- package/clis/weixin/whoami.js +1 -1
- package/clis/weread/ai-outline.js +2 -2
- package/clis/weread/book-search.js +2 -2
- package/clis/weread/book.js +2 -2
- package/clis/weread/notebooks.js +1 -1
- package/clis/weread/search.js +1 -1
- package/clis/weread/shelf.js +1 -1
- package/clis/weread/utils.js +6 -6
- package/clis/weread-official/book.js +1 -1
- package/clis/weread-official/discover.js +1 -1
- package/clis/weread-official/list-apis.js +1 -1
- package/clis/weread-official/notes.js +1 -1
- package/clis/weread-official/readdata.js +1 -1
- package/clis/weread-official/review.js +1 -1
- package/clis/weread-official/search.js +1 -1
- package/clis/weread-official/shelf.js +1 -1
- package/clis/weread-official/utils.js +1 -1
- package/clis/wikidata/entity.js +1 -1
- package/clis/wikidata/search.js +1 -1
- package/clis/wikidata/utils.js +1 -1
- package/clis/wikipedia/page.js +1 -1
- package/clis/wikipedia/trending.js +1 -1
- package/clis/wikipedia/utils.js +1 -1
- package/clis/wordpress/login.js +1 -1
- package/clis/wordpress/publish.js +1 -1
- package/clis/wordpress/shared.js +3 -3
- package/clis/wordpress/whoami.js +1 -1
- package/clis/woshipm/article.js +1 -1
- package/clis/woshipm/login.js +1 -1
- package/clis/woshipm/stats.js +4 -4
- package/clis/woshipm/whoami.js +1 -1
- package/clis/wttr/current.js +1 -1
- package/clis/wttr/forecast.js +1 -1
- package/clis/wttr/utils.js +1 -1
- package/clis/xianyu/collect.js +1 -1
- package/clis/xianyu/inbox.js +1 -1
- package/clis/xianyu/item-stats.js +2 -2
- package/clis/xianyu/location.js +1 -1
- package/clis/xianyu/manage.js +1 -1
- package/clis/xianyu/messages.js +1 -1
- package/clis/xianyu/mtop.js +5 -5
- package/clis/xianyu/order.js +1 -1
- package/clis/xianyu/promote-stats.js +2 -2
- package/clis/xianyu/publish.js +17 -17
- package/clis/xianyu/rate.js +1 -1
- package/clis/xianyu/reply.js +1 -1
- package/clis/xianyu/search.js +8 -8
- package/clis/xianyu/seller-data.js +1 -1
- package/clis/xianyu/seller-list.js +1 -1
- package/clis/xianyu/user.js +1 -1
- package/clis/xiaoe/catalog.js +2 -2
- package/clis/xiaoe/content.js +2 -2
- package/clis/xiaoe/courses.js +2 -2
- package/clis/xiaohongshu/ask.js +6 -6
- package/clis/xiaohongshu/comments.js +6 -6
- package/clis/xiaohongshu/creator-note-detail.js +7 -7
- package/clis/xiaohongshu/creator-notes-summary.js +1 -1
- package/clis/xiaohongshu/creator-notes.js +13 -13
- package/clis/xiaohongshu/creator-profile.js +2 -2
- package/clis/xiaohongshu/creator-stats.js +2 -2
- package/clis/xiaohongshu/delete-note.js +7 -7
- package/clis/xiaohongshu/download.js +4 -4
- package/clis/xiaohongshu/feed.js +2 -2
- package/clis/xiaohongshu/follow.js +3 -3
- package/clis/xiaohongshu/human.js +3 -3
- package/clis/xiaohongshu/note-helpers.js +1 -1
- package/clis/xiaohongshu/note.js +2 -2
- package/clis/xiaohongshu/notifications.js +1 -1
- package/clis/xiaohongshu/publish-video.js +8 -8
- package/clis/xiaohongshu/publish.js +59 -59
- package/clis/xiaohongshu/search.js +8 -8
- package/clis/xiaohongshu/unfollow.js +4 -4
- package/clis/xiaohongshu/user-helpers.js +1 -1
- package/clis/xiaohongshu/user.js +2 -2
- package/clis/xiaoyuzhou/auth.js +3 -3
- package/clis/xiaoyuzhou/download.js +1 -1
- package/clis/xiaoyuzhou/utils.js +1 -1
- package/clis/xueqiu/article.js +4 -4
- package/clis/xueqiu/comments.js +4 -4
- package/clis/xueqiu/danjuan-utils.js +4 -4
- package/clis/xueqiu/earnings-date.js +1 -1
- package/clis/xueqiu/events.js +3 -3
- package/clis/xueqiu/hashtags.js +3 -3
- package/clis/xueqiu/stocks.js +3 -3
- package/clis/xueqiu/users.js +3 -3
- package/clis/xueqiu/utils.js +3 -3
- package/clis/yahoo-finance/quote.js +1 -1
- package/clis/yollomi/background.js +1 -1
- package/clis/yollomi/edit.js +1 -1
- package/clis/yollomi/face-swap.js +1 -1
- package/clis/yollomi/generate.js +1 -1
- package/clis/yollomi/object-remover.js +1 -1
- package/clis/yollomi/remove-bg.js +1 -1
- package/clis/yollomi/restore.js +1 -1
- package/clis/yollomi/try-on.js +1 -1
- package/clis/yollomi/upload.js +4 -4
- package/clis/yollomi/upscale.js +1 -1
- package/clis/yollomi/utils.js +4 -4
- package/clis/yollomi/video.js +1 -1
- package/clis/youtube/channel.js +4 -4
- package/clis/youtube/feed.js +2 -2
- package/clis/youtube/like.js +5 -5
- package/clis/youtube/playlist.js +7 -7
- package/clis/youtube/publish.js +11 -11
- package/clis/youtube/search.js +3 -3
- package/clis/youtube/subscribe.js +7 -7
- package/clis/youtube/subscriptions.js +1 -1
- package/clis/youtube/transcript-group.js +2 -2
- package/clis/youtube/transcript.js +13 -13
- package/clis/youtube/unlike.js +5 -5
- package/clis/youtube/unsubscribe.js +7 -7
- package/clis/youtube/utils.js +3 -3
- package/clis/youtube/video.js +4 -4
- package/clis/youtube/watch-later.js +2 -2
- package/clis/yuanbao/ask.js +18 -18
- package/clis/yuanbao/detail.js +1 -1
- package/clis/yuanbao/read.js +1 -1
- package/clis/yuanbao/shared.js +9 -9
- package/clis/yuanbao/status.js +1 -1
- package/clis/yuque/article.js +1 -1
- package/clis/yuque/whoami.js +1 -1
- package/clis/zhihu/answer-comments.js +2 -2
- package/clis/zhihu/answer-detail.js +3 -3
- package/clis/zhihu/answer.js +1 -1
- package/clis/zhihu/article-transform.js +1 -1
- package/clis/zhihu/article.js +1 -1
- package/clis/zhihu/auth.js +2 -2
- package/clis/zhihu/collection.js +3 -3
- package/clis/zhihu/collections.js +3 -3
- package/clis/zhihu/download.js +2 -2
- package/clis/zhihu/image-profile.js +6 -6
- package/clis/zhihu/paginate.js +3 -3
- package/clis/zhihu/pin.js +4 -4
- package/clis/zhihu/question.js +3 -3
- package/clis/zhihu/recommend.js +3 -3
- package/clis/zhihu/search.js +3 -3
- package/clis/zhihu/stats.js +3 -3
- package/clis/zhihu/user-arg.js +1 -1
- package/clis/zhihu/write-shared.js +7 -7
- package/clis/zlibrary/utils.js +6 -6
- package/clis/zsxq/auth.js +3 -3
- package/clis/zsxq/search.js +1 -1
- package/clis/zsxq/topic.js +1 -1
- package/clis/zsxq/utils.js +5 -5
- package/dist/src/adapter-source.js +1 -1
- package/dist/src/browser/analyze.js +1 -1
- package/dist/src/browser/article-extract.js +2 -2
- package/dist/src/browser/ax-snapshot.js +2 -2
- package/dist/src/browser/base-page.js +25 -25
- package/dist/src/browser/bridge.js +1 -1
- package/dist/src/browser/cdp.js +1 -1
- package/dist/src/browser/daemon-client.js +1 -1
- package/dist/src/browser/daemon-lifecycle.js +7 -7
- package/dist/src/browser/dom-helpers.js +35 -35
- package/dist/src/browser/dom-snapshot.js +19 -19
- package/dist/src/browser/errors.js +3 -3
- package/dist/src/browser/extract.js +5 -5
- package/dist/src/browser/find.js +13 -13
- package/dist/src/browser/fingerprint.js +2 -2
- package/dist/src/browser/html-tree.js +6 -6
- package/dist/src/browser/managed-chrome.js +1 -1
- package/dist/src/browser/network-cache.js +1 -1
- package/dist/src/browser/network-key.js +1 -1
- package/dist/src/browser/page.js +7 -7
- package/dist/src/browser/profile.js +2 -2
- package/dist/src/browser/proxy-test.js +8 -8
- package/dist/src/browser/shape-filter.js +1 -1
- package/dist/src/browser/shape.js +1 -1
- package/dist/src/browser/stealth.js +3 -3
- package/dist/src/browser/tabs.js +2 -2
- package/dist/src/browser/target-errors.js +1 -1
- package/dist/src/browser/target-resolver.js +23 -23
- package/dist/src/browser/trace.js +2 -2
- package/dist/src/browser/utils.js +1 -1
- package/dist/src/browser/verify-fixture.js +2 -2
- package/dist/src/browser-session-lock.js +1 -1
- package/dist/src/build-manifest.js +11 -11
- package/dist/src/capabilityRouting.js +1 -1
- package/dist/src/cli-argv-preprocess.js +1 -1
- package/dist/src/cli.js +32 -32
- package/dist/src/commanderAdapter.js +3 -3
- package/dist/src/commands/auth.js +3 -3
- package/dist/src/commands/daemon.js +1 -1
- package/dist/src/completion-fast.js +1 -1
- package/dist/src/completion.js +1 -1
- package/dist/src/constants.js +1 -1
- package/dist/src/convention-audit.js +2 -2
- package/dist/src/daemon-utils.js +1 -1
- package/dist/src/daemon.js +1 -1
- package/dist/src/discovery.js +2 -2
- package/dist/src/doctor.js +9 -9
- package/dist/src/download/article-download.js +15 -15
- package/dist/src/download/index.js +4 -4
- package/dist/src/download/media-download.js +1 -1
- package/dist/src/download/progress.js +3 -3
- package/dist/src/electron-apps.js +1 -1
- package/dist/src/errors.js +2 -2
- package/dist/src/execution.js +2 -2
- package/dist/src/external.js +1 -1
- package/dist/src/help.js +8 -8
- package/dist/src/hooks.js +1 -1
- package/dist/src/interceptor.js +21 -21
- package/dist/src/launcher.js +7 -7
- package/dist/src/logger.js +8 -8
- package/dist/src/main.js +7 -7
- package/dist/src/observation/artifact.js +5 -5
- package/dist/src/observation/retention.js +1 -1
- package/dist/src/output.js +2 -2
- package/dist/src/package-paths.js +1 -1
- package/dist/src/pipeline/executor.js +1 -1
- package/dist/src/pipeline/registry.js +1 -1
- package/dist/src/pipeline/steps/browser.js +1 -1
- package/dist/src/pipeline/steps/download.js +1 -1
- package/dist/src/pipeline/steps/fetch.js +6 -6
- package/dist/src/pipeline/steps/intercept.js +1 -1
- package/dist/src/pipeline/steps/tap.js +17 -17
- package/dist/src/pipeline/steps/transform.js +1 -1
- package/dist/src/pipeline/template.js +1 -1
- package/dist/src/plugin-manifest.js +1 -1
- package/dist/src/plugin-scaffold.js +19 -19
- package/dist/src/plugin.js +12 -12
- package/dist/src/rate-limit.js +1 -1
- package/dist/src/registry.js +1 -1
- package/dist/src/runtime-detect.js +1 -1
- package/dist/src/runtime.js +1 -1
- package/dist/src/scripts/framework.js +1 -1
- package/dist/src/scripts/interact.js +1 -1
- package/dist/src/scripts/store.js +1 -1
- package/dist/src/serialization.js +2 -2
- package/dist/src/session-lease.js +1 -1
- package/dist/src/snapshotFormatter.js +2 -2
- package/dist/src/tui.js +12 -12
- package/dist/src/user-runtime.js +1 -1
- package/dist/src/utils.d.ts +12 -0
- package/dist/src/utils.js +4 -4
- package/dist/src/validate.js +2 -2
- package/dist/src/verify.js +2 -2
- package/dist/src/version.js +1 -1
- package/package.json +1 -1
package/clis/baijiahao/lists.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{cli as
|
|
1
|
+
import{cli as s,Strategy as l}from"@jackwener/opencli/registry";import{CommandExecutionError as e}from"@jackwener/opencli/errors";import{gotoWritePage as m}from"../_shared/article/publish.js";import{baijiahaoProfile as u}from"./article.js";s({site:"baijiahao",name:"lists",access:"read",description:"列出当前账号在百家号已发布的文章(article_id + 标题 + 阅读/推荐量 + 是否可撤回),供发布后回查幂等、取 article_id。",domain:"baijiahao.baidu.com",strategy:l.COOKIE,browser:!0,args:[{name:"search",help:"按标题关键词过滤(可空)"},{name:"page",help:"页码,默认 1"},{name:"page_size",help:"每页条数,默认 10"}],columns:["article_id","title","read_amount","rec_amount","can_withdraw"],func:async(r,a)=>{if(!r)throw new e("百家号文章列举需要浏览器会话");await m(r,u.home);const i=typeof a.search==="string"?a.search:"",n=Number(a.page)>0?Number(a.page):1,c=Number(a.page_size)>0?Number(a.page_size):10,o=JSON.stringify({search:i,currentPage:n,pageSize:c}),t=await r.evaluate("(async () => {const I = "+o+";const er = await fetch('https://baijiahao.baidu.com/builder/rc/edit', { credentials: 'include' });const eh = await er.text();const m = eh.match(/window\\.__BJH__INIT__AUTH__\\s*=\\s*['\\\"]([^'\\\"]+)['\\\"]/);"+"if (!m) return { __error: '登录失效,请重新登录百家号' };"+"const token = m[1];const qs = new URLSearchParams({ currentPage: String(I.currentPage), pageSize: String(I.pageSize), search: I.search || '', type: '', collection: '', dynamic: '1' }).toString();const r = await fetch('https://baijiahao.baidu.com/pcui/article/lists?' + qs, { credentials: 'include', headers: { token } });let j = null; try { j = await r.json(); } catch (e) {}"+"if (!j || !j.data) return { __error: (j && j.errmsg) || ('列举失败 HTTP ' + r.status) };"+'const list = (j.data && j.data.list) || [];return { rows: list.map(a => ({ article_id: String(a.article_id == null ? "" : a.article_id), title: a.title || "", read_amount: a.read_amount == null ? "" : String(a.read_amount), rec_amount: a.rec_amount == null ? "" : String(a.rec_amount), can_withdraw: (a.withdraw_status && a.withdraw_status.can_withdraw != null) ? String(a.withdraw_status.can_withdraw) : "" })) };})()');if(t&&t.__error)throw new e("百家号文章列举失败:"+t.__error);return Array.isArray(t&&t.rows)?t.rows:[]}});
|
package/clis/baijiahao/login.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{registerArticleLogin as
|
|
1
|
+
import{registerArticleLogin as o}from"../_shared/article/login.js";import{baijiahaoProfile as i}from"./article.js";o({site:"baijiahao",domain:"baijiahao.baidu.com",profile:{home:i.home,checkAuth:i.checkAuth},loginDescription:"打开百家号登录页并等待浏览器完成登录(供桌面客户端引导登录)。"});
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{cli as
|
|
1
|
+
import{cli as d,Strategy as f}from"@jackwener/opencli/registry";import{ArgumentError as h,CommandExecutionError as a}from"@jackwener/opencli/errors";import{resolveVideoFile as m,setVideoInput as v,unwrap as c,currentUrl as p,parseScheduleDate as y,clickByText as u,waitForUrlIncludes as s,waitForSelector as o,videoTimeoutArg as b}from"../_shared/video-publish.js";const x="https://baijiahao.baidu.com/builder/rc/edit?type=videoV2",S=["div[class^='video-main-container'] input","input[type='file']"];async function T(t,i){let e=i;if(e.length<=8)e+=" 你不知道的";e=e.slice(0,30);if(!Boolean(c(await t.evaluate(`
|
|
2
2
|
((text) => {
|
|
3
3
|
const input = document.querySelector('input[placeholder="添加标题获得更多推荐"], textarea[placeholder="添加标题获得更多推荐"], [placeholder*="添加标题"]');
|
|
4
4
|
if (!input) return false;
|
|
@@ -9,8 +9,8 @@ import{cli as $,Strategy as N}from"@jackwener/opencli/registry";import{ArgumentE
|
|
|
9
9
|
input.dispatchEvent(new Event('input', { bubbles: true }));
|
|
10
10
|
input.dispatchEvent(new Event('change', { bubbles: true }));
|
|
11
11
|
return true;
|
|
12
|
-
})(${JSON.stringify(
|
|
13
|
-
`))))throw new
|
|
12
|
+
})(${JSON.stringify(e)})
|
|
13
|
+
`))))throw new a("找不到百家号标题输入框");return e}async function E(t){const i=Date.now()+300000;while(Date.now()<i){const e=c(await t.evaluate(`
|
|
14
14
|
(() => {
|
|
15
15
|
const has = (txt) => Array.from(document.querySelectorAll('div .cover-overlay'))
|
|
16
16
|
.some((el) => (el.innerText || el.textContent || '').includes(txt));
|
|
@@ -18,14 +18,14 @@ import{cli as $,Strategy as N}from"@jackwener/opencli/registry";import{ArgumentE
|
|
|
18
18
|
if (has('上传中')) return 'uploading';
|
|
19
19
|
return 'done';
|
|
20
20
|
})()
|
|
21
|
-
`));if(
|
|
21
|
+
`));if(e==="failed")return!1;if(e==="done")return!0;await t.wait({time:2})}return!1}async function D(t,i){const e=i.getDate(),n=i.getMonth()+1,l=e>9?`${n}月${e}日`:`${n}月0${e}日`;if(!await o(t,"div.select-wrap",5000))throw new a("百家号定时选择器未出现");for(let r=0;r<3;r++){await t.evaluate("(() => { const w = document.querySelectorAll('div.select-wrap')[0]; if (w) w.click(); })()");if(await o(t,"div.rc-virtual-list div.cheetah-select-item",5000))break}await t.wait({time:2});await t.evaluate(`
|
|
22
22
|
((wantDay) => {
|
|
23
23
|
for (const el of document.querySelectorAll('div.rc-virtual-list div.cheetah-select-item')) {
|
|
24
24
|
if ((el.innerText || el.textContent || '').includes(wantDay)) { el.click(); return true; }
|
|
25
25
|
}
|
|
26
26
|
return false;
|
|
27
|
-
})(${JSON.stringify(
|
|
28
|
-
`);await
|
|
27
|
+
})(${JSON.stringify(l)})
|
|
28
|
+
`);await t.wait({time:2});for(let r=0;r<3;r++){await t.evaluate("(() => { const w = document.querySelectorAll('div.select-wrap')[1]; if (w) w.click(); })()");if(await o(t,"div.rc-virtual-list div.rc-virtual-list-holder-inner",5000))break}await t.wait({time:2});await t.evaluate(`
|
|
29
29
|
(() => {
|
|
30
30
|
const opts = Array.from(document.querySelectorAll('div.rc-virtual-list div.cheetah-select-item-option'))
|
|
31
31
|
.filter((el) => el.offsetParent !== null);
|
|
@@ -35,7 +35,7 @@ import{cli as $,Strategy as N}from"@jackwener/opencli/registry";import{ArgumentE
|
|
|
35
35
|
opts[idx].click();
|
|
36
36
|
return true;
|
|
37
37
|
})()
|
|
38
|
-
`);await
|
|
38
|
+
`);await t.wait({time:2});await u(t,"定时发布",{timeoutMs:5000})}async function q(t,i){if(!Boolean(c(await t.evaluate(`
|
|
39
39
|
(() => {
|
|
40
40
|
const norm = (v) => (v || '').replace(/\\s+/g, ' ').trim();
|
|
41
41
|
for (const c of document.querySelectorAll('div.op-btn-outter-content')) {
|
|
@@ -47,11 +47,11 @@ import{cli as $,Strategy as N}from"@jackwener/opencli/registry";import{ArgumentE
|
|
|
47
47
|
}
|
|
48
48
|
return false;
|
|
49
49
|
})()
|
|
50
|
-
`))))throw new
|
|
50
|
+
`))))throw new a("找不到百家号「定时发布」入口");if(!await o(t,"div.select-wrap",3000))throw new a("百家号定时面板未展开");await t.wait({time:2});await D(t,i)}d({site:"baijiahao",name:"publish",access:"write",description:"发布视频到百家号(一条命令完成上传+填写+发布;可选定时)",domain:"baijiahao.baidu.com",strategy:f.COOKIE,browser:!0,navigateBefore:!1,args:[{name:"video",required:!0,positional:!0,help:"视频文件路径"},{name:"title",required:!0,help:"视频标题(不足 8 字会自动补「你不知道的」,截断到 30 字)"},{name:"schedule",default:"",help:"定时发布时间(ISO8601 或 Unix 秒;不填即立即发布)"},b()],columns:["status","title","url"],func:async(t,i)=>{const e=String(i.title??"").trim();if(!e)throw new h("--title is required");const n=m(i.video),l=y(i.schedule);await t.goto(x);if(!await s(t,"builder/rc/edit",60000))throw new a("未能进入百家号视频编辑页(登录态可能失效,请先 ppcli baijiahao login)");if(!await o(t,"div[class^='video-main-container'] input, input[type='file']",30000))throw new a("百家号视频上传输入框未出现");await v(t,S,[n]);if(!await o(t,"div#formMain",60000))throw new a("百家号视频发布表单未出现");await t.wait({time:1});const r=await T(t,e);if(!await E(t))throw new a(`百家号视频上传失败: ${n}`);const w=Date.now()+120000;while(Date.now()<w){if(Boolean(c(await t.evaluate("(() => !!document.querySelector('div.cheetah-spin-container img'))()"))))break;await t.wait({time:3})}if(l)await q(t,l);else await u(t,"发布",{exact:!0,timeoutMs:1e4});await t.wait({time:2});if(Boolean(c(await t.evaluate(`
|
|
51
51
|
(() => {
|
|
52
52
|
for (const el of document.querySelectorAll('div.passMod_dialog-container')) {
|
|
53
53
|
if (el.offsetParent !== null && (el.innerText || '').includes('百度安全验证')) return true;
|
|
54
54
|
}
|
|
55
55
|
return false;
|
|
56
56
|
})()
|
|
57
|
-
`))))throw new
|
|
57
|
+
`))))throw new a("百家号出现百度安全验证,请在窗口内手动完成后重试");if(!await s(t,"builder/rc/clue",8000))throw new a("百家号发布未确认成功(未跳转到内容管理页),请检查页面状态");return[{status:l?"✅ 定时发布已提交":"✅ 发布成功",title:r,url:await p(t)}]}});
|
package/clis/baijiahao/stats.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{cli as
|
|
1
|
+
import{cli as d,Strategy as _}from"@jackwener/opencli/registry";import{CommandExecutionError as s}from"@jackwener/opencli/errors";import{gotoWritePage as m}from"../_shared/article/publish.js";import{baijiahaoProfile as h}from"./article.js";d({site:"baijiahao",name:"stats",access:"read",description:"百家号内容数据(每篇文章/视频的展现/阅读/点赞/评论/收藏/分享/收益等全量运营指标)",domain:"baijiahao.baidu.com",strategy:_.COOKIE,browser:!0,args:[{name:"limit",type:"number",default:20,help:"返回条数"}],columns:["id","type","status","title","url","published_at","views","shows","likes","comments","collects","shares","profit","extra"],func:async(o,c)=>{if(!o)throw new s("百家号内容数据查询需要浏览器会话");await m(o,h.home);const l=Number(c.limit)>0?Math.floor(Number(c.limit)):20,a=await o.evaluate("(async () => {const er = await fetch('https://baijiahao.baidu.com/builder/rc/edit', { credentials: 'include' });const eh = await er.text();const m = eh.match(/window\\.__BJH__INIT__AUTH__\\s*=\\s*['\\\"]([^'\\\"]+)['\\\"]/);"+"if (!m) return { __error: '登录失效,请重新登录百家号' };"+"const token = m[1];const LIMIT = "+JSON.stringify(l)+";const pageSize = Math.min(Math.max(LIMIT, 10), 20);const list = []; let totalPage = 1;for (let cur = 1; cur <= totalPage && list.length < LIMIT; cur++) { const qs = new URLSearchParams({ currentPage: String(cur), pageSize: String(pageSize), search: '', type: '', collection: '', startDate: '', endDate: '', clearBeforeFetch: 'false', dynamic: '1' }).toString(); const r = await fetch('https://baijiahao.baidu.com/pcui/article/lists?' + qs, { credentials: 'include', headers: { token } }); let j = null; try { j = await r.json(); } catch (e) {}"+" if (!j || j.errno !== 0 || !j.data) return { __error: (j && j.errmsg) || ('列表接口失败 HTTP ' + r.status) };"+" const rows = j.data.list || []; if (j.data.page && j.data.page.totalPage) totalPage = j.data.page.totalPage; list.push(...rows); if (rows.length < pageSize) break;}return { rows: list.slice(0, LIMIT).map(a => ({ id: String(a.article_id == null ? '' : a.article_id), raw_type: a.type == null ? '' : String(a.type), status: a.status == null ? '' : String(a.status), title: a.title || '', url: a.share_url || a.url || '', published_at: a.publish_time || '', views: a.read_amount, shows: a.rec_amount, likes: a.like_amount, comments: a.comment_amount, collects: a.collection_amount, shares: a.share_amount, profit: a.profit, feed_push_amount: a.feed_push_amount, add_view_count: a.add_view_count, rec_count: a.rec_count, is_good: a.is_good, is_published: a.is_published, has_edited_times: a.has_edited_times, open_comment: a.open_comment, duration: a.duration, video_num: a.video_num, updated_at: a.updated_at,})) };})()");if(a&&a.__error)throw new s("百家号内容数据查询失败:"+a.__error);const r=Array.isArray(a&&a.rows)?a.rows:null;if(!r)throw new s("百家号内容数据查询失败:接口未返回列表数据");if(r.length===0)throw new s("百家号后台没有查到任何内容:账号可能尚未发布过文章/视频,或登录态失效,请在浏览器打开 baijiahao.baidu.com 确认。");const e=(t,n)=>typeof t==="number"&&Number.isFinite(t)?t:n;return r.map((t)=>{const n=t.raw_type==="news"?"article":t.raw_type||"",i={};if(e(t.feed_push_amount,0))i.feed_push_amount=t.feed_push_amount;const u=Number(t.add_view_count);if(Number.isFinite(u)&&u>0)i.add_view_count=u;if(e(t.rec_count,0))i.rec_count=t.rec_count;if(t.is_good===1)i.is_good=1;if(e(t.has_edited_times,0))i.has_edited_times=t.has_edited_times;if(t.open_comment===0)i.open_comment=0;if(t.duration!=null&&t.duration!=="")i.duration=t.duration;if(e(t.video_num,0))i.video_num=t.video_num;if(t.is_published!=null)i.is_published=t.is_published;if(t.updated_at)i.updated_at=t.updated_at;return{id:t.id,type:n,status:t.status,title:t.title,url:t.url,published_at:t.published_at,views:e(t.views,""),shows:e(t.shows,""),likes:e(t.likes,""),comments:e(t.comments,""),collects:e(t.collects,""),shares:e(t.shares,""),profit:e(t.profit,""),extra:JSON.stringify(i)}})}});
|
package/clis/baijiahao/whoami.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{cli as
|
|
1
|
+
import{cli as o,Strategy as t}from"@jackwener/opencli/registry";import{checkLogin as r,cookieQuickCheck as c}from"../_shared/article/auth.js";import{baijiahaoProfile as i}from"./article.js";const u={home:i.home,checkAuth:i.checkAuth};o({site:"baijiahao",name:"whoami",access:"read",description:"检测百家号当前登录状态,返回账号信息。",domain:"baijiahao.baidu.com",strategy:t.COOKIE,browser:!0,columns:["logged_in","user_id","username"],authStatus:{quickCheck:c("https://baijiahao.baidu.com",["BDUSS","BDUSS_BFESS"])},func:async(a)=>{const e=await r(a,u);return[{logged_in:e.isAuthenticated,user_id:e.userId||"",username:e.username||""}]}});
|
package/clis/band/bands.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{AuthRequiredError as
|
|
1
|
+
import{AuthRequiredError as t,EmptyResultError as s}from"@jackwener/opencli/errors";import{cli as r,Strategy as a}from"@jackwener/opencli/registry";r({site:"band",name:"bands",access:"read",description:"List all Bands you belong to",domain:"www.band.us",strategy:a.COOKIE,browser:!0,args:[],columns:["band_no","name","members"],func:async(n,i)=>{if(!(await n.getCookies({domain:"band.us"})).some((o)=>o.name==="band_session"))throw new t("band.us","Not logged in to Band");const e=await n.evaluate(`
|
|
2
2
|
(async () => {
|
|
3
3
|
const sleep = ms => new Promise(r => setTimeout(r, ms));
|
|
4
4
|
|
|
@@ -34,4 +34,4 @@ import{AuthRequiredError as D,EmptyResultError as F}from"@jackwener/opencli/erro
|
|
|
34
34
|
|
|
35
35
|
return results;
|
|
36
36
|
})()
|
|
37
|
-
`);if(!
|
|
37
|
+
`);if(!e||e.length===0)throw new s("band bands","No bands found in sidebar — are you logged in?");return e}});
|
package/clis/band/mentions.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import{AuthRequiredError as
|
|
1
|
+
import{AuthRequiredError as y,EmptyResultError as d,selectorError as u}from"@jackwener/opencli/errors";import{cli as g,Strategy as p}from"@jackwener/opencli/registry";g({site:"band",name:"mentions",access:"read",description:"Show Band notifications where you are @mentioned",domain:"www.band.us",strategy:p.INTERCEPT,browser:!0,args:[{name:"filter",default:"mentioned",choices:["mentioned","all","post","comment"],help:"Filter: mentioned (default) | all | post | comment"},{name:"limit",type:"int",default:20,help:"Max results"},{name:"unread",type:"bool",default:!1,help:"Show only unread notifications"}],columns:["time","band","type","from","text","url"],func:async(n,o)=>{const{filter:a,limit:m,unread:f}=o;await n.goto(`https://www.band.us/?_=${Date.now()}`);if(!(await n.getCookies({domain:"band.us"})).some((e)=>e.name==="band_session"))throw new y("band.us","Not logged in to Band");await n.installInterceptor("get_news");let r=!1;for(let e=0;e<20;e++){if(await n.evaluate("() => !!document.querySelector('button._btnWidgetIcon')")){r=!0;break}await n.wait(0.5)}if(!r)throw u("button._btnWidgetIcon","Notification bell not found. The Band.us UI may have changed.");const w=async(e=8)=>{const i=[];for(let l=0;l<e*2;l++){await n.wait(0.5);const c=await n.getInterceptedRequests();if(c.length>0){i.push(...c);if(i.some((h)=>Array.isArray(h?.result_data?.news)))return i}}return i};if(!await n.evaluate(`() => {
|
|
2
2
|
const el = document.querySelector('button._btnWidgetIcon');
|
|
3
3
|
if (!el) return false;
|
|
4
4
|
el.click();
|
|
5
5
|
return true;
|
|
6
|
-
}`))throw
|
|
6
|
+
}`))throw u("button._btnWidgetIcon","Notification bell disappeared before click. The Band.us UI may have changed.");const s=(await w()).find((e)=>Array.isArray(e?.result_data?.news));if(!s)throw new d("band mentions","Failed to capture get_news response from Band.us. Try running the command again.");let t=s.result_data.news??[];if(t.length===0)throw new d("band mentions","No notifications found");if(f)t=t.filter((e)=>e.is_new===!0);if(a==="mentioned")t=t.filter((e)=>e.filters?.includes("referred"));else if(a==="post")t=t.filter((e)=>e.category==="post");else if(a==="comment")t=t.filter((e)=>e.category==="comment");const b=(e)=>e.replace(/<\/?band:[^>]+>/g,"");return t.slice(0,m).map((e)=>{const i=e.created_at?new Date(e.created_at):null;return{time:i?i.toLocaleString("ja-JP",{month:"2-digit",day:"2-digit",hour:"2-digit",minute:"2-digit"}):"",band:e.band?.name??"",type:e.filters?.includes("referred")?"@mention":e.category??"",from:e.actor?.name??"",text:b(e.subtext??"").slice(0,100),url:e.action?.pc??""}})}});
|
package/clis/band/post.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import{AuthRequiredError as
|
|
1
|
+
import{AuthRequiredError as g,EmptyResultError as C}from"@jackwener/opencli/errors";import{formatCookieHeader as w}from"@jackwener/opencli/download";import{downloadMedia as h}from"@jackwener/opencli/download/media-download";import{cli as x,Strategy as L}from"@jackwener/opencli/registry";x({site:"band",name:"post",access:"read",description:"Export full content of a post including comments",domain:"www.band.us",strategy:L.COOKIE,navigateBefore:!1,browser:!0,args:[{name:"band_no",positional:!0,required:!0,type:"int",help:"Band number"},{name:"post_no",positional:!0,required:!0,type:"int",help:"Post number"},{name:"output",type:"str",default:"",help:"Directory to save attached photos"},{name:"comments",type:"bool",default:!0,help:"Include comments (default: true)"}],columns:["type","author","date","text"],func:async(n,r)=>{const f=Number(r.band_no),y=Number(r.post_no),s=r.output,b=r.comments;await n.goto(`https://www.band.us/band/${f}/post/${y}`);if(!(await n.getCookies({domain:"band.us"})).some((t)=>t.name==="band_session"))throw new g("band.us","Not logged in to Band");const o=await n.evaluate(`
|
|
2
2
|
(async () => {
|
|
3
|
-
const withComments = ${
|
|
3
|
+
const withComments = ${b};
|
|
4
4
|
const sleep = ms => new Promise(r => setTimeout(r, ms));
|
|
5
5
|
const norm = s => (s || '').replace(/\\s+/g, ' ').trim();
|
|
6
6
|
// Band embeds <band:mention>, <band:sticker>, etc. in content — strip to plain text.
|
|
@@ -72,5 +72,5 @@ import{AuthRequiredError as q,EmptyResultError as A}from"@jackwener/opencli/erro
|
|
|
72
72
|
|
|
73
73
|
return { author, date, text, photos, comments };
|
|
74
74
|
})()
|
|
75
|
-
`);if(!
|
|
76
|
-
`)});for(const
|
|
75
|
+
`);if(!o?.text&&!o?.comments?.length&&!o?.photos?.length)throw new C("band post","Post not found or not accessible");const a=o.photos??[];if(s&&a.length>0){const t=w(await n.getCookies({url:"https://www.band.us"})),i=(e)=>{try{const d=new URL(e).hostname;return d==="band.us"||d.endsWith(".band.us")}catch{return!1}},m=(e)=>{try{return new URL(e).pathname.match(/\.(\w+)$/)?.[1]??"jpg"}catch{return"jpg"}};let l=1;const p=a.filter(i),u=a.filter((e)=>!i(e));if(p.length>0)await h(p.map((e)=>({type:"image",url:e,filename:`photo_${l++}.${m(e)}`})),{output:s,verbose:!1,cookies:t});if(u.length>0)await h(u.map((e)=>({type:"image",url:e,filename:`photo_${l++}.${m(e)}`})),{output:s,verbose:!1})}const c=[];c.push({type:"post",author:o.author??"",date:o.date??"",text:[o.text??"",...s?[]:a.map((t,i)=>`[photo${i+1}] ${t}`)].filter(Boolean).join(`
|
|
76
|
+
`)});for(const t of o.comments??[])c.push({type:t.depth===0?"comment":"reply",author:t.author??"",date:t.date??"",text:t.depth>0?" ".repeat(t.depth)+"└ "+(t.text??""):t.text??""});return c}});
|
package/clis/band/posts.js
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import{AuthRequiredError as
|
|
1
|
+
import{AuthRequiredError as a,EmptyResultError as i}from"@jackwener/opencli/errors";import{cli as c,Strategy as l}from"@jackwener/opencli/registry";c({site:"band",name:"posts",access:"read",description:"List posts from a Band",domain:"www.band.us",strategy:l.COOKIE,navigateBefore:!1,browser:!0,args:[{name:"band_no",positional:!0,required:!0,type:"int",help:"Band number (get it from: band bands)"},{name:"limit",type:"int",default:20,help:"Max results"}],columns:["date","author","content","comments","url"],func:async(t,n)=>{const o=Number(n.band_no),s=Number(n.limit);await t.goto(`https://www.band.us/band/${o}/post`);if(!(await t.getCookies({domain:"band.us"})).some((r)=>r.name==="band_session"))throw new a("band.us","Not logged in to Band");const e=await t.evaluate(`
|
|
2
2
|
(async () => {
|
|
3
3
|
const sleep = ms => new Promise(r => setTimeout(r, ms));
|
|
4
4
|
const norm = s => (s || '').replace(/\\s+/g, ' ').trim();
|
|
5
|
-
const limit = ${
|
|
5
|
+
const limit = ${s};
|
|
6
6
|
|
|
7
7
|
// Wait up to 9 s for post items to render.
|
|
8
8
|
for (let i = 0; i < 30; i++) {
|
|
@@ -47,4 +47,4 @@ import{AuthRequiredError as H,EmptyResultError as I}from"@jackwener/opencli/erro
|
|
|
47
47
|
|
|
48
48
|
return results;
|
|
49
49
|
})()
|
|
50
|
-
`);if(!
|
|
50
|
+
`);if(!e||e.length===0)throw new i("band posts","No posts found in this Band");return e}});
|
package/clis/barchart/flow.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import{cli as
|
|
1
|
+
import{cli as l,Strategy as a}from"@jackwener/opencli/registry";l({site:"barchart",name:"flow",access:"read",description:"Barchart unusual options activity / options flow",domain:"www.barchart.com",strategy:a.COOKIE,args:[{name:"type",type:"str",default:"all",help:"Filter: all, call, or put",choices:["all","call","put"]},{name:"limit",type:"int",default:20,help:"Number of results"}],columns:["symbol","type","strike","expiration","last","volume","openInterest","volOiRatio","iv"],func:async(i,r)=>{const s=r.type||"all",o=r.limit??20;await i.goto("https://www.barchart.com/options/unusual-activity/stocks");await i.wait(5);const e=await i.evaluate(`
|
|
2
2
|
(async () => {
|
|
3
|
-
const limit = ${
|
|
3
|
+
const limit = ${o};
|
|
4
4
|
const typeFilter = ${JSON.stringify(s)}.toLowerCase();
|
|
5
5
|
|
|
6
6
|
// Wait for CSRF token to appear (Angular may inject it after initial render)
|
|
@@ -67,4 +67,4 @@ import{cli as a,Strategy as l}from"@jackwener/opencli/registry";a({site:"barchar
|
|
|
67
67
|
|
|
68
68
|
return [];
|
|
69
69
|
})()
|
|
70
|
-
`);if(!e)return[];if(e.error==="no-csrf")throw Error("Could not extract CSRF token from barchart.com. Make sure you are logged in.");if(!Array.isArray(e))return[];return e.slice(0,
|
|
70
|
+
`);if(!e)return[];if(e.error==="no-csrf")throw Error("Could not extract CSRF token from barchart.com. Make sure you are logged in.");if(!Array.isArray(e))return[];return e.slice(0,o).map((t)=>({symbol:t.symbol||"",type:t.type||"",strike:t.strike,expiration:t.expiration??null,last:t.last!=null?Number(Number(t.last).toFixed(2)):null,volume:t.volume,openInterest:t.openInterest,volOiRatio:t.volOiRatio!=null?Number(Number(t.volOiRatio).toFixed(2)):null,iv:t.iv!=null?Number(Number(t.iv).toFixed(2))+"%":null}))}});
|
package/clis/barchart/greeks.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{cli as g,Strategy as
|
|
1
|
+
import{cli as g,Strategy as x}from"@jackwener/opencli/registry";import{ArgumentError as n,CommandExecutionError as o,EmptyResultError as y}from"@jackwener/opencli/errors";const m=10,u=1,c=100;function p(t){const r=String(t??"").trim().toUpperCase();if(!r)throw new n("symbol is required");return r}function d(t){const r=String(t??"").trim();if(!r)return"";if(!/^\d{4}-\d{2}-\d{2}$/.test(r))throw new n("--expiration must use YYYY-MM-DD format");const i=new Date(`${r}T00:00:00Z`);if(Number.isNaN(i.getTime())||i.toISOString().slice(0,10)!==r)throw new n("--expiration must be a valid calendar date");return r}function f(t){if(t===void 0||t===null||t==="")return m;const r=Number(t);if(!Number.isInteger(r)||r<u||r>c)throw new n(`--limit must be an integer between ${u} and ${c}`);return r}function h(t){if(t&&typeof t==="object"&&"session"in t&&"data"in t)return t.data;return t}g({site:"barchart",name:"greeks",access:"read",description:"Barchart options greeks overview (IV, delta, gamma, theta, vega)",domain:"www.barchart.com",strategy:x.COOKIE,args:[{name:"symbol",required:!0,positional:!0,help:"Stock ticker (e.g. AAPL)"},{name:"expiration",type:"str",help:"Expiration date (YYYY-MM-DD). Defaults to the nearest available expiration."},{name:"limit",type:"int",default:m,help:"Number of near-the-money strikes per type (1-100)"}],columns:["type","strike","last","iv","delta","gamma","theta","vega","rho","volume","openInterest","expiration"],func:async(t,r)=>{const i=p(r.symbol),w=d(r.expiration),b=f(r.limit);await t.goto(`https://www.barchart.com/stocks/quotes/${encodeURIComponent(i)}/options`);await t.wait(4);const a=h(await t.evaluate(`
|
|
2
2
|
(async () => {
|
|
3
3
|
const sym = ${JSON.stringify(i)};
|
|
4
4
|
const expDate = ${JSON.stringify(w)};
|
|
@@ -85,4 +85,4 @@ import{cli as g,Strategy as y}from"@jackwener/opencli/registry";import{ArgumentE
|
|
|
85
85
|
return { ok: false, reason: 'exception', message: e?.message || String(e) };
|
|
86
86
|
}
|
|
87
87
|
})()
|
|
88
|
-
`));if(!a||a.ok!==!0){if(a?.reason==="http")throw new o(`Barchart greeks request failed: HTTP ${a.status}${a.statusText?` ${a.statusText}`:""}`);if(a?.reason==="malformed")throw new o(`Barchart greeks returned an unreadable options payload${a.message?`: ${a.message}`:""}`);if(a?.reason==="exception")throw new o(`Barchart greeks request failed: ${a.message||"unknown error"}`);throw new o(`Failed to fetch Barchart greeks for ${i}`)}if(!Array.isArray(a.rows))throw new o("Barchart greeks returned an unreadable options payload");if(a.rows.length===0)throw new
|
|
88
|
+
`));if(!a||a.ok!==!0){if(a?.reason==="http")throw new o(`Barchart greeks request failed: HTTP ${a.status}${a.statusText?` ${a.statusText}`:""}`);if(a?.reason==="malformed")throw new o(`Barchart greeks returned an unreadable options payload${a.message?`: ${a.message}`:""}`);if(a?.reason==="exception")throw new o(`Barchart greeks request failed: ${a.message||"unknown error"}`);throw new o(`Failed to fetch Barchart greeks for ${i}`)}if(!Array.isArray(a.rows))throw new o("Barchart greeks returned an unreadable options payload");if(a.rows.length===0)throw new y("barchart greeks",`No option greeks were returned for ${i}. Confirm the symbol, expiration, and Barchart login state.`);return a.rows.map((e)=>{if(!e||typeof e!=="object"||Array.isArray(e))throw new o("Barchart greeks returned a malformed option row");const s=String(e.type||"").trim(),l=String(e.expiration||"").trim();if(!/^(call|put)$/i.test(s)||e.strike===void 0||e.strike===null||e.strike===""||!l)throw new o("Barchart greeks returned a malformed option row identity");return{type:s,strike:e.strike,last:e.last!=null?Number(Number(e.last).toFixed(2)):null,iv:e.iv!=null?Number(Number(e.iv).toFixed(2))+"%":null,delta:e.delta!=null?Number(Number(e.delta).toFixed(4)):null,gamma:e.gamma!=null?Number(Number(e.gamma).toFixed(4)):null,theta:e.theta!=null?Number(Number(e.theta).toFixed(4)):null,vega:e.vega!=null?Number(Number(e.vega).toFixed(4)):null,rho:e.rho!=null?Number(Number(e.rho).toFixed(4)):null,volume:e.volume,openInterest:e.openInterest,expiration:l}})}});export const __test__={normalizeSymbol:p,normalizeExpiration:d,parseLimit:f,unwrapBrowserResult:h};
|
package/clis/barchart/quote.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import{cli as
|
|
1
|
+
import{cli as a,Strategy as l}from"@jackwener/opencli/registry";import{CommandExecutionError as c}from"@jackwener/opencli/errors";a({site:"barchart",name:"quote",access:"read",description:"Barchart stock quote with price, volume, and key metrics",domain:"www.barchart.com",strategy:l.COOKIE,args:[{name:"symbol",required:!0,positional:!0,help:"Stock ticker (e.g. AAPL, MSFT, TSLA)"}],columns:["symbol","name","price","change","changePct","open","high","low","prevClose","volume","avgVolume","marketCap","peRatio","eps"],func:async(o,r)=>{const t=r.symbol.toUpperCase().trim();await o.goto(`https://www.barchart.com/stocks/quotes/${encodeURIComponent(t)}/overview`);await o.wait(4);const n=await o.evaluate(`
|
|
2
2
|
(async () => {
|
|
3
|
-
const sym = ${JSON.stringify(
|
|
3
|
+
const sym = ${JSON.stringify(t)};
|
|
4
4
|
const csrf = document.querySelector('meta[name="csrf-token"]')?.content || '';
|
|
5
5
|
|
|
6
6
|
// Strategy 1: internal proxy API with CSRF token
|
|
@@ -84,4 +84,4 @@ import{cli as F,Strategy as G}from"@jackwener/opencli/registry";import{CommandEx
|
|
|
84
84
|
return { error: 'Could not fetch quote for ' + sym + ': ' + e.message };
|
|
85
85
|
}
|
|
86
86
|
})()
|
|
87
|
-
`);if(!
|
|
87
|
+
`);if(!n||n.error)throw new c(n?.error||`Failed to fetch quote for ${t}`);const e=n.row||{},s=e.raw||{};return[{symbol:e.symbol||t,name:e.symbolName||e.name||t,price:e.lastPrice??null,change:e.priceChange??null,changePct:e.percentChange??null,open:e.openPrice??e.open??null,high:e.highPrice??null,low:e.lowPrice??null,prevClose:e.previousPrice??e.previousClose??null,volume:e.volume??null,avgVolume:e.averageVolume??null,marketCap:e.marketCap??null,peRatio:e.peRatio??null,eps:e.earningsPerShare??null}]}});
|
package/clis/bbc/news.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{cli as
|
|
1
|
+
import{cli as d,Strategy as h}from"@jackwener/opencli/registry";d({site:"bbc",name:"news",access:"read",description:"BBC News headlines (RSS)",domain:"www.bbc.com",strategy:h.PUBLIC,args:[{name:"limit",type:"int",default:20,help:"Number of headlines (max 50)"}],columns:["rank","title","description","url"],func:async(s)=>{const r=Math.min(s.limit||20,50),e=await fetch("https://feeds.bbci.co.uk/news/rss.xml");if(!e.ok)return[];const l=await e.text(),i=[],m=/<item>([\s\S]*?)<\/item>/g;let c;while((c=m.exec(l))&&i.length<r){const t=c[1],n=t.match(/<title><!\[CDATA\[(.*?)\]\]>|<title>(.*?)<\/title>/)?.[1]||t.match(/<title>(.*?)<\/title>/)?.[1]||"",a=t.match(/<description><!\[CDATA\[(.*?)\]\]>|<description>(.*?)<\/description>/)?.[1]||t.match(/<description>(.*?)<\/description>/)?.[1]||"",o=t.match(/<link>(.*?)<\/link>/)?.[1]||t.match(/<guid[^>]*>(.*?)<\/guid>/)?.[1]||"";if(n)i.push({rank:i.length+1,title:n.trim(),description:a.trim().substring(0,200),url:o.trim()})}return i}});
|
package/clis/bbc/topic.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{cli as a,Strategy as p}from"@jackwener/opencli/registry";import{ArgumentError as l,EmptyResultError as m}from"@jackwener/opencli/errors";import{bbcFetchRss as u,parseRssItems as d,pubDateToIso as b,requireBoundedInt as
|
|
1
|
+
import{cli as a,Strategy as p}from"@jackwener/opencli/registry";import{ArgumentError as l,EmptyResultError as m}from"@jackwener/opencli/errors";import{bbcFetchRss as u,parseRssItems as d,pubDateToIso as b,requireBoundedInt as w}from"./utils.js";const o=["world","business","politics","health","education","science_and_environment","technology","entertainment_and_arts"];a({site:"bbc",name:"topic",access:"read",description:"BBC News headlines for a specific section (RSS feed)",domain:"www.bbc.com",strategy:p.PUBLIC,browser:!1,args:[{name:"topic",positional:!0,required:!0,help:`Section name (${o.join(" / ")})`},{name:"limit",type:"int",default:20,help:"Max headlines (1-50)"}],columns:["rank","title","description","pubDate","url"],func:async(i)=>{const e=String(i.topic??"").trim().toLowerCase().replace(/[\s-]+/g,"_");if(!o.includes(e))throw new l(`bbc topic "${i.topic}" is not supported`,`Supported topics: ${o.join(", ")}`);const r=w(i.limit,20,50),s=await u(`${e}/rss.xml`,`bbc topic ${e}`),n=d(s);if(!n.length)throw new m("bbc topic",`BBC ${e} feed returned no items.`);return n.slice(0,r).map((t,c)=>({rank:c+1,title:t.title,description:t.description,pubDate:b(t.pubDate),url:t.link}))}});
|
package/clis/bbc/utils.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{ArgumentError as
|
|
1
|
+
import{ArgumentError as s,CommandExecutionError as c}from"@jackwener/opencli/errors";export const BBC_FEED_BASE="https://feeds.bbci.co.uk/news";const p="opencli-bbc-adapter (+https://github.com/jackwener/OpenCLI)",u={"&":"&","<":"<",">":">",""":'"',"'":"'","'":"'"," ":" "};export function decodeHtmlEntities(r){return String(r??"").replace(/&#x([0-9a-fA-F]+);/g,(t,e)=>String.fromCodePoint(parseInt(e,16))).replace(/&#(\d+);/g,(t,e)=>String.fromCodePoint(parseInt(e,10))).replace(/&(amp|lt|gt|quot|apos|#39|nbsp);/g,(t)=>u[t]||t)}export function extractRssTag(r,t){const e=r.match(new RegExp(`<${t}[^>]*>\\s*<!\\[CDATA\\[([\\s\\S]*?)\\]\\]>\\s*<\\/${t}>`));if(e)return e[1];const n=r.match(new RegExp(`<${t}[^>]*>([\\s\\S]*?)<\\/${t}>`));return n?n[1]:""}export function parseRssItems(r){const t=[],e=/<item[^>]*>([\s\S]*?)<\/item>/g;let n;while((n=e.exec(String(r||"")))!==null){const i=n[1];t.push({title:decodeHtmlEntities(extractRssTag(i,"title")).trim(),description:decodeHtmlEntities(extractRssTag(i,"description")).trim(),link:decodeHtmlEntities(extractRssTag(i,"link")).trim(),pubDate:decodeHtmlEntities(extractRssTag(i,"pubDate")).trim(),guid:decodeHtmlEntities(extractRssTag(i,"guid")).trim()})}return t}export function requireBoundedInt(r,t,e,n="limit"){const i=r??t,o=typeof i==="number"?i:Number(i);if(!Number.isInteger(o)||o<=0)throw new s(`bbc ${n} must be a positive integer`);if(o>e)throw new s(`bbc ${n} must be <= ${e}`);return o}export async function bbcFetchRss(r,t){const e=`${BBC_FEED_BASE}/${r}`;let n;try{n=await fetch(e,{headers:{"user-agent":p,accept:"application/rss+xml, application/xml"}})}catch(i){throw new c(`${t} request failed: ${i?.message??i}`,"Check that feeds.bbci.co.uk is reachable from this network.")}if(!n.ok)throw new c(`${t} returned HTTP ${n.status} (${e})`);return n.text()}export function pubDateToIso(r){if(!r)return"";const t=new Date(r);if(Number.isNaN(t.getTime()))return"";return t.toISOString().slice(0,10)}
|
package/clis/bilibili/article.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{CliError as
|
|
1
|
+
import{CliError as b,CommandExecutionError as H}from"@jackwener/opencli/errors";import{cli as M,Strategy as q}from"@jackwener/opencli/registry";import{publishArticle as K}from"../_shared/article/publish.js";import{readFile as z,stat as G}from"node:fs/promises";function Q(a){if(!a.execute)throw new b("INVALID_INPUT","此写操作需要 --execute 才会真正提交。注意:本报错仅表示缺少 --execute,并未校验其余参数,不能当 dry-run 预览用")}async function W(a){const t=typeof a.text==="string"?a.text:void 0,i=typeof a.file==="string"?a.file:void 0;if(t&&i)throw new b("INVALID_INPUT","正文和 --file 只能选一个");let e=t??"";if(i){let d;try{d=await G(i)}catch{throw new b("INVALID_INPUT",`文件不存在:${i}`)}if(!d.isFile())throw new b("INVALID_INPUT",`--file 必须是可读的文本文件:${i}`);let p;try{p=await z(i)}catch{throw new b("INVALID_INPUT",`文件无法读取:${i}`)}try{e=new TextDecoder("utf-8",{fatal:!0}).decode(p)}catch{throw new b("INVALID_INPUT",`文件无法以 UTF-8 解码:${i}`)}}if(!e.trim())throw new b("INVALID_INPUT","正文不能为空");return e}function X(a,t,i,e,d={}){return[{status:"success",outcome:e,message:a,target_type:t,target:i,...d}]}export const bilibiliArticleProfile={home:"https://member.bilibili.com/platform/upload/text",originRe:"^https?://([^/]*\\.)?bilibili\\.com(/|$)",outputFormat:"html",preprocessConfig:{removeLinks:!0},image:{uploadFn:async(a,t)=>{var i=t.cookie("bili_jct");if(!i)throw Error("未找到 bili_jct CSRF token,请确认已登录 B站");var e=await fetch(a,{credentials:"omit"});if(!e.ok)throw Error("图片下载失败(HTTP "+e.status+"):"+a.slice(0,120));var d=await e.blob();function p(u,h){var S=String(h&&h.type||"").toLowerCase(),I=S==="image/png"?"png":S==="image/webp"?"webp":S==="image/gif"?"gif":S==="image/heif"||S==="image/heic"?"heif":"jpg";return u+"."+I}var c=new FormData;c.append("binary",d,p("image",d));c.append("csrf",i);var o=await fetch("https://api.bilibili.com/x/article/creative/article/upcover",{method:"POST",credentials:"include",body:c}),f=await o.text(),n=null;try{n=JSON.parse(f)}catch(u){}if(!o.ok||!n||n.code!==0||!n.data||!n.data.url)throw Error("B站图片上传失败:"+(n&&n.message?n.message:f.slice(0,150)));return{url:n.data.url}},skip:["hdslb.com","bilibili.com","biliimg.com"]},publish:async(a,t)=>{var i=t.cookie("bili_jct");if(!i)return{ok:!1,stage:"csrf",status:0,message:"未找到 bili_jct CSRF token,请确认已登录 B站"};var e=a.params||{},d=e.tid?String(e.tid):"4",p=e.listId!=null?String(e.listId):"0",c=e.bannerUrl?String(e.bannerUrl):"",o=e.summary?String(e.summary):"";if(!c&&e.coverSrc)try{var f=await fetch(String(e.coverSrc),{credentials:"omit"});if(!f.ok)return{ok:!1,stage:"cover",status:f.status,message:"封面图下载失败(HTTP "+f.status+"):"+String(e.coverSrc).slice(0,120)};var n=await f.blob(),u=new FormData,h=String(n&&n.type||"").toLowerCase(),S=h==="image/png"?"png":h==="image/webp"?"webp":h==="image/gif"?"gif":h==="image/heif"||h==="image/heic"?"heif":"jpg";u.append("binary",n,"cover."+S);u.append("csrf",i);var I=await fetch("https://api.bilibili.com/x/article/creative/article/upcover",{method:"POST",credentials:"include",body:u}),k=await I.text(),g=null;try{g=JSON.parse(k)}catch(r){}if(!I.ok||!g||g.code!==0||!g.data||!g.data.url)return{ok:!1,stage:"cover",status:I.status,message:"封面图上传失败:"+(g&&g.message?g.message:k.slice(0,150))};c=g.data.url}catch(r){return{ok:!1,stage:"cover",status:0,message:"封面图上传异常:"+String(r&&r.message||r)}}var T=e.tags?String(e.tags):"",_=e.original===!1?!1:!0,x=0;try{var U=document.createElement("div");U.innerHTML=a.content||"";x=(U.textContent||U.innerText||"").replace(/\s+/g,"").length}catch(r){x=0}var s=new URLSearchParams;s.append("title",a.title);s.append("content",a.content);s.append("csrf",i);s.append("save","0");s.append("tid",d);if(e.category)s.append("category",String(e.category));if(p)s.append("list_id",p);if(c)s.append("banner_url",c);if(o)s.append("summary",o);if(T)s.append("tags",T);s.append("reprint",_?"0":"1");s.append("original",_?"1":"0");s.append("media_id","0");s.append("spoiler","0");if(x)s.append("words",String(x));var P=await fetch("https://api.bilibili.com/x/article/creative/draft/addupdate",{method:"POST",credentials:"include",headers:{"Content-Type":"application/x-www-form-urlencoded",Origin:"https://member.bilibili.com",Referer:"https://member.bilibili.com/"},body:s.toString()}),C=await P.text(),y=null;try{y=JSON.parse(C)}catch(r){}if(!P.ok||!y)return{ok:!1,stage:"draft",status:P.status,message:C.slice(0,300)};if(y.code!==0||!y.data||!y.data.aid)return{ok:!1,stage:"draft",status:P.status,message:(y.message||"保存草稿失败")+"(code="+y.code+")"};var m=String(y.data.aid);if(a.draftOnly){var V="https://member.bilibili.com/platform/upload/text/edit?aid="+m;return{ok:!0,draft:!0,id:m,url:V}}if(!e.category)return{ok:!1,stage:"category",status:0,message:"正式发布缺少必填的专栏分类 category(草稿 aid="+m+" 已存)。请用 `bilibili categories` 取合法分类 id 后传 --category。"};var A=[];try{var E=await fetch("https://api.bilibili.com/x/article/categories",{credentials:"include"}),v=await E.json();if(!v||v.code!==0||!Array.isArray(v.data))return{ok:!1,stage:"category",status:E.status,message:"获取 B站专栏分类失败,无法校验 category(草稿 aid="+m+" 已存):"+(v&&v.message||"code="+(v&&v.code))};(function r(D){D.forEach(function(L){var B=Array.isArray(L.children)?L.children:[];A.push({id:String(L.id),name:L.name||"",leaf:B.length===0});if(B.length)r(B)})})(v.data)}catch(r){return{ok:!1,stage:"category",status:0,message:"获取 B站专栏分类异常,无法校验 category(草稿 aid="+m+" 已存):"+String(r&&r.message||r)}}var O=A.find(function(r){return r.id===String(e.category)});if(!O){var j=A.filter(function(r){return r.leaf}).map(function(r){return r.id+"="+r.name}).join(" / ");return{ok:!1,stage:"category",status:0,message:"专栏分类 id「"+e.category+"」不存在(草稿 aid="+m+" 已存)。合法叶子分类:"+(j||"(无)")}}if(!O.leaf)return{ok:!1,stage:"category",status:0,message:"专栏分类 id「"+e.category+"」("+O.name+")是父分类,请改用其下的叶子分类 id(草稿 aid="+m+" 已存)。"};var l=new URLSearchParams;l.append("aid",m);l.append("title",a.title);l.append("content",a.content);l.append("category",String(e.category));l.append("list_id",p);l.append("tid",d);if(c)l.append("banner_url",c);if(o)l.append("summary",o);if(T)l.append("tags",T);l.append("reprint",_?"0":"1");l.append("original",_?"1":"0");l.append("media_id","0");l.append("spoiler","0");if(x)l.append("words",String(x));l.append("csrf",i);var N=await fetch("https://api.bilibili.com/x/article/creative/article/submit",{method:"POST",credentials:"include",headers:{"Content-Type":"application/x-www-form-urlencoded",Origin:"https://member.bilibili.com",Referer:"https://member.bilibili.com/"},body:l.toString()}),F=await N.text(),w=null;try{w=JSON.parse(F)}catch(r){}if(N.status===412)return{ok:!1,stage:"submit",status:412,message:"B站风控拦截了发表(HTTP 412),草稿已保存(aid="+m+"),可在创作中心改后重试。"};if(!N.ok||!w)return{ok:!1,stage:"submit",status:N.status,message:"正式发布失败:"+F.slice(0,300)+"(草稿 aid="+m+" 已存)"};if(w.code!==0)return{ok:!1,stage:"submit",status:N.status,message:(w.message||"正式发布失败")+"(code="+w.code+",草稿 aid="+m+" 已存)"};var R=w.data&&w.data.aid!=null?String(w.data.aid):m;return{ok:!0,draft:!1,id:R,url:"https://www.bilibili.com/read/cv"+R}}};M({site:"bilibili",name:"article",access:"write",description:"发布 B站专栏长文(opus/article)。默认正式发布,加 --draft 仅存草稿。正文默认 Markdown,图片自动转存至 B站图床。正式发布必填 --category(合法值用 `bilibili categories` 取)。",domain:"member.bilibili.com",strategy:q.COOKIE,browser:!0,args:[{name:"title",positional:!0,required:!0,help:"文章标题"},{name:"text",positional:!0,help:"正文(默认 Markdown;加 --html 则作 HTML 处理)"},{name:"file",help:"正文文件路径(UTF-8,默认 Markdown)"},{name:"html",type:"boolean",help:"将正文视为原始 HTML 而非 Markdown"},{name:"category",help:"专栏分类 id(正式发布必填,叶子分类)。合法值用 `bilibili categories` 列举,禁止臆造。"},{name:"tid",type:"int",default:4,help:"封面版式:4=单图 / 3=三图(按封面图数量定,默认 4)"},{name:"cover",help:"封面图源 URL(可空);会先经 upcover 上传到 B站图床再作 banner_url"},{name:"banner-url",help:"封面图的 B站 CDN url(可空,已有则直接用,跳过 upcover 上传)"},{name:"summary",help:"文章摘要/digest(可空)"},{name:"tags",help:"标签,逗号拼接的自由文本字符串(可空,非闭合词表)"},{name:"reprint",type:"boolean",help:"标记为转载(默认原创);加此参数则 original=0、reprint=1"},{name:"list-id",type:"int",default:0,help:"文集编号(默认 0=不加入文集)"},{name:"draft",type:"boolean",help:"仅保存草稿,不正式发布"},{name:"execute",type:"boolean",help:"实际提交。不加此参数时命令拒绝写入。"}],columns:["status","outcome","message","target_type","target","created_target","created_url"],func:async(a,t)=>{if(!a)throw new H("B站专栏发布需要浏览器会话");Q(t);const i=String(t.title??"").trim();if(!i)throw new b("INVALID_INPUT","文章标题不能为空");const e=await W(t),d=Boolean(t.draft),p=typeof t.category==="string"?t.category.trim():"";if(!d&&!p)throw new b("INVALID_INPUT","正式发布 B站专栏必须指定 --category(专栏分类 id)。请先用 `bilibili categories` 列举合法分类 id;如只想存草稿请加 --draft。");const c={category:p||void 0,tid:t.tid!=null?String(t.tid):"4",coverSrc:typeof t.cover==="string"?t.cover.trim():"",bannerUrl:typeof t["banner-url"]==="string"?t["banner-url"].trim():"",summary:typeof t.summary==="string"?t.summary:"",tags:typeof t.tags==="string"?t.tags.trim():"",original:!t.reprint,listId:t["list-id"]!=null?String(t["list-id"]):"0"},o=await K(a,{title:i,body:e,format:t.html?"html":"markdown",draftOnly:d,profile:bilibiliArticleProfile,publishParams:c}),f=o.images.uploaded.length|0,n=o.images.failed.length|0;let u=o.draft?"已保存 B站专栏草稿(需在创作中心手动发布)":"已正式提交 B站专栏发表(可能进入审核态,请用 `bilibili drafts` 或访问返回 URL 回查)";if(f||n)u+=`·图片:${f} 张已转存${n?`,${n} 张失败`:""}`;return X(u,"article","",o.draft?"draft":"created",{created_target:(o.draft?"draft:":"article:")+o.id,created_url:o.url})}});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{cli as
|
|
1
|
+
import{cli as a,Strategy as t}from"@jackwener/opencli/registry";import{CommandExecutionError as o}from"@jackwener/opencli/errors";import{gotoWritePage as n}from"../_shared/article/publish.js";import{bilibiliArticleProfile as r}from"./article.js";a({site:"bilibili",name:"categories",access:"read",description:"列出 B站专栏文章分类树(id + 名称 + 父分类),供 `bilibili article --category` 取合法分类 id。优先选叶子分类(is_leaf=true)。",domain:"member.bilibili.com",strategy:t.COOKIE,browser:!0,columns:["category_id","category_name","parent_id","parent_name","is_leaf"],func:async(e)=>{if(!e)throw new o("B站专栏分类列举需要浏览器会话");await n(e,r.home,r.originRe);const i=await e.evaluate("(async () => {const r = await fetch('https://api.bilibili.com/x/article/categories', { credentials: 'include' });const j = await r.json();if (!j || j.code !== 0 || !Array.isArray(j.data)) {"+" throw new Error('获取 B站专栏分类失败:' + ((j && j.message) || ('code=' + (j && j.code))));"+"}const out = [];function walk(node, parentName) { const kids = Array.isArray(node.children) ? node.children : []; out.push({ category_id: String(node.id), category_name: node.name || '', parent_id: String(node.parent_id == null ? 0 : node.parent_id), parent_name: parentName || '', is_leaf: kids.length === 0, }); kids.forEach((c) => walk(c, node.name));}j.data.forEach((top) => walk(top, ''));return out;})()");return Array.isArray(i)?i:[]}});
|
package/clis/bilibili/coin.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{cli as
|
|
1
|
+
import{cli as p,Strategy as f}from"@jackwener/opencli/registry";import{ArgumentError as c,CommandExecutionError as u}from"@jackwener/opencli/errors";import{apiGet as d,apiPost as y,requireOkPayload as l,resolveVideoIds as h}from"./utils.js";p({site:"bilibili",name:"coin",access:"write",description:"给 B站视频投币(官方 API,需登录;消耗硬币不可撤销,需 --execute)",domain:"www.bilibili.com",strategy:f.COOKIE,args:[{name:"bvid",required:!0,positional:!0,help:"Video BV ID / URL / b23.tv short link"},{name:"count",type:"int",default:1,help:"投币数量,1 或 2(单视频累计上限 2 枚)"},{name:"with-like",type:"boolean",help:"投币同时点赞"},{name:"execute",type:"boolean",help:"Actually spend coins. Without it the command refuses to write."}],columns:["bvid","coined","total","status","url"],func:async(o,n)=>{if(!o)throw new u("Browser session required for bilibili coin");const i=Number(n.count??1);if(i!==1&&i!==2)throw new c("bilibili coin --count must be 1 or 2");if(!n.execute)throw new c("Refusing to spend coins: pass --execute to actually pay coins");const{bvid:e,aid:a}=await h(o,n.bvid),s=`https://www.bilibili.com/video/${e}`,m=await d(o,"/x/web-interface/archive/coins",{params:{aid:a,bvid:e}}),t=Number(l(m,"archive coins")?.multiply??0);if(t>=2)return[{bvid:e,coined:0,total:t,status:"already-maxed",url:s}];if(t+i>2)throw new c(`已投 ${t} 枚,再投 ${i} 枚会超过单视频 2 枚上限;改用 --count ${2-t}`);const b=await y(o,"/x/web-interface/coin/add",{params:{aid:a,bvid:e,multiply:i,like:n["with-like"]?1:0}});l(b,"coin add");const w=await d(o,"/x/web-interface/archive/coins",{params:{aid:a,bvid:e}}),r=Number(l(w,"archive coins")?.multiply??0);if(r<t+i)throw new u(`Bilibili coin did not verify: multiply=${r} after paying ${i}`);return[{bvid:e,coined:i,total:r,status:"coined",url:s}]}});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{cli as
|
|
1
|
+
import{cli as l,Strategy as m}from"@jackwener/opencli/registry";import{ArgumentError as r,CommandExecutionError as s}from"@jackwener/opencli/errors";import{apiPost as a,requireOkPayload as u,resolveVideoIds as c}from"./utils.js";function p(i){const e=Number(i);if(!Number.isSafeInteger(e)||e<=0)throw new r("bilibili comment-del rpid must be a positive integer");return e}l({site:"bilibili",name:"comment-del",access:"write",description:"删除自己发的 B站视频评论(官方 API,需登录;不可恢复,需 --execute)",domain:"www.bilibili.com",strategy:m.COOKIE,args:[{name:"bvid",required:!0,positional:!0,help:"Video BV ID / URL / b23.tv short link"},{name:"rpid",required:!0,positional:!0,help:"要删除的评论 rpid(comment 命令发布时返回的 rpid)"},{name:"execute",type:"boolean",help:"Actually delete the comment. Without it the command refuses to write."}],columns:["bvid","rpid","status"],func:async(i,e)=>{if(!i)throw new s("Browser session required for bilibili comment-del");const t=p(e.rpid);if(!e.execute)throw new r("Refusing to delete: pass --execute to actually delete this comment");const{bvid:o,aid:n}=await c(i,e.bvid),d=await a(i,"/x/v2/reply/del",{params:{oid:n,type:1,rpid:t}});u(d,"reply del");return[{bvid:o,rpid:String(t),status:"deleted"}]}});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{cli as
|
|
1
|
+
import{cli as d,Strategy as s}from"@jackwener/opencli/registry";import{ArgumentError as a,CommandExecutionError as m}from"@jackwener/opencli/errors";import{apiPost as p,requireOkPayload as u,resolveVideoIds as c}from"./utils.js";function b(e){const i=Number(e);if(!Number.isSafeInteger(i)||i<=0)throw new a("bilibili comment-like rpid must be a positive integer");return i}d({site:"bilibili",name:"comment-like",access:"write",description:"给 B站视频评论点赞 / 取消点赞(官方 API,需登录;rpid 从 comments 命令取)",domain:"www.bilibili.com",strategy:s.COOKIE,args:[{name:"bvid",required:!0,positional:!0,help:"Video BV ID / URL / b23.tv short link"},{name:"rpid",required:!0,positional:!0,help:"评论 rpid(bilibili comments 输出里的 id)"},{name:"undo",type:"boolean",help:"取消点赞(默认是点赞)"}],columns:["bvid","rpid","status","url"],func:async(e,i)=>{if(!e)throw new m("Browser session required for bilibili comment-like");const r=b(i.rpid),o=Boolean(i.undo),{bvid:t,aid:n}=await c(e,i.bvid),l=await p(e,"/x/v2/reply/action",{params:{oid:n,type:1,rpid:r,action:o?0:1}});u(l,"reply action");return[{bvid:t,rpid:String(r),status:o?"unliked":"liked",url:`https://www.bilibili.com/video/${t}#reply${r}`}]}});
|
package/clis/bilibili/comment.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{cli as
|
|
1
|
+
import{cli as h,Strategy as v}from"@jackwener/opencli/registry";import{ArgumentError as m,CommandExecutionError as l,EmptyResultError as y}from"@jackwener/opencli/errors";import{apiGet as g,apiPost as B,requireOkPayload as u,resolveBvid as I,resolveUid as x}from"./utils.js";import{assertLiteralContent as E}from"../_shared/content-guard.js";function S(i,t){const e=Number(i);if(!Number.isInteger(e)||e<=0)throw new m(`bilibili comment ${t} must be a positive integer`);return e}h({site:"bilibili",name:"comment",access:"write",description:"在 B站视频下发表评论或回复(官方 API,需登录;消息里的 @用户 会被解析为真实提及)",domain:"www.bilibili.com",strategy:v.COOKIE,args:[{name:"bvid",required:!0,positional:!0,help:"Video BV ID / URL / b23.tv short link"},{name:"message",fromFile:!0,required:!0,positional:!0,help:"Comment text. Any @username in it is resolved to a real mention"},{name:"parent",type:"int",help:"top-level/root rpid to reply under (omit for a top-level comment)"},{name:"execute",type:"boolean",help:"Actually post the comment. Without it the command refuses to write."}],columns:["rpid","bvid","oid","message","url"],func:async(i,t)=>{if(!i)throw new l("Browser session required for bilibili comment");const e=String(t.message??"").trim();E(e,{label:"评论内容"});if(!e)throw new m("bilibili comment message cannot be empty");if(!t.execute)throw new m("Refusing to post: pass --execute to actually publish this comment");const c=t.parent!=null?S(t.parent,"parent"):null;let o;try{o=await I(t.bvid)}catch(n){throw new m(`Cannot resolve Bilibili BV ID from input: ${String(t.bvid??"")}`,n instanceof Error?n.message:String(n))}const b=await g(i,"/x/web-interface/view",{params:{bvid:o}}),d=u(b,"view")?.aid;if(!d)throw new l(`Cannot resolve aid for bvid: ${o}`);const a={};for(const n of e.matchAll(/@([^\s@]+)/g)){const s=n[1];if(s in a)continue;try{const r=Number(await x(i,s));if(!Number.isInteger(r)||r<=0)throw new l(`Bilibili user search returned malformed mid for @${s}`);a[s]=r}catch(r){if(!(r instanceof y))throw r}}const f={oid:d,type:1,message:e,plat:1,...c!=null?{root:c,parent:c}:{},...Object.keys(a).length>0?{at_name_to_mid:JSON.stringify(a)}:{}},w=await B(i,"/x/v2/reply/add",{params:f}),p=u(w,"reply add")?.rpid;if(!p)throw new l("Bilibili reply add API did not return rpid for the posted comment");return[{rpid:String(p),bvid:o,oid:String(d),message:e,url:`https://www.bilibili.com/video/${o}#reply${p}`}]}});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{cli as
|
|
1
|
+
import{cli as g,Strategy as A}from"@jackwener/opencli/registry";import{ArgumentError as s,AuthRequiredError as B,CommandExecutionError as t,EmptyResultError as v}from"@jackwener/opencli/errors";import{apiGet as c,resolveBvid as y}from"./utils.js";const w=50;function I(i,e){return i===-101||i===-403||/登录|账号|权限|forbidden|permission|login/i.test(String(e??""))}function S(i){const e=i==null?20:i,r=Number(e);if(!Number.isInteger(r)||r<=0||r>w)throw new s(`bilibili comments limit must be an integer between 1 and ${w}`);return r}const p={hot:3,time:2};function E(i){const e=i==null?"hot":String(i).trim().toLowerCase(),r=p[e];if(!r)throw new s(`bilibili comments sort must be one of: ${Object.keys(p).join(", ")}`);return r}function O(i){if(i==null)return null;const e=Number(i);if(!Number.isInteger(e)||e<=0)throw new s("bilibili comments parent must be a positive integer rpid");return e}function f(i,e){if(!i||typeof i!=="object"||Array.isArray(i)||!Object.hasOwn(i,"code"))throw new t(`Bilibili ${e} API returned a malformed payload`);if(i.code!==0){const r=i.message??"unknown error";if(I(i.code,r))throw new B("bilibili.com",`Bilibili ${e} API requires login or permission: ${r} (${i.code})`);throw new t(`Bilibili ${e} API failed: ${r} (${i.code})`)}return i.data}function P(i,e){if(!i||typeof i!=="object"||Array.isArray(i))throw new t(`Bilibili ${e} API returned malformed data`);if(!Object.hasOwn(i,"replies"))throw new t(`Bilibili ${e} API did not return replies`);if(i.replies===null)return[];if(!Array.isArray(i.replies))throw new t(`Bilibili ${e} API returned malformed replies`);return i.replies}function j(i,e){if(!i||typeof i!=="object"||Array.isArray(i))throw new t(`Bilibili comments reply ${e+1} was malformed`);const r=String(i.rpid??"").trim();if(!r)throw new t(`Bilibili comments reply ${e+1} was missing rpid`);const o=Number(i.ctime);if(!Number.isFinite(o))throw new t(`Bilibili comments reply ${e+1} was missing ctime`);return{rank:e+1,rpid:r,author:String(i.member?.uname??""),text:String(i.content?.message??"").replace(/\n/g," ").trim(),likes:i.like??0,replies:i.rcount??0,time:new Date(o*1000).toISOString().slice(0,16).replace("T"," ")}}g({site:"bilibili",name:"comments",access:"read",description:"获取 B站视频评论(官方 API;用 --parent <rpid> 读取某条评论下的「楼中楼」回复;--sort time 按最新排序,发评论后回查用)",domain:"www.bilibili.com",strategy:A.COOKIE,args:[{name:"bvid",required:!0,positional:!0,help:"Video BV ID (e.g. BV1WtAGzYEBm)"},{name:"parent",type:"int",help:"rpid of a comment — fetch the replies under it instead of top-level comments"},{name:"sort",default:"hot",help:"Top-level order: hot (default) or time (newest first; use to verify a just-posted comment)"},{name:"limit",type:"int",default:20,help:"Number of comments (max 50)"}],columns:["rank","rpid","author","text","likes","replies","time"],func:async(i,e)=>{if(!i)throw new t("Browser session required for bilibili comments");let r;try{r=await y(e.bvid)}catch(l){throw new s(`Cannot resolve Bilibili BV ID from input: ${String(e.bvid??"")}`,l instanceof Error?l.message:String(l))}const o=S(e.limit),n=O(e.parent),b=E(e.sort),d=await c(i,"/x/web-interface/view",{params:{bvid:r}}),m=f(d,"view")?.aid;if(!m)throw new t(`Cannot resolve aid for bvid: ${r}`);const h=n!=null?await c(i,"/x/v2/reply/reply",{params:{oid:m,type:1,root:n,pn:1,ps:o}}):await c(i,"/x/v2/reply/main",{params:{oid:m,type:1,mode:b,ps:o},signed:!0}),a=n!=null?"reply thread":"reply main",u=P(f(h,a),a);if(u.length===0)throw new v(n!=null?`bilibili comment replies: ${n}`:`bilibili comments: ${r}`,n!=null?`该评论(rpid ${n})下当前没有可读到的回复。`+"用于去重时:读不到回复即代表本账号没在该楼回复过,可以安全发布。":`该视频(${r})当前没有可见评论(评论区为空或已关闭)。`+"用于去重时:这就是「本账号没在此视频评论过」的确证,可以安全发布。");return u.slice(0,o).map(j)}});
|
package/clis/bilibili/dm-list.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{cli as
|
|
1
|
+
import{cli as p,Strategy as u}from"@jackwener/opencli/registry";import{CommandExecutionError as f}from"@jackwener/opencli/errors";import{apiGet as _,fetchJson as b,requireOkPayload as g}from"./utils.js";export function parseMsgContent(e){const s=String(e??"");try{const t=JSON.parse(s);if(t&&typeof t==="object"){if(typeof t.content==="string")return t.content;if(typeof t.title==="string"||typeof t.text==="string")return[t.title,t.text].filter(Boolean).join(":");return s}}catch{}return s}p({site:"bilibili",name:"dm-list",access:"read",description:"B站私信会话列表(talker_id 即对方 UID,供 dm-read / dm-send 用)",domain:"www.bilibili.com",strategy:u.COOKIE,args:[{name:"limit",type:"int",default:20,help:"返回会话数上限"}],columns:["talker_id","name","last_content","unread","last_time"],func:async(e,s)=>{if(!e)throw new f("Browser session required for bilibili dm-list");const t=Math.max(1,Number(s.limit??20)),l=new URLSearchParams({session_type:"1",group_fold:"1",unfollow_fold:"0",sort_rule:"2",build:"0",mobi_app:"web"}).toString(),m=await b(e,`https://api.vc.bilibili.com/session_svr/v1/session_svr/get_sessions?${l}`),d=(g(m,"dm get_sessions")?.session_list??[]).slice(0,t),r=[];for(const i of d){const n=String(i?.talker_id??"");let o="";try{o=(await _(e,"/x/web-interface/card",{params:{mid:n}}))?.data?.card?.name??""}catch{}const a=i?.last_msg??{},c=Number(a?.timestamp??0);r.push({talker_id:n,name:o,last_content:parseMsgContent(a?.content).replace(/\s+/g," ").slice(0,80),unread:Number(i?.unread_count??0),last_time:c?new Date(c*1000).toISOString():""})}return r}});
|