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/bilibili/dm-read.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{cli as
|
|
1
|
+
import{cli as m,Strategy as l}from"@jackwener/opencli/registry";import{CommandExecutionError as g,EmptyResultError as u}from"@jackwener/opencli/errors";import{fetchJson as _,getSelfUid as p,requireOkPayload as w,resolveUid as b,wbiSign as f}from"./utils.js";import{parseMsgContent as y}from"./dm-list.js";m({site:"bilibili",name:"dm-read",access:"read",description:"读取与某 B站用户的私信记录(近 30 条;target 为 UID / 用户名)",domain:"www.bilibili.com",strategy:l.COOKIE,args:[{name:"target",required:!0,positional:!0,help:"对方 UID / 用户名(dm-list 的 talker_id)"}],columns:["time","direction","sender_uid","content","msg_type"],func:async(e,n)=>{if(!e)throw new g("Browser session required for bilibili dm-read");const i=await b(e,String(n.target??"").trim()),o=await p(e),a=await f(e,{talker_id:i,session_type:1,size:30,begin_seqno:0}),d=new URLSearchParams(a).toString().replace(/\+/g,"%20"),c=await _(e,`https://api.vc.bilibili.com/svr_sync/v1/svr_sync/fetch_session_msgs?${d}`),s=w(c,"dm fetch_session_msgs")?.messages??[];if(!s.length)throw new u(`bilibili dm-read: ${i}`,"与该用户还没有私信往来。");return s.slice().reverse().map((t)=>{const r=Number(t?.timestamp??0);return{time:r?new Date(r*1000).toISOString():"",direction:String(t?.sender_uid??"")===o?"sent":"received",sender_uid:String(t?.sender_uid??""),content:y(t?.content).replace(/\s+/g," ").slice(0,200),msg_type:Number(t?.msg_type??0)}})}});
|
package/clis/bilibili/dm-send.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{cli as
|
|
1
|
+
import{cli as l,Strategy as c}from"@jackwener/opencli/registry";import{ArgumentError as n,CommandExecutionError as o}from"@jackwener/opencli/errors";import{apiPostAbs as g,getSelfUid as u,requireOkPayload as w,resolveUid as _,wbiSign as b}from"./utils.js";import{assertLiteralContent as f}from"../_shared/content-guard.js";const p="A6716E9A-7CE3-47AF-994B-F0B34178D28D";l({site:"bilibili",name:"dm-send",access:"write",description:"给 B站用户发私信(纯文本,官方 API,需登录;不可撤回,需 --execute)",domain:"www.bilibili.com",strategy:c.COOKIE,args:[{name:"target",required:!0,positional:!0,help:"对方 UID / 用户名(dm-list 的 talker_id)"},{name:"message",fromFile:!0,required:!0,positional:!0,help:"私信内容(纯文本)"},{name:"execute",type:"boolean",help:"Actually send the message. Without it the command refuses to write."}],columns:["receiver_id","msg_key","status"],func:async(e,i)=>{if(!e)throw new o("Browser session required for bilibili dm-send");const s=String(i.message??"").trim();f(s,{label:"私信内容"});if(!s)throw new n("bilibili dm-send message cannot be empty");if(!i.execute)throw new n("Refusing to send: pass --execute to actually send this message");const t=Number(await _(e,String(i.target??"").trim())),r=Number(await u(e));if(t===r)throw new n("Cannot send a private message to yourself");const a=await b(e,{w_sender_uid:r,w_receiver_id:t}),d=await g(e,"https://api.vc.bilibili.com/web_im/v1/web_im/send_msg",{query:a,params:{"msg[sender_uid]":r,"msg[receiver_id]":t,"msg[receiver_type]":1,"msg[msg_type]":1,"msg[msg_status]":0,"msg[content]":JSON.stringify({content:s}),"msg[dev_id]":p,"msg[new_face_version]":0,"msg[timestamp]":Math.floor(Date.now()/1000),from_filework:0,build:0,mobi_app:"web"}}),m=w(d,"dm send_msg")?.msg_key;if(!m)throw new o("Bilibili send_msg API did not return msg_key for the sent message");return[{receiver_id:String(t),msg_key:String(m),status:"sent"}]}});
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import{cli as
|
|
1
|
+
import{cli as v,Strategy as x}from"@jackwener/opencli/registry";import{CliError as g,CommandExecutionError as n,EXIT_CODES as P}from"@jackwener/opencli/errors";import{checkYtdlp as _,sanitizeFilename as C}from"@jackwener/opencli/download";import{downloadMedia as E}from"@jackwener/opencli/download/media-download";import{apiGet as d,resolveBvid as O,parsePageArg as A,selectVideoPart as q}from"./utils.js";const T={vip:"大会员专享/付费 OGV",ugc_pay:"UGC 单点付费",upower:"充电专属"};function l(e){return e&&typeof e==="object"&&!Array.isArray(e)}async function B(e,r){let i;try{const t=await d(e,"/x/web-interface/view",{params:{bvid:r}});if(!l(t)||!Object.hasOwn(t,"code"))throw new n("Bilibili view API returned a malformed payload during paid-content pre-check");if(t.code!==0)return;if(!l(t.data)||!l(t.data.rights))throw new n("Bilibili view API returned malformed paid-content metadata");i=t.data}catch(t){if(t instanceof n)throw t;return}const a=i.rights,o=a.pay?"vip":a.ugc_pay||a.arc_pay?"ugc_pay":i.is_upower_exclusive?"upower":"";if(!o)return;if(o==="vip")try{const t=await d(e,"/x/web-interface/nav");if(t.code===0&&Number(t.data?.vipStatus)===1)return}catch{}throw new g("PAID_CONTENT",`该视频为付费内容(${T[o]}),当前账号无观看权益,无法获取完整视频流`,"若已购买/已充电/已开通会员,加 --force 跳过本检查直接下载",P.NOPERM)}async function S(e,r,i){let a;try{a=await d(e,"/x/web-interface/view",{params:{bvid:r}})}catch(o){throw new n(`获取视频分P信息失败: ${o?.message||o}`)}if(!l(a)||a.code!==0)throw new n(`获取视频分P信息失败: ${a?.message??"unknown"} (${a?.code??"malformed"})`);return q(a.data,i)}v({site:"bilibili",name:"download",access:"read",description:"下载B站视频(需要 yt-dlp)",domain:"www.bilibili.com",strategy:x.COOKIE,args:[{name:"bvid",required:!0,positional:!0,help:"Video BV ID (e.g., BV1xxx)"},{name:"output",default:"./bilibili-downloads",help:"Output directory"},{name:"quality",default:"best",help:"Video quality (best, 1080p, 720p, 480p)"},{name:"force",type:"boolean",default:!1,help:"跳过付费内容预检直接下载(已购买/已充电/已开通会员时用)"},{name:"page",required:!1,help:"分P 选集序号(从 1 开始)。多 P 视频下载该集;缺省下载默认 P1"}],columns:["bvid","title","status","size"],func:async(e,r)=>{const i=await O(r.bvid),a=r.output,o=r.quality,t=A(r.page),c=t!=null?await S(e,i,t):null,u=t!=null?`https://www.bilibili.com/video/${i}?p=${t}`:`https://www.bilibili.com/video/${i}`;if(!_())return[{bvid:i,title:"-",status:"failed",size:"yt-dlp not installed. Run: pip install yt-dlp"}];await e.goto(u);await e.wait(3);if(!r.force)await B(e,i);const w=await e.evaluate(`
|
|
2
2
|
(() => {
|
|
3
3
|
const title = document.querySelector('h1.video-title, .video-title')?.textContent?.trim() || 'video';
|
|
4
4
|
const author = document.querySelector('.up-name, .username')?.textContent?.trim() || 'unknown';
|
|
5
5
|
return { title, author };
|
|
6
6
|
})()
|
|
7
|
-
`),
|
|
7
|
+
`),p=(typeof c?.part==="string"?c.part.trim():"")||w?.title||"video",m=C(p),b=await e.getCookies({domain:"bilibili.com"});let s="bestvideo[ext=mp4]+bestaudio[ext=m4a]/best[ext=mp4]/best";if(o==="1080p")s="bestvideo[height<=1080][ext=mp4]+bestaudio[ext=m4a]/best[height<=1080]";else if(o==="720p")s="bestvideo[height<=720][ext=mp4]+bestaudio[ext=m4a]/best[height<=720]";else if(o==="480p")s="bestvideo[height<=480][ext=mp4]+bestaudio[ext=m4a]/best[height<=480]";const h=u,y=t!=null?`${i}_p${t}_${m}.mp4`:`${i}_${m}.mp4`,f=(await E([{type:"video-ytdlp",url:h,filename:y}],{output:a,browserCookies:b,filenamePrefix:i,ytdlpExtraArgs:["-f",s,"--merge-output-format","mp4","--embed-thumbnail"]}))[0]||{status:"failed",size:"-"};return[{bvid:i,title:p,status:f.status,size:f.size}]}});
|
package/clis/bilibili/drafts.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{cli as
|
|
1
|
+
import{cli as n,Strategy as s}from"@jackwener/opencli/registry";import{CommandExecutionError as c}from"@jackwener/opencli/errors";import{gotoWritePage as l}from"../_shared/article/publish.js";import{bilibiliArticleProfile as a}from"./article.js";n({site:"bilibili",name:"drafts",access:"read",description:"列出当前用户的 B站专栏草稿(aid + 标题 + 分类),用于发布后回查或取 aid。",domain:"member.bilibili.com",strategy:s.COOKIE,browser:!0,args:[{name:"keyword",help:"按标题关键词过滤(可空)"},{name:"page",type:"int",default:1,help:"页码,默认 1"},{name:"size",type:"int",default:10,help:"每页条数,默认 10"}],columns:["aid","title","category","words","mtime"],func:async(i,t)=>{if(!i)throw new c("B站专栏草稿列举需要浏览器会话");await l(i,a.home,a.originRe);const r=typeof t.keyword==="string"?t.keyword:"",o=Number(t.page)||1,d=Number(t.size)||10,e=await i.evaluate('(async () => {const q = new URLSearchParams();q.set("pn", '+JSON.stringify(String(o))+');q.set("ps", '+JSON.stringify(String(d))+");if ("+JSON.stringify(r)+') q.set("keyword", '+JSON.stringify(r)+");const r = await fetch('https://api.bilibili.com/x/article/creative/draft/list?' + q.toString(), { credentials: 'include' });const j = await r.json();if (!j || j.code !== 0) {"+" throw new Error('获取 B站专栏草稿失败:' + ((j && j.message) || ('code=' + (j && j.code))));"+'}const drafts = (j.data && j.data.artlist && j.data.artlist.drafts) || [];return drafts.map((d) => ({ aid: String(d.aid == null ? "" : d.aid), title: d.title || "", category: (d.category && d.category.name) || String(d.category_id == null ? "" : d.category_id), words: d.words == null ? 0 : d.words, mtime: d.mtime == null ? "" : String(d.mtime),}));})()');return Array.isArray(e)?e:[]}});
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import{cli as
|
|
2
|
-
var text = ${JSON.stringify(
|
|
1
|
+
import{cli as c,Strategy as l}from"@jackwener/opencli/registry";import{ArgumentError as d,CommandExecutionError as a}from"@jackwener/opencli/errors";import{assertLiteralContent as m}from"../_shared/content-guard.js";c({site:"bilibili",name:"dynamic-post",access:"write",description:"发布 B站动态(纯文本,官方 API,需登录)",domain:"www.bilibili.com",strategy:l.COOKIE,browser:!0,args:[{name:"text",fromFile:!0,required:!0,positional:!0,help:"Dynamic text content"},{name:"execute",type:"boolean",help:"Actually publish. Without it the command refuses to write."}],columns:["status","dynamic_id","text","url"],func:async(t,r)=>{if(!t)throw new a("Browser session required for bilibili dynamic-post");const i=String(r.text??"").trim();m(i,{label:"动态内容"});if(!i)throw new d("bilibili dynamic-post text cannot be empty");if(!r.execute)throw new d("Refusing to post: pass --execute to actually publish this dynamic");let n=!1;for(let o=0;o<4;o++){await t.goto("https://t.bilibili.com");await t.wait(2);const s=await t.evaluate("location.href");if(typeof s==="string"&&/^https?:\/\/[^/]*bilibili\.com/.test(s)){n=!0;break}}if(!n)throw new a("Failed to navigate to t.bilibili.com (page did not land on a bilibili origin)");const e=await t.evaluate(`(async () => {
|
|
2
|
+
var text = ${JSON.stringify(i)};
|
|
3
3
|
var csrf = (document.cookie.match(/bili_jct=([^;]+)/) || [])[1] || '';
|
|
4
4
|
var url = 'https://api.bilibili.com/x/dynamic/feed/create/dyn?csrf=' + encodeURIComponent(csrf);
|
|
5
5
|
var body = {
|
|
@@ -21,4 +21,4 @@ import{cli as K,Strategy as M}from"@jackwener/opencli/registry";import{ArgumentE
|
|
|
21
21
|
if (data.code !== 0) return { ok: false, message: (data.message || 'unknown error') + ' (' + data.code + ')' };
|
|
22
22
|
var dynId = data.data && (data.data.dyn_id_str || data.data.dyn_id || data.data.dynamic_id_str);
|
|
23
23
|
return { ok: true, dynId: String(dynId || ''), raw: t.slice(0, 250) };
|
|
24
|
-
})()`);if(!
|
|
24
|
+
})()`);if(!e?.ok)throw new a(`Bilibili dynamic-post failed: ${e?.message||"unknown error"}`);return[{status:"success",dynamic_id:e.dynId,text:i,url:e.dynId?`https://t.bilibili.com/${e.dynId}`:""}]}});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{cli as
|
|
1
|
+
import{cli as y,Strategy as h}from"@jackwener/opencli/registry";import{ArgumentError as c,CommandExecutionError as l}from"@jackwener/opencli/errors";import{apiGet as _,apiPost as g,getSelfUid as S,requireOkPayload as m,resolveVideoIds as I}from"./utils.js";async function u(t,o){const i=await S(t),a=await _(t,"/x/v3/fav/folder/created/list-all",{params:{up_mid:i,type:2,rid:o},signed:!0}),d=m(a,"fav folder list")?.list??[];if(!Array.isArray(d)||d.length===0)throw new l("Bilibili fav folder list returned no folders for this account");return d}function v(t,o){const i=String(o??"").trim();if(!i)return t[0];const a=t.find((r)=>String(r.id)===i);if(a)return a;const e=t.filter((r)=>String(r.title??"")===i);if(e.length===1)return e[0];if(e.length>1)throw new c(`收藏夹标题「${i}」有 ${e.length} 个同名,请改用 ID:${e.map((r)=>r.id).join(", ")}`);const d=t.map((r)=>`${r.id}=${r.title}`).join(", ");throw new c(`找不到收藏夹「${i}」;现有收藏夹:${d}`)}y({site:"bilibili",name:"favorite-add",access:"write",description:"把 B站视频加入 / 移出收藏夹(官方 API,需登录;--folder 缺省用默认收藏夹)",domain:"www.bilibili.com",strategy:h.COOKIE,args:[{name:"bvid",required:!0,positional:!0,help:"Video BV ID / URL / b23.tv short link"},{name:"folder",help:"目标收藏夹 ID 或标题(缺省用默认收藏夹)"},{name:"remove",type:"boolean",help:"从收藏夹移出(默认是加入)"}],columns:["bvid","folder_id","folder","status","url"],func:async(t,o)=>{if(!t)throw new l("Browser session required for bilibili favorite-add");const i=Boolean(o.remove),{bvid:a,aid:e}=await I(t,o.bvid),d=`https://www.bilibili.com/video/${a}`,r=await u(t,e),n=v(r,o.folder),w=Number(n.fav_state??0)===1,s={bvid:a,folder_id:String(n.id),folder:String(n.title??""),url:d};if(w===!i)return[{...s,status:i?"not-in-folder":"already-favorited"}];const b=await g(t,"/x/v3/fav/resource/deal",{params:{rid:e,type:2,add_media_ids:i?"":String(n.id),del_media_ids:i?String(n.id):""}});m(b,"fav resource deal");const f=(await u(t,e)).find((p)=>String(p.id)===String(n.id));if(Number(f?.fav_state??0)!==(i?0:1))throw new l(`Bilibili favorite did not verify: fav_state=${f?.fav_state} after ${i?"remove":"add"}`);return[{...s,status:i?"removed":"favorited"}]}});export const __test__={pickFolder:v};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{cli as
|
|
1
|
+
import{cli as p,Strategy as u}from"@jackwener/opencli/registry";import{apiGet as d,payloadData as o,getSelfUid as c}from"./utils.js";p({site:"bilibili",name:"favorite",access:"write",description:"我的收藏夹",domain:"www.bilibili.com",strategy:u.COOKIE,args:[{name:"fid",type:"int",required:!1,help:"Favorite folder ID (defaults to first folder)"},{name:"limit",type:"int",default:20,help:"Number of results"},{name:"page",type:"int",default:1,help:"Page number"}],columns:["rank","title","author","plays","url"],func:async(i,n)=>{const{fid:l,limit:r=20,page:m=1}=n;let a;if(l)a=Number(l);else{const e=await c(i),t=await d(i,"/x/v3/fav/folder/created/list-all",{params:{up_mid:e},signed:!0}),s=o(t)?.list??[];if(!s.length)return[];a=s[0].id}const f=await d(i,"/x/v3/fav/resource/list",{params:{media_id:a,pn:m,ps:Math.min(Number(r),40)},signed:!0});return(o(f)?.medias??[]).slice(0,Number(r)).map((e,t)=>({rank:t+1,title:e.title??"",author:e.upper?.name??"",plays:e.cnt_info?.play??0,url:e.bvid?`https://www.bilibili.com/video/${e.bvid}`:""}))}});
|
package/clis/bilibili/feed.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{cli as
|
|
2
|
-
`)});if(
|
|
1
|
+
import{cli as v,Strategy as y}from"@jackwener/opencli/registry";import{apiGet as _,payloadData as b,resolveUid as w,stripHtml as h}from"./utils.js";const g={DYNAMIC_TYPE_AV:"video",DYNAMIC_TYPE_DRAW:"draw",DYNAMIC_TYPE_ARTICLE:"article",DYNAMIC_TYPE_FORWARD:"forward",DYNAMIC_TYPE_WORD:"text",DYNAMIC_TYPE_LIVE_RCMD:"live",DYNAMIC_TYPE_PGC:"bangumi"};function x(a){const s=a.modules??{},d=s.module_author??{},m=s.module_dynamic??{},e=m.major??{},f=s.module_stat??{};let t="",l=a.id_str?`https://t.bilibili.com/${a.id_str}`:"";const o=g[a.type]??a.type??"";if(e.archive){t=e.archive.title??"";l=e.archive.jump_url?`https:${e.archive.jump_url}`:l}if(!t&&e.article){t=e.article.title??"";l=e.article.jump_url?`https:${e.article.jump_url}`:l}if(!t&&m.desc?.text)t=h(m.desc.text).slice(0,60);if(!t&&e.draw){const u=e.draw.items?.length??0;t=u>0?`[图片x${u}]`:"[图文动态]"}if(!t&&a.basic?.is_only_fans)t="[充电专属]";if(!t&&a.type==="DYNAMIC_TYPE_FORWARD")t="[转发动态]";if(!t)t=`[${o||"动态"}]`;const n=d.pub_time??"",i=f.like?.count??0,c=f.comment?.count??0;return{title:t,url:l,itemType:o,author:d.name??"",time:n,likes:i,comments:c}}v({site:"bilibili",name:"feed",access:"read",description:"动态时间线(不传 uid 查关注时间线,传 uid 查指定用户动态)",domain:"www.bilibili.com",strategy:y.COOKIE,args:[{name:"uid",positional:!0,required:!1,help:"用户 UID 或用户名(不传则显示关注时间线)"},{name:"limit",type:"int",default:20,help:"Max results to return"},{name:"type",default:"all",help:"Filter: all, video, article, draw, text"},{name:"pages",type:"int",default:1,help:"Number of pages to fetch (each ~20 items)"}],columns:["rank","time","author","title","type","likes","url"],func:async(a,s)=>{const d=Number(s.limit)||20,m=Number(s.pages)||1,e=s.type==="all"?"":s.type??"",f=!!s.uid,t=f?await w(a,String(s.uid)):null,l=[];let o="";for(let n=0;n<m;n++){if(l.length>=d)break;let i;if(f){const r={host_mid:t,timezone_offset:-480};if(o)r.offset=o;i=await _(a,"/x/polymer/web-dynamic/v1/feed/space",{params:r})}else{const r={timezone_offset:-480,type:e||"all",page:n+1};if(o)r.offset=o;i=await _(a,"/x/polymer/web-dynamic/v1/feed/all",{params:r})}const c=b(i)??{},u=c.items??[];if(u.length===0)break;for(const r of u){if(l.length>=d)break;const p=x(r);if(e&&p.itemType!==e)continue;l.push({rank:l.length+1,time:p.time,author:p.author,title:p.title,type:p.itemType,likes:p.likes,url:p.url})}o=c.offset??u[u.length-1]?.id_str??"";if(!o||!c.has_more)break}return l}});v({site:"bilibili",name:"feed-detail",access:"read",description:"查看 Bilibili 动态详情(支持充电专属内容)",domain:"www.bilibili.com",strategy:y.COOKIE,args:[{name:"id",positional:!0,required:!0,help:"动态 ID(从 feed 命令的 url 中获取)"}],columns:["field","value"],func:async(a,s)=>{const d=String(s.id),m=await _(a,"/x/polymer/web-dynamic/v1/detail",{params:{id:d,timezone_offset:-480}}),e=[],t=b(m)?.item;if(!t){e.push({field:"error",value:"动态不存在或无权查看"});return e}const l=t.modules??{},o=l.module_author??{},n=l.module_dynamic??{},i=n.major??{},c=l.module_stat??{};e.push({field:"id",value:t.id_str??d});e.push({field:"author",value:o.name??""});e.push({field:"time",value:o.pub_time??""});e.push({field:"type",value:g[t.type]??t.type??""});if(n.desc?.text)e.push({field:"text",value:h(n.desc.text)});if(i.archive){e.push({field:"video_title",value:i.archive.title??""});e.push({field:"video_desc",value:i.archive.desc??""});e.push({field:"video_url",value:i.archive.jump_url?`https:${i.archive.jump_url}`:""});e.push({field:"play",value:String(i.archive.stat?.play??"")});e.push({field:"danmaku",value:String(i.archive.stat?.danmaku??"")})}if(i.article){e.push({field:"article_title",value:i.article.title??""});e.push({field:"article_url",value:i.article.jump_url?`https:${i.article.jump_url}`:""})}if(i.draw?.items?.length)e.push({field:"images",value:i.draw.items.map((u)=>u.src).join(`
|
|
2
|
+
`)});if(i.opus?.summary?.text)e.push({field:"opus_text",value:h(i.opus.summary.text)});if(i.opus?.title)e.push({field:"opus_title",value:i.opus.title});if(t.orig){const u=t.orig.modules?.module_author?.name??"",r=t.orig.modules?.module_dynamic?.desc?.text??"";e.push({field:"forward_from",value:u});if(r)e.push({field:"forward_text",value:h(r).slice(0,200)})}e.push({field:"likes",value:String(c.like?.count??0)});e.push({field:"comments",value:String(c.comment?.count??0)});e.push({field:"forwards",value:String(c.forward?.count??0)});e.push({field:"url",value:`https://t.bilibili.com/${t.id_str??d}`});return e}});
|
package/clis/bilibili/follow.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{cli as
|
|
1
|
+
import{cli as b,Strategy as d}from"@jackwener/opencli/registry";import{ArgumentError as n,CommandExecutionError as l,EmptyResultError as h}from"@jackwener/opencli/errors";import{apiPost as p,fetchJson as y,getSelfUid as E,requireOkPayload as f,resolveUid as g}from"./utils.js";const _=5000,R=500;function I(r){const e=String(r??"").trim();if(!e)return"";const t=/^https?:\/\//i.test(e)?e:`https://${e}`;let i;try{i=new URL(t)}catch{return""}if(i.hostname.toLowerCase()!=="space.bilibili.com")return"";const o=i.pathname.match(/^\/(\d+)\/?$/);return o?o[1]:""}async function m(r,e){const t=String(e??"").trim();if(!t)throw new n("bilibili follow target cannot be empty");if(/^(?:https?:\/\/)?space\.bilibili\.com\//i.test(t)){const i=I(t);if(!i)throw new n("bilibili follow target must be a valid space.bilibili.com/<uid> URL");return i}try{return await g(r,t)}catch(i){if(i instanceof h)throw i;throw new n(`Cannot resolve Bilibili target from input: ${t}`,i instanceof Error?i.message:String(i))}}async function s(r,e){const t=await y(r,`https://api.bilibili.com/x/relation?fid=${e}`);f(t,"relation query");const i=t?.data?.attribute;if(typeof i!=="number")throw new l("Bilibili relation query returned a malformed attribute");return i}async function w(r,e,t,i){const o=Date.now()+_;let a;while(Date.now()<=o){a=await s(r,e);if(t(a))return a;if(typeof r.wait!=="function")break;await r.wait({time:R/1000})}throw new l(`Bilibili relation modify did not verify ${i}; last attribute=${a}`)}b({site:"bilibili",name:"follow",access:"write",description:"关注 B站用户(官方 API,需登录)",domain:"www.bilibili.com",strategy:d.COOKIE,args:[{name:"target",required:!0,positional:!0,help:"目标 UID / 用户名 / space.bilibili.com 链接"}],columns:["mid","name","status","url"],func:async(r,e)=>{if(!r)throw new l("Browser session required for bilibili follow");const t=await m(r,e.target),i=await E(r);if(t===i)throw new n("Cannot follow yourself");const o=await s(r,t),a=`https://space.bilibili.com/${t}`;if(o===2||o===6)return[{mid:t,name:"",status:"already-following",url:a}];if(o===128)throw new l(`Bilibili user ${t} is blocked; unblock first before following.`);const u=await p(r,"/x/relation/modify",{params:{fid:t,act:1,re_src:11}});f(u,"relation modify");await w(r,t,(c)=>c===2||c===6,"following");return[{mid:t,name:"",status:"followed",url:a}]}});export const __test__={resolveTargetMid:m,fetchRelationAttribute:s,waitForRelation:w};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{cli as
|
|
1
|
+
import{cli as m,Strategy as d}from"@jackwener/opencli/registry";import{CommandExecutionError as l}from"@jackwener/opencli/errors";import{fetchJson as f,getSelfUid as c,resolveUid as p}from"./utils.js";m({site:"bilibili",name:"following",access:"read",description:"获取 Bilibili 用户的关注列表",domain:"www.bilibili.com",strategy:d.COOKIE,args:[{name:"uid",positional:!0,required:!1,help:"目标用户 ID(默认为当前登录用户)"},{name:"page",type:"int",required:!1,default:1,help:"页码"},{name:"limit",type:"int",required:!1,default:50,help:"每页数量 (最大 50)"}],columns:["mid","name","sign","following","fans"],func:async(t,n)=>{if(!t)throw new l("Browser session required for bilibili following");const a=n.uid?await p(t,n.uid):await c(t),s=n.page??1,r=Math.min(n.limit??50,50),i=await f(t,`https://api.bilibili.com/x/relation/followings?vmid=${a}&pn=${s}&ps=${r}&order=desc`);if(i.code!==0)throw new l(`获取关注列表失败: ${i.message} (${i.code})`);const o=i.data?.list||[];if(o.length===0)return[{mid:"-",name:`共 ${i.data?.total??0} 人关注,当前页无数据`,sign:"",following:"",fans:""}];return o.map((e)=>({mid:e.mid,name:e.uname,sign:(e.sign||"").slice(0,40),following:e.attribute===6?"互相关注":"已关注",fans:e.official_verify?.desc||""}))}});
|
package/clis/bilibili/like.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{cli as
|
|
1
|
+
import{cli as u,Strategy as b}from"@jackwener/opencli/registry";import{CommandExecutionError as s}from"@jackwener/opencli/errors";import{apiGet as f,apiPost as k,requireOkPayload as c,resolveVideoIds as m}from"./utils.js";const h=5000,v=500;async function r(i,o,e){const t=await f(i,"/x/web-interface/archive/relation",{params:{aid:o,bvid:e}});return c(t,"archive relation")}async function y(i,o,e,t){const n=Date.now()+h;let a;while(Date.now()<=n){a=Boolean((await r(i,o,e))?.like);if(a===t)return;if(typeof i.wait!=="function")break;await i.wait({time:v/1000})}throw new s(`Bilibili like did not verify: relation.like=${a}, expected ${t}`)}u({site:"bilibili",name:"like",access:"write",description:"给 B站视频点赞 / 取消点赞(官方 API,需登录;幂等,已点赞再点不会报错)",domain:"www.bilibili.com",strategy:b.COOKIE,args:[{name:"bvid",required:!0,positional:!0,help:"Video BV ID / URL / b23.tv short link"},{name:"undo",type:"boolean",help:"取消点赞(默认是点赞)"}],columns:["bvid","action","status","url"],func:async(i,o)=>{if(!i)throw new s("Browser session required for bilibili like");const e=Boolean(o.undo),{bvid:t,aid:n}=await m(i,o.bvid),a=`https://www.bilibili.com/video/${t}`,l=e?"unlike":"like",d=await r(i,n,t);if(Boolean(d?.like)===!e)return[{bvid:t,action:l,status:e?"not-liked":"already-liked",url:a}];const w=await k(i,"/x/web-interface/archive/like",{params:{aid:n,like:e?2:1}});c(w,"archive like");await y(i,n,t,!e);return[{bvid:t,action:l,status:e?"unliked":"liked",url:a}]}});export const __test__={fetchVideoRelation:r};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{cli as
|
|
1
|
+
import{cli as a,Strategy as o}from"@jackwener/opencli/registry";import{CommandExecutionError as r}from"@jackwener/opencli/errors";async function n(t){for(let i=0;i<6;i++){await t.goto("https://member.bilibili.com/platform/home");await t.wait({time:1});let e="";try{e=String(await t.evaluate("location.href")||"")}catch{e=""}if(/^https?:\/\/member\.bilibili\.com\//.test(e))return}throw new r("无法进入 B站创作中心(可能未登录或被风控)。请先在客户端登录哔哩哔哩。")}a({site:"bilibili",name:"partitions",aliases:["tid-list"],access:"read",description:"列出 B站视频投稿分区(tid + 名称 + 父分区 + 简介),供 `bilibili upload --tid` 取合法分区 id。禁止臆造 tid。",domain:"member.bilibili.com",strategy:o.COOKIE,browser:!0,columns:["tid","name","parent","parent_name","desc"],func:async(t)=>{if(!t)throw new r("B站分区列举需要浏览器会话");await n(t);const i=await t.evaluate("(async () => {const r = await fetch('https://member.bilibili.com/x/vupre/web/archive/pre?lang=cn', { credentials: 'include' });const j = await r.json();const tree = j && j.data ? (j.data.typelist || j.data.tid_list) : null;if (!j || j.code !== 0 || !Array.isArray(tree)) {"+" throw new Error('获取 B站视频分区失败(可能未登录 B站):' + ((j && j.message) || ('code=' + (j && j.code))));"+'}const out = [];for (const p of tree) { const kids = Array.isArray(p.children) ? p.children : []; for (const c of kids) { if (!c || c.show === false) continue; out.push({ tid: c.id, name: c.name || "", parent: p.id, parent_name: p.name || "", desc: c.desc || c.description || "", }); }}return out;})()');if(!Array.isArray(i)||!i.length)throw new r("未取到任何 B站视频分区(接口返回空,可能未登录)");return i}});
|
package/clis/bilibili/stats.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{cli as
|
|
1
|
+
import{cli as g,Strategy as v}from"@jackwener/opencli/registry";import{CommandExecutionError as y,EmptyResultError as k}from"@jackwener/opencli/errors";import{fetchJson as h,requireOkPayload as _}from"./utils.js";const f=10;async function N(i){for(let s=0;s<6;s++){await i.goto("https://member.bilibili.com/platform/upload-manager/article");await i.wait({time:1});let r="";try{r=String(await i.evaluate("location.href")||"")}catch{r=""}if(/^https?:\/\/member\.bilibili\.com\//.test(r))return}throw new y("无法进入 B站创作中心(可能未登录或被风控)。请先在客户端登录哔哩哔哩。")}function S(i){if(!i||!Number.isFinite(Number(i)))return"";const s=new Date((Number(i)+28800)*1000),r=(n)=>String(n).padStart(2,"0");return`${s.getUTCFullYear()}-${r(s.getUTCMonth()+1)}-${r(s.getUTCDate())} ${r(s.getUTCHours())}:${r(s.getUTCMinutes())}`}function a(i){if(i==null||i===""||i==="-")return"";const s=Number(String(i).replace(/,/g,""));return Number.isFinite(s)?s:""}async function x(i,s){const r=[];for(let n=1;r.length<s;n++){const m=`https://member.bilibili.com/x/web/archives?status=is_pubing%2Cpubed%2Cnot_pubed&pn=${n}&ps=${f}&coop=1&interactive=1`,d=await h(i,m),u=_(d,"archives"),o=Array.isArray(u?.arc_audits)?u.arc_audits:[];if(o.length===0)break;for(const l of o){const t=l?.Archive??{},e=l?.stat??{},p=Number(t.ptime)||Number(t.ctime)||0,c={};if(e.dislike)c.dislike=e.dislike;if(e.now_rank)c.now_rank=e.now_rank;if(e.his_rank)c.his_rank=e.his_rank;if(e.vt)c.vt=e.vt;if(l.typename)c.category=l.typename;if(l.parent_tname)c.parent_category=l.parent_tname;if(t.aid!=null)c.aid=t.aid;if(t.duration)c.duration=t.duration;r.push({id:t.bvid||(t.aid!=null?`av${t.aid}`:""),type:"video",title:t.title??"",url:t.bvid?`https://www.bilibili.com/video/${t.bvid}`:"",published_at:S(p),views:a(e.view),likes:a(e.like),comments:a(e.reply),collects:a(e.favorite),shares:a(e.share),danmaku:a(e.danmaku),coins:a(e.coin),status:t.state_desc??"",extra:JSON.stringify(c),_ts:p})}const b=Number(u?.page?.count)||0;if(n*f>=b)break}return r}async function C(i,s){const r="%7B%22platform%22:%22web%22,%22device%22:%22pc%22,%22spmid%22:%22333.1374%22%7D",n=[];for(let m=1;n.length<s;m++){const d=`https://api.bilibili.com/x/polymer/web-dynamic/v1/opus/creationlist?ps=${f}&pn=${m}&classification_type=0&creation_type=0&web_location=333.1374&x-bili-device-req-json=${r}`,u=await h(i,d),o=_(u,"opus creationlist"),b=Array.isArray(o?.items)?o.items:[];if(b.length===0)break;for(const t of b){const e=t?.stat??{},p=String(t?.dyn_type)==="64",c=Math.floor((Date.parse(`${String(t?.pub_time??"").replace(" ","T")}:00+08:00`)||0)/1000),w={dyn_id:t?.dyn_id??"",dyn_type:t?.dyn_type??""};if(t?.filter_group?.reason)w.reason=t.filter_group.reason;n.push({id:p?`cv${t.rid}`:String(t?.dyn_id??""),type:p?"article":"opus",title:t?.title??"",url:p?`https://www.bilibili.com/read/cv${t.rid}`:t?.dyn_id?`https://www.bilibili.com/opus/${t.dyn_id}`:"",published_at:t?.pub_time??"",views:a(e.view),likes:a(e.like),comments:a(e.reply),collects:a(e.favorite),shares:"",danmaku:"",coins:a(e.coin),status:"",extra:JSON.stringify(w),_ts:c})}if(!o?.has_more)break;const l=Number(o?.total)||0;if(l&&m*f>=l)break}return n}g({site:"bilibili",name:"stats",access:"read",description:"B站稿件数据(每个视频/图文/专栏稿件的播放、点赞、投币、收藏、弹幕、分享、评论等全量运营指标)",domain:"member.bilibili.com",strategy:v.COOKIE,browser:!0,args:[{name:"limit",type:"int",default:20,help:"返回条数(视频与图文合并后按发布时间倒序截取)"}],columns:["id","type","title","url","published_at","views","likes","comments","collects","shares","danmaku","coins","status","extra"],func:async(i,s)=>{if(!i)throw new y("B站稿件数据需要浏览器会话");const r=s?.limit||20;await N(i);const[n,m]=[await x(i,r),await C(i,r)],d=[...n,...m].sort((u,o)=>(o._ts||0)-(u._ts||0)).slice(0,r);if(d.length===0)throw new k("bilibili stats","未取到任何稿件数据。请确认已登录 B站且该账号发布过视频或图文稿件。");return d.map(({_ts:u,...o})=>o)}});
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import{cli as
|
|
1
|
+
import{cli as _,Strategy as F}from"@jackwener/opencli/registry";import{AuthRequiredError as y,CommandExecutionError as e,EmptyResultError as g}from"@jackwener/opencli/errors";import{apiGet as p,resolveBvid as N,parsePageArg as J,selectVideoPart as P}from"./utils.js";_({site:"bilibili",name:"subtitle",access:"read",description:"获取 Bilibili 视频的字幕",domain:"www.bilibili.com",strategy:F.COOKIE,args:[{name:"bvid",required:!0,positional:!0,help:"Bilibili 视频 BV ID(如 BV1xx411c7mD),或视频 URL / b23.tv 短链"},{name:"lang",required:!1,help:"字幕语言代码 (如 zh-CN, en-US, ai-zh),默认取第一个"},{name:"page",required:!1,help:"分P 选集序号(从 1 开始)。多 P 视频取该集字幕;缺省取默认 P1"}],columns:["index","from","to","content"],func:async(a,l)=>{if(!a)throw new e("Browser session required for bilibili subtitle");const u=await N(l.bvid),d=J(l.page);let o;try{o=await p(a,"/x/web-interface/view",{params:{bvid:u}})}catch(t){throw new e(`获取视频信息失败: ${t?.message||t}`)}if(o?.code!==0)throw new e(`获取视频信息失败: ${o?.message??"unknown"} (${o?.code})`);const f=d!=null?P(o?.data,d).cid:o?.data?.cid;if(!f)throw new e(`无法从 view API 拿到 cid (bvid=${u})`);let r;try{r=await p(a,"/x/player/wbi/v2",{params:{bvid:u,cid:f},signed:!0})}catch(t){throw new e(`获取视频播放信息失败: ${t?.message||t}`)}if(!r||typeof r!=="object"||Array.isArray(r))throw new e("获取到的视频播放信息对象不符合预期格式");if(r.code!==0)throw new e(`获取视频播放信息失败: ${r.message} (${r.code})`);const x=r.data?.need_login_subtitle===!0,s=r.data?.subtitle?.subtitles;if(!Array.isArray(s))throw new e("获取到的字幕列表对象不符合数组格式");if(s.length===0){if(x)throw new y("bilibili.com","Bilibili subtitles are hidden behind login for this video. Please log in to bilibili.com in Chrome and retry.");throw new g("bilibili subtitle","此视频没有发现外挂或智能字幕。")}const n=l.lang?s.find((t)=>t.lan===l.lang)||s[0]:s[0];if(!n||typeof n!=="object"||!Object.hasOwn(n,"subtitle_url"))throw new e("字幕条目缺少 subtitle_url 字段");const c=typeof n.subtitle_url==="string"?n.subtitle_url.trim():"";if(!c)throw new y("bilibili.com","[风控拦截/未登录] 获取到的 subtitle_url 为空!请确保 CLI 已成功登录且风控未封锁此账号。");const b=c.startsWith("//")?"https:"+c:c;if(!/^https?:\/\//i.test(b))throw new e(`字幕 URL 非法: ${b}`);const A=`
|
|
2
2
|
(async () => {
|
|
3
|
-
const url = ${JSON.stringify(
|
|
3
|
+
const url = ${JSON.stringify(b)};
|
|
4
4
|
const res = await fetch(url);
|
|
5
5
|
const text = await res.text();
|
|
6
6
|
|
|
@@ -18,4 +18,4 @@ import{cli as j,Strategy as A}from"@jackwener/opencli/registry";import{AuthRequi
|
|
|
18
18
|
return { error: 'PARSE_FAILED', text: text.substring(0, 100) };
|
|
19
19
|
}
|
|
20
20
|
})()
|
|
21
|
-
`;let
|
|
21
|
+
`;let i;try{i=await a.evaluate(A)}catch(t){throw new e(`字幕获取失败: ${t?.message||t}`)}if(i?.error)throw new e(`字幕获取失败: ${i.error}${i.text?" — "+i.text:""}`);if(!i||typeof i!=="object"||i.success!==!0)throw new e("字幕获取结果对象不符合预期格式");const w=i.data;if(!Array.isArray(w))throw new e("解析到的字幕列表对象不符合数组格式");if(w.length===0)throw new g("bilibili subtitle","字幕文件中没有字幕片段。");return w.map((t,v)=>{const h=Number(t?.from),m=Number(t?.to);if(!t||typeof t!=="object"||!Number.isFinite(h)||!Number.isFinite(m))throw new e("字幕片段缺少有效 from/to 时间戳");return{index:v+1,from:h.toFixed(2)+"s",to:m.toFixed(2)+"s",content:String(t.content??"")}})}});
|
package/clis/bilibili/summary.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{cli as
|
|
1
|
+
import{cli as y,Strategy as A}from"@jackwener/opencli/registry";import{ArgumentError as m,AuthRequiredError as B,CommandExecutionError as e,EmptyResultError as u}from"@jackwener/opencli/errors";import{apiGet as f,resolveBvid as I}from"./utils.js";const v=/(^|\.)bilibili\.com$/i,g=/(^|\.)b23\.tv$/i,_=/^BV[A-Za-z0-9]+$/;function a(t){const r=Math.max(0,Math.floor(Number(t)||0)),i=Math.floor(r/3600),o=Math.floor(r%3600/60),n=r%60,s=(c)=>String(c).padStart(2,"0");return i>0?`${i}:${s(o)}:${s(n)}`:`${s(o)}:${s(n)}`}async function w(t){const r=String(t??"").trim();if(!r)throw new m("bilibili summary bvid cannot be empty","Pass a BV ID, Bilibili video URL, or b23.tv short link.");if(_.test(r))return r;let i=null;try{i=new URL(r)}catch{}if(i){if(i.protocol!=="https:"&&i.protocol!=="http:")throw new m("Bilibili summary URL must use http or https");if(v.test(i.hostname)){const o=i.pathname.match(/\/(?:video|bangumi\/play)\/(BV[A-Za-z0-9]+)/i);if(!o)throw new m("Bilibili summary URL must contain a BV video id");return o[1]}if(!g.test(i.hostname))throw new m("Bilibili summary URL must be a bilibili.com or b23.tv URL")}try{return await I(r)}catch(o){throw new m(`Cannot resolve Bilibili BV ID from input: ${r}`,o instanceof Error?o.message:String(o))}}function d(t,r){if(!t||typeof t!=="object"||Array.isArray(t))throw new e(`Bilibili ${r} API returned a malformed payload`);if(t.code!==0){const i=t.message??"unknown error";if(t.code===-101||t.code===-403||/登录|权限|forbidden|permission|login/i.test(String(i)))throw new B("bilibili.com",`Bilibili ${r} API requires login or permission: ${i} (${t.code})`);throw new e(`Bilibili ${r} API failed: ${i} (${t.code})`)}return t.data}function b(t,r){if(!t||typeof t!=="object"||Array.isArray(t))throw new e("Bilibili conclusion API returned malformed data");if(t.code!==0)throw new u("bilibili summary",`Bilibili has not generated an AI summary for ${r}.`);let i=t.model_result;if(typeof i==="string")try{i=JSON.parse(i)}catch{throw new e("Bilibili conclusion API returned malformed model_result JSON")}if(!i||typeof i!=="object"||Array.isArray(i))throw new e("Bilibili conclusion API returned malformed model_result");const o=String(i.summary??"").trim();if(!o)throw new u("bilibili summary",`Bilibili has not generated an AI summary for ${r}.`);const n=i.outline??[];if(!Array.isArray(n))throw new e("Bilibili conclusion API returned malformed outline");return{summary:o,outline:n}}function h(t){const r=[{time:"",content:t.summary}];for(const i of t.outline){if(!i||typeof i!=="object"||Array.isArray(i))throw new e("Bilibili conclusion API returned malformed outline section");const o=String(i.title??"").trim(),n=a(i.timestamp);if(o)r.push({time:n,content:`# ${o}`});const s=i.part_outline??[];if(!Array.isArray(s))throw new e("Bilibili conclusion API returned malformed part outline");for(const c of s){if(!c||typeof c!=="object"||Array.isArray(c))throw new e("Bilibili conclusion API returned malformed outline point");const l=String(c.content??"").trim();if(l)r.push({time:a(c.timestamp),content:l})}}return r}var R=y({site:"bilibili",name:"summary",access:"read",description:"获取 B站视频的官方 AI 总结(视频页「AI总结」同款,含分段大纲与时间戳)",domain:"www.bilibili.com",strategy:A.COOKIE,args:[{name:"bvid",required:!0,positional:!0,help:"Video BV ID / URL / b23.tv short link"}],columns:["time","content"],func:async(t,r)=>{if(!t)throw new e("Browser session required for bilibili summary");const i=await w(r.bvid),o=await f(t,"/x/web-interface/view",{params:{bvid:i}}),n=d(o,"view"),s=n?.cid,c=n?.owner?.mid;if(!s||!c)throw new e(`Bilibili view API did not return cid/up_mid for ${i}`);const l=await f(t,"/x/web-interface/view/conclusion/get",{params:{bvid:i,cid:s,up_mid:c},signed:!0}),p=d(l,"conclusion");return h(b(p,i))}});export const __test__={command:R,formatTime:a,readBvid:w,readModelResult:b,rowsFromModel:h};
|
package/clis/bilibili/topics.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{cli as
|
|
1
|
+
import{cli as a,Strategy as n}from"@jackwener/opencli/registry";import{ArgumentError as c,CommandExecutionError as o}from"@jackwener/opencli/errors";async function l(i){for(let t=0;t<6;t++){await i.goto("https://member.bilibili.com/platform/home");await i.wait({time:1});let e="";try{e=String(await i.evaluate("location.href")||"")}catch{e=""}if(/^https?:\/\/member\.bilibili\.com\//.test(e))return}throw new o("无法进入 B站创作中心(可能未登录或被风控)。请先在客户端登录哔哩哔哩。")}a({site:"bilibili",name:"topics",aliases:["topic-list"],access:"read",description:"列出某分区下可参与的投稿话题(topic_id + 名称 + 简介 + 播放量),供 `bilibili upload --topic` 取合法 topic_id。禁止臆造。先用 `bilibili partitions` 取 tid。",domain:"member.bilibili.com",strategy:n.COOKIE,browser:!0,args:[{name:"tid",type:"number",required:!0,help:"分区 id(用 `bilibili partitions` 取)。话题按分区提供。"}],columns:["topic_id","name","play","desc"],func:async(i,t)=>{if(!i)throw new o("B站话题列举需要浏览器会话");if(t.tid==null||t.tid===""||!Number.isFinite(Number(t.tid)))throw new c("必须用 --tid 指定分区 id(数字)。用 `bilibili partitions` 列举分区。");const e=Number(t.tid);await l(i);const r=await i.evaluateWithArgs("(async () => {const r = await fetch('https://member.bilibili.com/x/vupre/web/topic/type?type_id=' + encodeURIComponent(tid) + '&pn=0&ps=200', { credentials: 'include' });const j = await r.json();if (!j || j.code !== 0 || !j.data || !Array.isArray(j.data.topics)) {"+" throw new Error('获取 B站话题失败(可能未登录 B站):' + ((j && j.message) || ('code=' + (j && j.code))));"+'}return j.data.topics.map(function (t) { return { topic_id: t.topic_id, name: t.topic_name || "", play: t.arc_play_vv != null ? t.arc_play_vv : "", desc: (t.description || t.activity_description || "").slice(0, 60), };});})()',{tid:e});if(!Array.isArray(r))throw new o("未取到话题列表(接口返回异常)");if(!r.length)return[];return r}});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{cli as
|
|
1
|
+
import{cli as d,Strategy as b}from"@jackwener/opencli/registry";import{ArgumentError as a,CommandExecutionError as l,EmptyResultError as p}from"@jackwener/opencli/errors";import{apiPost as h,fetchJson as y,getSelfUid as E,requireOkPayload as u,resolveUid as _}from"./utils.js";const g=5000,R=500;function I(r){const e=String(r??"").trim();if(!e)return"";const t=/^https?:\/\//i.test(e)?e:`https://${e}`;let i;try{i=new URL(t)}catch{return""}if(i.hostname.toLowerCase()!=="space.bilibili.com")return"";const o=i.pathname.match(/^\/(\d+)\/?$/);return o?o[1]:""}async function m(r,e){const t=String(e??"").trim();if(!t)throw new a("bilibili unfollow target cannot be empty");if(/^(?:https?:\/\/)?space\.bilibili\.com\//i.test(t)){const i=I(t);if(!i)throw new a("bilibili unfollow target must be a valid space.bilibili.com/<uid> URL");return i}try{return await _(r,t)}catch(i){if(i instanceof p)throw i;throw new a(`Cannot resolve Bilibili target from input: ${t}`,i instanceof Error?i.message:String(i))}}async function s(r,e){const t=await y(r,`https://api.bilibili.com/x/relation?fid=${e}`);u(t,"relation query");const i=t?.data?.attribute;if(typeof i!=="number")throw new l("Bilibili relation query returned a malformed attribute");return i}async function f(r,e,t,i){const o=Date.now()+g;let n;while(Date.now()<=o){n=await s(r,e);if(t(n))return n;if(typeof r.wait!=="function")break;await r.wait({time:R/1000})}throw new l(`Bilibili relation modify did not verify ${i}; last attribute=${n}`)}d({site:"bilibili",name:"unfollow",access:"write",description:"取消关注 B站用户(官方 API,需登录)",domain:"www.bilibili.com",strategy:b.COOKIE,args:[{name:"target",required:!0,positional:!0,help:"目标 UID / 用户名 / space.bilibili.com 链接"}],columns:["mid","name","status","url"],func:async(r,e)=>{if(!r)throw new l("Browser session required for bilibili unfollow");const t=await m(r,e.target),i=await E(r);if(t===i)throw new a("Cannot unfollow yourself");const o=await s(r,t),n=`https://space.bilibili.com/${t}`;if(o!==2&&o!==6)return[{mid:t,name:"",status:"not-following",url:n}];const w=await h(r,"/x/relation/modify",{params:{fid:t,act:2,re_src:11}});u(w,"relation modify");await f(r,t,(c)=>c!==2&&c!==6,"not following");return[{mid:t,name:"",status:"unfollowed",url:n}]}});export const __test__={resolveTargetMid:m,fetchRelationAttribute:s,waitForRelation:f};
|
package/clis/bilibili/upload.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import*as I from"node:fs";import*as P from"node:path";import{cli as E,Strategy as b}from"@jackwener/opencli/registry";import{ArgumentError as D,AuthRequiredError as h,CommandExecutionError as L}from"@jackwener/opencli/errors";import{resolveVideoFile as l,resolveImageFile as u,videoTimeoutArg as w}from"../_shared/video-publish.js";import{setInputFiles as k}from"../_shared/file-inject.js";const U={bda2:{os:"upos",upcdn:"bda2",probe_version:20221109},bldsa:{os:"upos",upcdn:"bldsa",probe_version:20221109},qn:{os:"upos",upcdn:"qn",probe_version:20221109},ws:{os:"upos",upcdn:"ws",probe_version:20221109}},f="bda2",m=["SESSDATA","bili_jct","DedeUserID"],n="https://member.bilibili.com/platform/home",x="__pp_bili_video_input";function d(W){var J=document.getElementById(W.inputId);if(!J||!J.files||!J.files[0])return{error:"文件未就绪(input 为空)"};var Z=J.files[0],Y=Z.size,$=W.line;return async function(){try{var G=new URLSearchParams({profile:"ugcfx/bup",name:Z.name,size:String(Y),r:$.os,ssl:"0",version:"2.14.0",build:"2100400",upcdn:$.upcdn,probe_version:String($.probe_version)}),X=await(await fetch("https://member.bilibili.com/preupload?"+G.toString(),{credentials:"include",headers:{Referer:"https://www.bilibili.com"}})).json();if(X.OK!==1)return{error:"preupload 失败:"+JSON.stringify(X)};var K="https:"+X.endpoint+"/"+String(X.upos_uri).replace(/^upos:\/\//,""),O=new URLSearchParams({uploads:"",output:"json",profile:"ugcfx/bup",filesize:String(Y),partsize:String(X.chunk_size),biz_id:String(X.biz_id)}),H=await(await fetch(K+"?"+O.toString(),{method:"POST",headers:{"x-upos-auth":X.auth}})).json();if(H.OK!==1)return{error:"获取 upload_id 失败:"+JSON.stringify(H)};var T=Math.max(1,Math.ceil(Y/X.chunk_size));return{url:K,auth:X.auth,uploadId:H.upload_id,chunkSize:X.chunk_size,bizId:X.biz_id,size:Y,name:Z.name,total:T}}catch(R){return{error:"preupload 异常:"+String(R&&R.message||R)}}}()}function c(W){var J=document.getElementById(W.inputId);if(!J||!J.files||!J.files[0])return{ok:!1,error:"文件丢失(页面可能已导航)"};var Z=J.files[0],Y=W.idx*W.chunkSize,$=Z.slice(Y,Math.min(Y+W.chunkSize,W.size)),G=$.size,X=new URLSearchParams({partNumber:String(W.idx+1),uploadId:String(W.uploadId),chunk:String(W.idx),chunks:String(W.total),size:String(G),start:String(Y),end:String(Y+G),total:String(W.size)});return async function(){for(var K=0;K<5;K++){try{var O=await fetch(W.url+"?"+X.toString(),{method:"PUT",headers:{"x-upos-auth":W.auth},body:$});if(O.status<400){var H=await O.text();if(H==="MULTIPART_PUT_SUCCESS"||H==="")return{ok:!0}}}catch(T){}await new Promise(function(T){setTimeout(T,800*(K+1))})}return{ok:!1,error:"分块 "+W.idx+" 多次重试仍失败"}}()}function j(W){var J=[];for(var Z=1;Z<=W.total;Z++)J.push({partNumber:Z,eTag:"etag"});var Y=new URLSearchParams({output:"json",name:W.name,profile:"ugcfx/bup",uploadId:String(W.uploadId),biz_id:String(W.bizId)});return async function(){try{var $=await(await fetch(W.url+"?"+Y.toString(),{method:"POST",headers:{"x-upos-auth":W.auth,"content-type":"application/json; charset=UTF-8"},body:JSON.stringify({parts:J})})).json();if($.OK!==1)return{error:"complete 失败:"+JSON.stringify($)};var G=String($.key).replace(/^\//,"").replace(/\.[^.]+$/,"");return{filename:G,cid:W.bizId}}catch(X){return{error:"complete 异常:"+String(X&&X.message||X)}}}()}function o(W){return async function(){try{var J=await fetch("https://member.bilibili.com/x/vupre/web/topic/type?type_id="+encodeURIComponent(W.tid)+"&pn=0&ps=200",{credentials:"include"}),Z=await J.json();if(!Z||Z.code!==0||!Z.data||!Array.isArray(Z.data.topics))return{error:"获取话题列表失败:"+(Z&&Z.message||"code="+(Z&&Z.code))};var Y=null;for(var $=0;$<Z.data.topics.length;$++)if(Number(Z.data.topics[$].topic_id)===Number(W.topicId)){Y=Z.data.topics[$];break}if(!Y)return{error:"topic_id "+W.topicId+" 不在分区 "+W.tid+" 的可用话题里(用 bilibili topics --tid "+W.tid+" 查合法值)"};return{topicId:Number(Y.topic_id),missionId:Y.mission_id!=null?Number(Y.mission_id):null,name:Y.topic_name||""}}catch(G){return{error:"解析话题异常:"+String(G&&G.message||G)}}}()}function p(W){return async function(){var J=document.cookie.match(/(?:^|;\s*)bili_jct=([^;]+)/);if(!J)return{error:"未找到 bili_jct CSRF token"};var Z=decodeURIComponent(J[1]);try{var Y=W.dataUri;if(typeof Y==="string"&&Y.indexOf("data:image/webp")===0){var $=Y.indexOf(",");if($===-1)return{error:"封面 data URI 格式非法"};var G=Y.slice(5,$),X=Y.slice($+1),K;if(G.indexOf("base64")!==-1){var O=atob(X);K=new Uint8Array(O.length);for(var H=0;H<O.length;H++)K[H]=O.charCodeAt(H)}else K=new TextEncoder().encode(decodeURIComponent(X));var T=new Blob([K],{type:"image/webp"}),R=await createImageBitmap(T),S=document.createElement("canvas");S.width=R.width;S.height=R.height;var Q=S.getContext("2d");Q.fillStyle="#ffffff";Q.fillRect(0,0,S.width,S.height);Q.drawImage(R,0,0);var q=await new Promise(function(F){S.toBlob(F,"image/jpeg",0.92)});if(!q)return{error:"封面 webp 转码 JPEG 失败"};Y=await new Promise(function(F,_){var C=new FileReader;C.onload=function(){F(String(C.result))};C.onerror=function(){_(Error("FileReader 读取转码结果失败"))};C.readAsDataURL(q)})}var B=new URLSearchParams;B.append("cover",Y);B.append("csrf",Z);var V=await(await fetch("https://member.bilibili.com/x/vu/web/cover/up",{method:"POST",credentials:"include",headers:{"Content-Type":"application/x-www-form-urlencoded"},body:B.toString()})).json();if(!V||V.code!==0||!V.data||!V.data.url)return{error:"封面上传失败:"+(V&&V.message?V.message:JSON.stringify(V))};return{url:V.data.url}}catch(F){return{error:"封面上传异常:"+String(F&&F.message||F)}}}()}function g(W){return async function(){var J=document.cookie.match(/(?:^|;\s*)bili_jct=([^;]+)/);if(!J)return{error:"未找到 bili_jct CSRF token"};var Z=decodeURIComponent(J[1]),Y=W.meta;for(var $ in Y)if(Y[$]===null||Y[$]===void 0)delete Y[$];Y.csrf=Z;try{var G=await fetch("https://member.bilibili.com/x/vu/web/add/v3?csrf="+encodeURIComponent(Z)+"&t="+Date.now(),{method:"POST",credentials:"include",headers:{"Content-Type":"application/json;charset=UTF-8"},body:JSON.stringify(Y)}),X=await G.json();if(!X||X.code!==0)return{error:"add/v3 提交失败:"+(X&&X.message?X.message:"")+"(code="+(X&&X.code)+" status="+G.status+")"};return{bvid:X.data&&X.data.bvid,aid:X.data&&X.data.aid}}catch(K){return{error:"add/v3 异常:"+String(K&&K.message||K)}}}()}function s(W){return async function(){var J=document.cookie.match(/(?:^|;\s*)bili_jct=([^;]+)/);if(!J)return{error:"未找到 bili_jct CSRF token"};var Z=decodeURIComponent(J[1]),Y=W.body;Y.csrf=Z;try{var $=await fetch("https://member.bilibili.com/x/vupre/web/draft/add?t="+Date.now()+"&csrf="+encodeURIComponent(Z),{method:"POST",credentials:"include",headers:{"Content-Type":"application/json;charset=UTF-8"},body:JSON.stringify(Y)}),G=await $.json();if(!G||G.code!==0)return{error:"draft/add 保存草稿失败:"+(G&&G.message?G.message:"")+"(code="+(G&&G.code)+" status="+$.status+")"};return{data:G.data}}catch(X){return{error:"draft/add 异常:"+String(X&&X.message||X)}}}()}const N=(W,J,Z)=>W.evaluateWithArgs(`(${J.toString()})(a)`,{a:Z});function t(W){const J=u(W),Z=P.extname(J).toLowerCase(),Y=Z===".png"?"image/png":Z===".webp"?"image/webp":Z===".bmp"?"image/bmp":"image/jpeg",$=I.readFileSync(J).toString("base64");return`data:${Y};base64,${$}`}async function i(W){for(let J=0;J<8;J++){await W.goto(n);await W.wait({time:1});let Z="";try{Z=String(await W.evaluate("location.href")||"")}catch{Z=""}if(/^https?:\/\/member\.bilibili\.com\//.test(Z)){const Y=await W.getCookies({url:"https://member.bilibili.com"}),$=new Map;for(const X of Array.isArray(Y)?Y:[])if(X&&typeof X.name==="string")$.set(X.name,String(X.value??""));const G=m.filter((X)=>!$.get(X));if(!G.length)return $;throw new h("member.bilibili.com",`缺少 B站登录 cookie(${G.join(", ")})。请先在客户端登录哔哩哔哩。`)}}throw new h("member.bilibili.com","无法进入 B站创作中心(可能未登录或被风控)。请先在客户端登录哔哩哔哩。")}E({site:"bilibili",name:"upload",access:"write",description:"投稿视频到 B站(在真实浏览器登录态里走 web 投稿:preupload→upos 分块→add/v3)。默认仅 dry-run 校验,加 --execute 才真正上传并提交。",domain:"member.bilibili.com",strategy:b.COOKIE,browser:!0,args:[{name:"file",required:!0,positional:!0,help:"视频文件路径"},{name:"title",help:"稿件标题(默认取文件名)"},{name:"tid",type:"number",required:!0,help:"分区 id(B站 typeid,必填,禁止臆造)。合法值用 `bilibili partitions` 列举后取。"},{name:"tag",required:!0,help:"标签,逗号分隔(B站要求至少 1 个)"},{name:"desc",fromFile:"desc-file",help:"简介"},{name:"topic",type:"number",help:"参与话题的 topic_id(重要流量入口)。合法值用 `bilibili topics --tid <tid>` 列举,禁止臆造;mission_id 自动匹配。"},{name:"cover",help:"封面图片路径(不传由 B站自动截取)"},{name:"copyright",type:"number",help:"1=自制 2=转载(默认 1)"},{name:"source",help:"转载来源 URL(copyright=2 时必填)"},{name:"dynamic",help:"同步发布的动态文案(可空)"},{name:"no-reprint",type:"boolean",help:"禁止转载(默认允许)"},{name:"dtime",type:"number",help:"定时发布的 10 位 unix 时间戳(可空=立即)"},{name:"line",help:`上传线路:${Object.keys(U).join("/")}(默认 ${f})`},{name:"concurrency",type:"number",help:"分块并发数(默认 3)"},{name:"draft",type:"boolean",help:"存草稿而非直接发布(上传视频后存到创作中心草稿箱,不公开)"},{name:"execute",type:"boolean",help:"真正发布投稿;不带(也不带 --draft)则只做 dry-run 校验"},w()],columns:["status","title","bvid","url"],func:async(W,J)=>{if(!W)throw new L("bilibili upload 需要浏览器会话");const Z=l(String(J.file??"")),Y=String(J.title??"").trim()||P.basename(Z).replace(/\.[^.]+$/,""),$=String(J.tag??"").split(",").map((z)=>z.trim()).filter(Boolean);if(!$.length)throw new D("B站投稿至少需要 1 个标签,用 --tag 传(逗号分隔)");if(J.tid==null||J.tid===""||!Number.isFinite(Number(J.tid)))throw new D("必须用 --tid 指定分区 id(数字)。合法值用 `bilibili partitions` 列举,禁止臆造。");const G=Number(J.tid),X=J.copyright!=null&&J.copyright!==""?Number(J.copyright):1;if(X!==1&&X!==2)throw new D("--copyright 只能是 1(自制) 或 2(转载)");const K=String(J.source??"").trim();if(X===2&&!K)throw new D("转载(copyright=2)必须用 --source 提供转载来源");if(J.cover)u(String(J.cover));const O=String(J.line??f),H=U[O];if(!H)throw new D(`未知上传线路「${O}」,可选:${Object.keys(U).join("/")}`);const T=J.concurrency!=null&&J.concurrency!==""?Number(J.concurrency):3,R=Boolean(J.draft),S=Boolean(J.execute)&&!R;await i(W);await W.evaluate(`(() => { var id=${JSON.stringify(x)}; var el=document.getElementById(id); if(!el){ el=document.createElement('input'); el.type='file'; el.id=id; el.style.cssText='position:fixed;left:-9999px;top:0;'; document.body.appendChild(el);} el.value=''; return true; })()`);await k(W,`#${x}`,[Z]);if(!R&&!S)return{status:"dry-run",title:Y,bvid:"",url:`校验通过:登录态有效、视频已注入就绪、分区 ${G}、标签 [${$.join(", ")}]、版权 ${X===1?"自制":"转载"}。加 --execute 发布,或 --draft 存草稿。`};const Q=await N(W,d,{inputId:x,line:H});if(!Q||Q.error)throw new L(`B站 preupload 失败:${Q&&Q.error||"无返回"}`);for(let z=0;z<Q.total;z++){const M=await N(W,c,{inputId:x,url:Q.url,auth:Q.auth,uploadId:Q.uploadId,idx:z,total:Q.total,size:Q.size,chunkSize:Q.chunkSize});if(!M||!M.ok)throw new L(`B站分块上传失败(${z+1}/${Q.total}):${M&&M.error||"无返回"}`)}const q=await N(W,j,{url:Q.url,auth:Q.auth,uploadId:Q.uploadId,bizId:Q.bizId,name:Q.name,total:Q.total});if(!q||q.error||!q.filename)throw new L(`B站 complete 失败:${q&&q.error||"未拿到 filename"}`);let B="";if(J.cover){const z=t(String(J.cover)),M=await N(W,p,{dataUri:z});if(!M||M.error||!M.url)throw new L(`B站封面上传失败:${M&&M.error||"未拿到 url"}`);B=M.url}let V=null,F=null;if(J.topic!=null&&J.topic!==""){if(!Number.isFinite(Number(J.topic)))throw new D("--topic 必须是 topic_id 数字,用 `bilibili topics --tid <tid>` 取合法值");const z=await N(W,o,{tid:G,topicId:Number(J.topic)});if(!z||z.error)throw new L(`B站话题解析失败:${z&&z.error||"无返回"}`);V=z.topicId;F=z.missionId}if(R){const z={videos:[{filename:q.filename,title:Y,desc:"",cid:q.cid,is_4k:!1,is_8k:!1,is_hdr:!1}],cover:B,cover43:B,ai_cover:0,is_ab_cover:0,ab_cover_info:null,title:Y,copyright:X,tid:G,tag:$.join(","),desc:String(J.desc??""),recreate:-1,dynamic:String(J.dynamic??""),is_only_self:0,space_hidden:2,watermark:{state:0},no_reprint:J["no-reprint"]?1:0,subtitle:{open:0,lan:""},dolby:0,lossless_music:0,up_selection_reply:!1,up_close_reply:!1,up_close_danmu:!1};if(X===2)z.source=K;if(V!=null){z.topic_id=V;z.topic_detail={from_topic_id:V,from_source:"arc.web.search"};if(F!=null)z.mission_id=F}const M=await N(W,s,{body:z});if(!M||M.error)throw new L(`B站 ${M&&M.error||"draft/add 无返回"}`);const y=M.data&&(M.data.aid!=null?M.data.aid:M.data.draft_id!=null?M.data.draft_id:M.data.id);return{status:"✅ 草稿已保存",title:Y,bvid:y!=null?`draft:${y}`:"",url:"https://member.bilibili.com/platform/upload-manager/article?group=draft"}}const _=J.dtime!=null&&J.dtime!==""?Number(J.dtime):null,C={title:Y,copyright:X,tid:G,tag:$.join(","),mission_id:F,topic_id:V,topic_detail:V!=null?{from_topic_id:V,from_source:"arc.web.recommend"}:null,desc_format_id:9999,desc:String(J.desc??""),dtime:_,recreate:-1,dynamic:String(J.dynamic??""),interactive:0,act_reserve_create:0,no_disturbance:0,porder:null,adorder_type:9,no_reprint:J["no-reprint"]?1:0,subtitle:{open:0,lan:""},neutral_mark:null,dolby:0,lossless_music:0,up_selection_reply:!1,up_close_reply:!1,up_close_danmu:!1,web_os:1,source:X===2?K:null,watermark:{state:0},cover:B,videos:[{title:Y,desc:"",filename:q.filename,cid:q.cid}]},A=await N(W,g,{meta:C});if(!A||A.error)throw new L(`B站 ${A&&A.error||"add/v3 无返回"}`);const v=A.bvid?String(A.bvid):"";return{status:J.dtime?"✅ 定时投稿已提交":"✅ 投稿成功",title:Y,bvid:v,url:v?`https://www.bilibili.com/video/${v}`:"(已提交,稍后在创作中心查看)"}}});
|
|
1
|
+
import*as B from"node:fs";import*as z from"node:path";import{cli as A,Strategy as F}from"@jackwener/opencli/registry";import{ArgumentError as P,AuthRequiredError as T,CommandExecutionError as y}from"@jackwener/opencli/errors";import{resolveVideoFile as L,resolveImageFile as N,videoTimeoutArg as D}from"../_shared/video-publish.js";import{setInputFiles as J}from"../_shared/file-inject.js";const R={bda2:{os:"upos",upcdn:"bda2",probe_version:20221109},bldsa:{os:"upos",upcdn:"bldsa",probe_version:20221109},qn:{os:"upos",upcdn:"qn",probe_version:20221109},ws:{os:"upos",upcdn:"ws",probe_version:20221109}},C="bda2",M=["SESSDATA","bili_jct","DedeUserID"],q="https://member.bilibili.com/platform/home",O="__pp_bili_video_input";function K(t){var e=document.getElementById(t.inputId);if(!e||!e.files||!e.files[0])return{error:"文件未就绪(input 为空)"};var n=e.files[0],r=n.size,o=t.line;return async function(){try{var a=new URLSearchParams({profile:"ugcfx/bup",name:n.name,size:String(r),r:o.os,ssl:"0",version:"2.14.0",build:"2100400",upcdn:o.upcdn,probe_version:String(o.probe_version)}),i=await(await fetch("https://member.bilibili.com/preupload?"+a.toString(),{credentials:"include",headers:{Referer:"https://www.bilibili.com"}})).json();if(i.OK!==1)return{error:"preupload 失败:"+JSON.stringify(i)};var s="https:"+i.endpoint+"/"+String(i.upos_uri).replace(/^upos:\/\//,""),b=new URLSearchParams({uploads:"",output:"json",profile:"ugcfx/bup",filesize:String(r),partsize:String(i.chunk_size),biz_id:String(i.biz_id)}),m=await(await fetch(s+"?"+b.toString(),{method:"POST",headers:{"x-upos-auth":i.auth}})).json();if(m.OK!==1)return{error:"获取 upload_id 失败:"+JSON.stringify(m)};var S=Math.max(1,Math.ceil(r/i.chunk_size));return{url:s,auth:i.auth,uploadId:m.upload_id,chunkSize:i.chunk_size,bizId:i.biz_id,size:r,name:n.name,total:S}}catch(h){return{error:"preupload 异常:"+String(h&&h.message||h)}}}()}function V(t){var e=document.getElementById(t.inputId);if(!e||!e.files||!e.files[0])return{ok:!1,error:"文件丢失(页面可能已导航)"};var n=e.files[0],r=t.idx*t.chunkSize,o=n.slice(r,Math.min(r+t.chunkSize,t.size)),a=o.size,i=new URLSearchParams({partNumber:String(t.idx+1),uploadId:String(t.uploadId),chunk:String(t.idx),chunks:String(t.total),size:String(a),start:String(r),end:String(r+a),total:String(t.size)});return async function(){for(var s=0;s<5;s++){try{var b=await fetch(t.url+"?"+i.toString(),{method:"PUT",headers:{"x-upos-auth":t.auth},body:o});if(b.status<400){var m=await b.text();if(m==="MULTIPART_PUT_SUCCESS"||m==="")return{ok:!0}}}catch(S){}await new Promise(function(S){setTimeout(S,800*(s+1))})}return{ok:!1,error:"分块 "+t.idx+" 多次重试仍失败"}}()}function G(t){var e=[];for(var n=1;n<=t.total;n++)e.push({partNumber:n,eTag:"etag"});var r=new URLSearchParams({output:"json",name:t.name,profile:"ugcfx/bup",uploadId:String(t.uploadId),biz_id:String(t.bizId)});return async function(){try{var o=await(await fetch(t.url+"?"+r.toString(),{method:"POST",headers:{"x-upos-auth":t.auth,"content-type":"application/json; charset=UTF-8"},body:JSON.stringify({parts:e})})).json();if(o.OK!==1)return{error:"complete 失败:"+JSON.stringify(o)};var a=String(o.key).replace(/^\//,"").replace(/\.[^.]+$/,"");return{filename:a,cid:t.bizId}}catch(i){return{error:"complete 异常:"+String(i&&i.message||i)}}}()}function H(t){return async function(){try{var e=await fetch("https://member.bilibili.com/x/vupre/web/topic/type?type_id="+encodeURIComponent(t.tid)+"&pn=0&ps=200",{credentials:"include"}),n=await e.json();if(!n||n.code!==0||!n.data||!Array.isArray(n.data.topics))return{error:"获取话题列表失败:"+(n&&n.message||"code="+(n&&n.code))};var r=null;for(var o=0;o<n.data.topics.length;o++)if(Number(n.data.topics[o].topic_id)===Number(t.topicId)){r=n.data.topics[o];break}if(!r)return{error:"topic_id "+t.topicId+" 不在分区 "+t.tid+" 的可用话题里(用 bilibili topics --tid "+t.tid+" 查合法值)"};return{topicId:Number(r.topic_id),missionId:r.mission_id!=null?Number(r.mission_id):null,name:r.topic_name||""}}catch(a){return{error:"解析话题异常:"+String(a&&a.message||a)}}}()}function Q(t){return async function(){var e=document.cookie.match(/(?:^|;\s*)bili_jct=([^;]+)/);if(!e)return{error:"未找到 bili_jct CSRF token"};var n=decodeURIComponent(e[1]);try{var r=t.dataUri;if(typeof r==="string"&&r.indexOf("data:image/webp")===0){var o=r.indexOf(",");if(o===-1)return{error:"封面 data URI 格式非法"};var a=r.slice(5,o),i=r.slice(o+1),s;if(a.indexOf("base64")!==-1){var b=atob(i);s=new Uint8Array(b.length);for(var m=0;m<b.length;m++)s[m]=b.charCodeAt(m)}else s=new TextEncoder().encode(decodeURIComponent(i));var S=new Blob([s],{type:"image/webp"}),h=await createImageBitmap(S),v=document.createElement("canvas");v.width=h.width;v.height=h.height;var c=v.getContext("2d");c.fillStyle="#ffffff";c.fillRect(0,0,v.width,v.height);c.drawImage(h,0,0);var p=await new Promise(function(f){v.toBlob(f,"image/jpeg",0.92)});if(!p)return{error:"封面 webp 转码 JPEG 失败"};r=await new Promise(function(f,x){var w=new FileReader;w.onload=function(){f(String(w.result))};w.onerror=function(){x(Error("FileReader 读取转码结果失败"))};w.readAsDataURL(p)})}var _=new URLSearchParams;_.append("cover",r);_.append("csrf",n);var u=await(await fetch("https://member.bilibili.com/x/vu/web/cover/up",{method:"POST",credentials:"include",headers:{"Content-Type":"application/x-www-form-urlencoded"},body:_.toString()})).json();if(!u||u.code!==0||!u.data||!u.data.url)return{error:"封面上传失败:"+(u&&u.message?u.message:JSON.stringify(u))};return{url:u.data.url}}catch(f){return{error:"封面上传异常:"+String(f&&f.message||f)}}}()}function W(t){return async function(){var e=document.cookie.match(/(?:^|;\s*)bili_jct=([^;]+)/);if(!e)return{error:"未找到 bili_jct CSRF token"};var n=decodeURIComponent(e[1]),r=t.meta;for(var o in r)if(r[o]===null||r[o]===void 0)delete r[o];r.csrf=n;try{var a=await fetch("https://member.bilibili.com/x/vu/web/add/v3?csrf="+encodeURIComponent(n)+"&t="+Date.now(),{method:"POST",credentials:"include",headers:{"Content-Type":"application/json;charset=UTF-8"},body:JSON.stringify(r)}),i=await a.json();if(!i||i.code!==0)return{error:"add/v3 提交失败:"+(i&&i.message?i.message:"")+"(code="+(i&&i.code)+" status="+a.status+")"};return{bvid:i.data&&i.data.bvid,aid:i.data&&i.data.aid}}catch(s){return{error:"add/v3 异常:"+String(s&&s.message||s)}}}()}function X(t){return async function(){var e=document.cookie.match(/(?:^|;\s*)bili_jct=([^;]+)/);if(!e)return{error:"未找到 bili_jct CSRF token"};var n=decodeURIComponent(e[1]),r=t.body;r.csrf=n;try{var o=await fetch("https://member.bilibili.com/x/vupre/web/draft/add?t="+Date.now()+"&csrf="+encodeURIComponent(n),{method:"POST",credentials:"include",headers:{"Content-Type":"application/json;charset=UTF-8"},body:JSON.stringify(r)}),a=await o.json();if(!a||a.code!==0)return{error:"draft/add 保存草稿失败:"+(a&&a.message?a.message:"")+"(code="+(a&&a.code)+" status="+o.status+")"};return{data:a.data}}catch(i){return{error:"draft/add 异常:"+String(i&&i.message||i)}}}()}const g=(t,e,n)=>t.evaluateWithArgs(`(${e.toString()})(a)`,{a:n});function Y(t){const e=N(t),n=z.extname(e).toLowerCase(),r=n===".png"?"image/png":n===".webp"?"image/webp":n===".bmp"?"image/bmp":"image/jpeg",o=B.readFileSync(e).toString("base64");return`data:${r};base64,${o}`}async function Z(t){for(let e=0;e<8;e++){await t.goto(q);await t.wait({time:1});let n="";try{n=String(await t.evaluate("location.href")||"")}catch{n=""}if(/^https?:\/\/member\.bilibili\.com\//.test(n)){const r=await t.getCookies({url:"https://member.bilibili.com"}),o=new Map;for(const i of Array.isArray(r)?r:[])if(i&&typeof i.name==="string")o.set(i.name,String(i.value??""));const a=M.filter((i)=>!o.get(i));if(!a.length)return o;throw new T("member.bilibili.com",`缺少 B站登录 cookie(${a.join(", ")})。请先在客户端登录哔哩哔哩。`)}}throw new T("member.bilibili.com","无法进入 B站创作中心(可能未登录或被风控)。请先在客户端登录哔哩哔哩。")}A({site:"bilibili",name:"upload",access:"write",description:"投稿视频到 B站(在真实浏览器登录态里走 web 投稿:preupload→upos 分块→add/v3)。默认仅 dry-run 校验,加 --execute 才真正上传并提交。",domain:"member.bilibili.com",strategy:F.COOKIE,browser:!0,args:[{name:"file",required:!0,positional:!0,help:"视频文件路径"},{name:"title",help:"稿件标题(默认取文件名)"},{name:"tid",type:"number",required:!0,help:"分区 id(B站 typeid,必填,禁止臆造)。合法值用 `bilibili partitions` 列举后取。"},{name:"tag",required:!0,help:"标签,逗号分隔(B站要求至少 1 个)"},{name:"desc",fromFile:"desc-file",help:"简介"},{name:"topic",type:"number",help:"参与话题的 topic_id(重要流量入口)。合法值用 `bilibili topics --tid <tid>` 列举,禁止臆造;mission_id 自动匹配。"},{name:"cover",help:"封面图片路径(不传由 B站自动截取)"},{name:"copyright",type:"number",help:"1=自制 2=转载(默认 1)"},{name:"source",help:"转载来源 URL(copyright=2 时必填)"},{name:"dynamic",help:"同步发布的动态文案(可空)"},{name:"no-reprint",type:"boolean",help:"禁止转载(默认允许)"},{name:"dtime",type:"number",help:"定时发布的 10 位 unix 时间戳(可空=立即)"},{name:"line",help:`上传线路:${Object.keys(R).join("/")}(默认 ${C})`},{name:"concurrency",type:"number",help:"分块并发数(默认 3)"},{name:"draft",type:"boolean",help:"存草稿而非直接发布(上传视频后存到创作中心草稿箱,不公开)"},{name:"execute",type:"boolean",help:"真正发布投稿;不带(也不带 --draft)则只做 dry-run 校验"},D()],columns:["status","title","bvid","url"],func:async(t,e)=>{if(!t)throw new y("bilibili upload 需要浏览器会话");const n=L(String(e.file??"")),r=String(e.title??"").trim()||z.basename(n).replace(/\.[^.]+$/,""),o=String(e.tag??"").split(",").map((d)=>d.trim()).filter(Boolean);if(!o.length)throw new P("B站投稿至少需要 1 个标签,用 --tag 传(逗号分隔)");if(e.tid==null||e.tid===""||!Number.isFinite(Number(e.tid)))throw new P("必须用 --tid 指定分区 id(数字)。合法值用 `bilibili partitions` 列举,禁止臆造。");const a=Number(e.tid),i=e.copyright!=null&&e.copyright!==""?Number(e.copyright):1;if(i!==1&&i!==2)throw new P("--copyright 只能是 1(自制) 或 2(转载)");const s=String(e.source??"").trim();if(i===2&&!s)throw new P("转载(copyright=2)必须用 --source 提供转载来源");if(e.cover)N(String(e.cover));const b=String(e.line??C),m=R[b];if(!m)throw new P(`未知上传线路「${b}」,可选:${Object.keys(R).join("/")}`);const S=e.concurrency!=null&&e.concurrency!==""?Number(e.concurrency):3,h=Boolean(e.draft),v=Boolean(e.execute)&&!h;await Z(t);await t.evaluate(`(() => { var id=${JSON.stringify(O)}; var el=document.getElementById(id); if(!el){ el=document.createElement('input'); el.type='file'; el.id=id; el.style.cssText='position:fixed;left:-9999px;top:0;'; document.body.appendChild(el);} el.value=''; return true; })()`);await J(t,`#${O}`,[n]);if(!h&&!v)return{status:"dry-run",title:r,bvid:"",url:`校验通过:登录态有效、视频已注入就绪、分区 ${a}、标签 [${o.join(", ")}]、版权 ${i===1?"自制":"转载"}。加 --execute 发布,或 --draft 存草稿。`};const c=await g(t,K,{inputId:O,line:m});if(!c||c.error)throw new y(`B站 preupload 失败:${c&&c.error||"无返回"}`);for(let d=0;d<c.total;d++){const l=await g(t,V,{inputId:O,url:c.url,auth:c.auth,uploadId:c.uploadId,idx:d,total:c.total,size:c.size,chunkSize:c.chunkSize});if(!l||!l.ok)throw new y(`B站分块上传失败(${d+1}/${c.total}):${l&&l.error||"无返回"}`)}const p=await g(t,G,{url:c.url,auth:c.auth,uploadId:c.uploadId,bizId:c.bizId,name:c.name,total:c.total});if(!p||p.error||!p.filename)throw new y(`B站 complete 失败:${p&&p.error||"未拿到 filename"}`);let _="";if(e.cover){const d=Y(String(e.cover)),l=await g(t,Q,{dataUri:d});if(!l||l.error||!l.url)throw new y(`B站封面上传失败:${l&&l.error||"未拿到 url"}`);_=l.url}let u=null,f=null;if(e.topic!=null&&e.topic!==""){if(!Number.isFinite(Number(e.topic)))throw new P("--topic 必须是 topic_id 数字,用 `bilibili topics --tid <tid>` 取合法值");const d=await g(t,H,{tid:a,topicId:Number(e.topic)});if(!d||d.error)throw new y(`B站话题解析失败:${d&&d.error||"无返回"}`);u=d.topicId;f=d.missionId}if(h){const d={videos:[{filename:p.filename,title:r,desc:"",cid:p.cid,is_4k:!1,is_8k:!1,is_hdr:!1}],cover:_,cover43:_,ai_cover:0,is_ab_cover:0,ab_cover_info:null,title:r,copyright:i,tid:a,tag:o.join(","),desc:String(e.desc??""),recreate:-1,dynamic:String(e.dynamic??""),is_only_self:0,space_hidden:2,watermark:{state:0},no_reprint:e["no-reprint"]?1:0,subtitle:{open:0,lan:""},dolby:0,lossless_music:0,up_selection_reply:!1,up_close_reply:!1,up_close_danmu:!1};if(i===2)d.source=s;if(u!=null){d.topic_id=u;d.topic_detail={from_topic_id:u,from_source:"arc.web.search"};if(f!=null)d.mission_id=f}const l=await g(t,X,{body:d});if(!l||l.error)throw new y(`B站 ${l&&l.error||"draft/add 无返回"}`);const U=l.data&&(l.data.aid!=null?l.data.aid:l.data.draft_id!=null?l.data.draft_id:l.data.id);return{status:"✅ 草稿已保存",title:r,bvid:U!=null?`draft:${U}`:"",url:"https://member.bilibili.com/platform/upload-manager/article?group=draft"}}const x=e.dtime!=null&&e.dtime!==""?Number(e.dtime):null,w={title:r,copyright:i,tid:a,tag:o.join(","),mission_id:f,topic_id:u,topic_detail:u!=null?{from_topic_id:u,from_source:"arc.web.recommend"}:null,desc_format_id:9999,desc:String(e.desc??""),dtime:x,recreate:-1,dynamic:String(e.dynamic??""),interactive:0,act_reserve_create:0,no_disturbance:0,porder:null,adorder_type:9,no_reprint:e["no-reprint"]?1:0,subtitle:{open:0,lan:""},neutral_mark:null,dolby:0,lossless_music:0,up_selection_reply:!1,up_close_reply:!1,up_close_danmu:!1,web_os:1,source:i===2?s:null,watermark:{state:0},cover:_,videos:[{title:r,desc:"",filename:p.filename,cid:p.cid}]},I=await g(t,W,{meta:w});if(!I||I.error)throw new y(`B站 ${I&&I.error||"add/v3 无返回"}`);const E=I.bvid?String(I.bvid):"";return{status:e.dtime?"✅ 定时投稿已提交":"✅ 投稿成功",title:r,bvid:E,url:E?`https://www.bilibili.com/video/${E}`:"(已提交,稍后在创作中心查看)"}}});
|