pixiv-cli

module
v0.1.0 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Jul 12, 2026 License: MIT

README

Pixiv CLI / MCP Server

Go 版 Pixiv 工具集:默认作为 pixiv CLI 使用,需要 MCP 时显式运行 pixiv mcp

它优先复用 Pixiv App API,支持搜索、详情、排行、推荐、下载、多账号 refresh token 管理,以及 MCP stdio server。未配置 refresh token 时,默认对搜索、详情、排行、用户搜索和下载启用匿名 Pixiv web/ajax API fallback。

源码按 CLI controller、application services、bootstrap、config、Pixiv facade/source、download、MCP server 分包;账号存储在 internal/storage/auth,基础工具按 internal/utils/* 子包组织,基础设施常量限制在 internal/common/constants。Pixiv App API、web fallback 与共享模型分别收在 internal/pixiv/apiinternal/pixiv/webinternal/pixiv/model

用户可感知变化记录在 CHANGELOG.md

安装与构建

发布状态:受支持 binary 的 Ed25519 公钥、key ID 与 fingerprint 已提交到 internal/bootstrap/release_trust.go;公开 source/tap repositories、 受保护 release Environment 与隔离 credentials 已配置。当前仍没有正式 GitHub Release、tap formula 或安装验收。下面标注“发布后”的渠道是目标安装方式,不代表现在已经可以安装或自更新;在发布门禁 完成前,请不要把它们当作可用下载来源。

从源码构建
sh scripts/build.sh

受支持的源码构建需要 Go 1.26.3CGO_ENABLED=1、目标平台可用的 C linker,以及与 目标匹配的 Rust ugoira staticlib。它会输出 build/pixivbuild/pixiv.exe。Windows 可通过 Git Bash、MSYS2 或 WSL 运行构建命令。

当前工作树已保存 darwin/linux/windows × amd64/arm64 的六个 runner-verified staticlib 与同源 manifest.jsonscripts/build.sh 会先校验 source digest、target/path 与每个库的 SHA-256,再构建 本机 binary。完整要求、证据回填流程和失败含义见开发流程

Go 安装(发布后)

正式 tag 发布后,使用精确 tag 安装:

go install github.com/FlanChanXwO/pixiv-cli/cmd/pixiv@vX.Y.Z

它仍使用本机 Go、cgo、C linker 和该 target 的 committed staticlib。六目标库与 manifest 已完整, 但正式 tag 尚未发布,因此当前仍没有受支持的 exact-tag go install 安装入口。

Homebrew(发布后)

正式 stable Release 和真实 tap 均通过 audit/安装验证后,macOS/Linux 用户可安装:

brew install FlanChanXwO/tap/pixiv-cli

未来 beta/pre-release 通道使用:

brew install FlanChanXwO/tap/pixiv-cli-beta

两个 formula 都安装同名 pixiv,因此相互冲突;它们只下载已验证的 macOS/Linux Release 资产,不引入 ffmpeg 依赖。公开 tap 已创建并只登记了受限 deploy key 的公钥,但尚未推送任何 formula,不能执行以上命令。

直接下载(发布后)

发布流程会为 darwin、linux、windows 的 amd64/arm64 生成六个固定名称的 archive: pixiv-cli_<version>_<os>_<arch>.tar.gz(Windows 为 .zip),以及 checksums.txt 与 Ed25519 签名的 checksums.json。受支持 binary 已提交其 production public key/key ID/fingerprint, 但在 GitHub Release 实际发布、受保护签名私钥部署且资产完成验证前,仍不存在可供信任的直接下载路径。

v0.1.0 不包含 Apple notarization 或 Windows Authenticode。即使以后从已验证 Release 下载,macOS Gatekeeper 或 Windows SmartScreen 仍可能显示系统信誉提示;请只从项目的 GitHub Release 页面取得资产,核对版本、checksum 和签名说明,切勿绕过不明来源的警告。

获取 refresh token

PIXIV_REFRESH_TOKEN 必须是 Pixiv App API OAuth refresh token。网页 Cookie 里的 PHPSESSIDdevice_token 不能直接用。

推荐用 CLI 浏览器 OAuth 登录,并直接保存到本地账号:

pixiv auth login

auth login 流程:

阶段 行为
初始化 CLI 生成 PKCE verifier/challenge 和 OAuth state,并启动本地 loopback HTTP server。
浏览器 macOS 默认优先注册本地 pixiv:// callback helper 并打开默认浏览器,因此可复用已有 Pixiv 登录态;需要用户在 Pixiv 页面确认账号;使用 --no-open 时只打印登录 URL 和本地页面地址。
回调 CLI 通过 pixiv:// helper、浏览器 URL/session 只读观察或 DevTools fallback 捕获本轮 pixiv://account/login/官方 callback 请求,并继续监听本地 callback、终端粘贴和本地页面表单;浏览器若没有自动返回,可粘贴 callback URL、pixiv://... URL、Pixiv relay URL 或原始 authorization code。
校验 本地 loopback 回调必须匹配本次 state;Pixiv 官方 callback URL 与 pixiv://account/login 可在 Pixiv 未返回 state 时作为显式 fallback。
保存 refresh/access token 不会打印;refresh token 按 Pixiv UID 保存到 auth.json,文件权限为 0600

默认浏览器打开时,macOS 会优先安装/注册一个本地 PixivCLIURLHandler.app,只把 Pixiv 返回的 pixiv://account/login?... URL 转交给本轮 CLI loopback,不读取 cookie、token 或浏览器存储。若本机无法注册该 helper,CLI 才退回专用 Chromium/Edge 用户资料目录并通过 DevTools 只监听 Pixiv OAuth 请求 URL;该 fallback 不安装扩展、不点击页面、不读取 cookie 或 token。macOS 仍保留 Microsoft Edge、Chrome、Chromium 与 Safari 标签页/浏览器状态文件的只读观察;遇到 Pixiv post-redirect 授权接力页时,会校验其 return_to 属于本轮 OAuth,然后等待 Pixiv 触发 pixiv:// handoff,不再自动重开白页。浏览器可能停留在白色 relay 页,是否成功以终端最终输出为准。若手动粘贴 Pixiv relay URL,CLI 会打开该 relay URL 一次。若 Pixiv 未生成 callback,CLI 不会伪造成功,仍可使用终端或本地页面手动回填。

浏览器使用的系统代理不会自动传给 Go CLI。若 Pixiv token 端点在当前网络下需要代理,请先配置:

pixiv config set https_proxy http://127.0.0.1:7890

也可以只给本次网络命令临时覆盖代理:

pixiv auth login --proxy http://127.0.0.1:7890

--proxy URL--no-proxy 都只影响当前命令,不写入 config.toml;两者不能同时使用。--no-proxy 会清空本次命令的代理,即使环境变量或配置里存在 https_proxy

真实登录依赖 Pixiv OAuth 网页流程可用;自动化测试使用 fake OAuth server,不访问真实 Pixiv。

CLI 使用

先登录并保存一个账号:

pixiv auth login

高级/脚本场景也可以导入已有 token:

printf '%s\n' 'YOUR_REFRESH_TOKEN' | pixiv auth add

也可以直接传 token,但 --token 参数可能进入 shell history:

pixiv auth add --token 'YOUR_REFRESH_TOKEN'

常用命令:

pixiv auth list
pixiv auth use 12345678
pixiv auth check
pixiv config path
pixiv config get download_path
pixiv config set download_path ~/Downloads/pixiv
pixiv config unset https_proxy

pixiv version
pixiv version --json
pixiv --version
pixiv update --check
pixiv update --check --json

pixiv search "初音ミク"
pixiv search "初音ミク" --json
pixiv detail 123456
pixiv ranking --mode day
pixiv recommended
pixiv download 123456 789012

账号认证保存到 os.UserConfigDir()/pixiv/auth.json,账号 key 是 Pixiv UID;全局配置保存到 os.UserConfigDir()/pixiv/config.toml,两个文件权限都固定为 0600。输出默认给人读;加 --json 输出机器可解析 JSON。 CLI 使用 Cobra/pflag,选项可以写在位置参数前后,例如 pixiv auth check 12345678 --jsonpixiv search "初音ミク" --json 都是正式支持的写法。

CLI 命令表
命令 用法 说明
auth add pixiv auth add [--token TOKEN] [--json] [--proxy URL|--no-proxy] 校验 refresh token 或包含 refresh_token=... 的 Cookie,并按 Pixiv UID 添加或替换账号;不传 --token 时从 TTY/stdin 读取。
auth login pixiv auth login [--json] [--no-open] [--addr 127.0.0.1:0] [--use] [--timeout DURATION] [--proxy URL|--no-proxy] 通过本地 loopback server 和浏览器 OAuth 登录,按 Pixiv UID 保存账号;不会输出 refresh token。
auth list pixiv auth list [--json] 列出本地账号;不会输出 refresh token。
auth use pixiv auth use [UID] 设置默认账号;TTY 下可交互选择。
auth remove pixiv auth remove [UID] [--yes] 删除账号;TTY 下默认确认,删除默认账号后会自动选第一个剩余账号。
auth check pixiv auth check [UID] [--json] [--proxy URL|--no-proxy] 刷新 token 并验证账号;成功后会记录 user_id 和可获取到的 username。
config path pixiv config path 输出 config.toml 路径。
config get pixiv config get KEY 输出一个生效中的配置值。
config set pixiv config set KEY VALUE 写入一个已知配置键到 config.toml
config unset pixiv config unset KEY config.toml 删除一个已知配置键。
version pixiv version [--json] 输出当前二进制的 versioncommitbuild_date;根 pixiv --version 只输出版本。
update pixiv update [--check] [--prerelease] [--proxy URL] 检查或执行与当前安装来源匹配的更新;--json 仅可与 --check 同用。
search pixiv search [options] WORD 搜索插画。
detail pixiv detail [options] ILLUST_ID 查看单个作品详情。
ranking pixiv ranking [options] 查看 Pixiv 插画排行榜。
recommended pixiv recommended [options] 查看个性化推荐,需要认证。
download pixiv download [options] ILLUST_ID... 下载一个或多个作品;无 token 时默认走匿名 web fallback。
mcp pixiv mcp [--proxy URL|--no-proxy] 启动 MCP stdio server;代理覆盖只在本次启动时生效。
auth login 参数
参数 默认值 说明
--json false 输出保存结果 JSON;不会输出 refresh/access token。
--no-open false 不自动打开 managed/browser,也不观察浏览器 URL;只打印登录 URL 和本地 loopback 页面地址。
--addr 127.0.0.1:0 本地 loopback 监听地址;端口 0 表示自动分配。
--use false 登录成功后设为默认账号;若当前没有默认账号,也会自动设为默认。
--timeout 0 等待登录完成的最大时长;0 表示不由 CLI 主动限时。
--proxy URL / --no-proxy 本次 token exchange 代理覆盖;不会保存到 config.toml
数据命令参数
命令 参数 默认值 说明
search --search-target partial_match_for_tags 搜索范围。
search --sort date_desc 排序方式。
search --duration Pixiv API 的时间范围参数。
search --offset 0 分页偏移。
search --r18 false 在搜索词后追加 R-18
ranking --mode day 排行榜模式。
ranking --date 排行榜日期,格式通常为 YYYY-MM-DD
ranking --offset 0 分页偏移。
recommended --offset 0 分页偏移。
detail ILLUST_ID 必填 Pixiv 作品 ID。
download ILLUST_ID... 必填 一个或多个 Pixiv 作品 ID。
通用参数
参数 适用命令 默认值 说明
--uid UID search/detail/ranking/recommended/download auth.json.default_user_id 选择本地账号。
--profile UID search/detail/ranking/recommended/download --uid 的 deprecated alias。
--refresh-token TOKEN search/detail/ranking/recommended/download 临时覆盖账号/env token。
--json auth 子命令和数据命令 false 输出机器可解析 JSON。
--download-path PATH 数据命令;实际只影响 download DOWNLOAD_PATHconfig.toml./downloads 下载目录。
--filename-template TEMPLATE 数据命令;实际只影响 download FILENAME_TEMPLATEconfig.toml{author} - {title}_{id} 文件名模板。
--proxy URL auth add/login/check、数据命令、mcp https_proxy/HTTPS_PROXYconfig.toml 或空 临时使用 HTTP(S) 代理;只影响当前命令。
--no-proxy auth add/login/check、数据命令、mcp 临时清空 HTTP(S) 代理;优先级同 --proxy,且不能与 --proxy 同用。
config 支持的键
KEY 类型 默认值 说明
download_path string ./downloads 下载目录。
filename_template string {author} - {title}_{id} 文件名模板。
https_proxy string HTTP(S) 代理,优先使用环境变量中的小写 https_proxy
web_fallback_enabled bool true 无 refresh token 时,允许匿名 Pixiv web/ajax API fallback;写入为 [web] fallback_enabled = true/false
update_check_enabled bool true 普通 CLI 成功命令后是否检查稳定版更新;写入为 [update] check_enabled = true/false
output_json bool false 数据命令默认输出 JSON。
login_open_browser bool true auth login 默认是否自动打开浏览器。
login_timeout duration 0s auth login 默认等待时长。
login_use_after_login bool false auth login 默认是否设为当前默认账号。
环境变量
环境变量 默认值 说明
PIXIV_REFRESH_TOKEN Pixiv App API OAuth refresh token;可被账号选择或 --refresh-token 覆盖。
DOWNLOAD_PATH ./downloads 下载目录。
FILENAME_TEMPLATE {author} - {title}_{id} 文件名模板。
https_proxy / HTTPS_PROXY HTTP(S) 代理;优先使用小写 https_proxy

认证优先级:--refresh-token > --uid/deprecated --profile > PIXIV_REFRESH_TOKEN > auth.json.default_user_id

设置类字段优先级:命令行 flag > 环境变量 > config.toml > 默认值。代理的命令行覆盖只支持 --proxy URL / --no-proxy,且不会持久化。

匿名 web fallback

--refresh-tokenPIXIV_REFRESH_TOKEN 和默认账号都没有提供 refresh token,且 web_fallback_enabled=true 时,下列能力自动走 Pixiv web/ajax API:searchdetailrankingdownload,以及 MCP tools search_illustillust_detailillust_rankingsearch_userdownloadget_thumbnail_base64

有 refresh token 时仍优先使用 App API;token 无效、App API 网络错误或服务端错误不会自动 fallback,会直接暴露真实错误。

匿名 fallback 的差异:

  • search_user 不是 Pixiv 官方用户搜索;它通过 web 作品搜索结果按 userId 去重,返回“相关作品作者”。
  • 静态单页/多页下载使用 /ajax/illust/{id}/pagesoriginal URL。
  • ugoira 下载使用 /ajax/illust/{id}/ugoira_metaoriginalSrc zip 和 frames;受支持的发行构建通过内置 Rust encoder 生成 GIF/APNG,运行时不依赖 ffmpeg
  • web fallback 不新增专用代理环境变量,继续使用 --proxy / --no-proxyhttps_proxy / HTTPS_PROXYpixiv config set https_proxy ...

关闭方式:

pixiv config set web_fallback_enabled false

版本与更新

pixiv version 输出可读的版本、commit 与构建日期;pixiv version --json 的 stdout 是只含 versioncommitbuild_date 的 JSON。根 pixiv --version 适合快速检查版本。

pixiv version
pixiv version --json
pixiv --version

显式更新先检查再安装;检查可使用 JSON,而实际安装不接受 --json

pixiv update --check
pixiv update --check --json
pixiv update --check --prerelease
pixiv update --proxy http://127.0.0.1:7890

开发构建显示 dev 并拒绝自更新。正式安装时,更新器会识别 Homebrew stable/beta、go install 或 Release binary:stable/beta 按 --prerelease 在两个相互冲突的 formula 间切换;若切换 安装失败,会显式尝试恢复原 formula 并报告原错误和恢复结果。go install 使用精确 Release tag;Release binary 在下载前校验 Ed25519 签名的 checksum 清单和 archive SHA-256,再预检 pixiv version --json 并原子替换可执行文件。

受支持 binary 已内置 production Ed25519 public key/key ID/fingerprint;私钥只保存在受保护的 release Environment 与受控 macOS Keychain 恢复副本,且尚未发布 Release。因此这不是可用下载 渠道的声明;pixiv update --check 的只读检查也不能证明存在已签名、可安装的 Release。

普通 CLI 命令成功后会尽力检查 stable 更新。它跳过 MCP、help、versionupdate 与开发构建, 对同一用户 cache 最多每 24 小时查询一次,并为自动检查设定最多 3 秒的等待时间。发现新版本或 检查失败只写 stderr(失败为 warning),不改变业务命令退出码,也不会污染 JSON stdout 或 MCP JSON-RPC stdout。可关闭自动检查:

pixiv config set update_check_enabled false

MCP 使用

MCP stdio server 需要显式启动:

PIXIV_REFRESH_TOKEN=... \
DOWNLOAD_PATH=./downloads \
FILENAME_TEMPLATE="{author} - {title}_{id}" \
./build/pixiv mcp

MCP 的代理覆盖是启动期设置:

./build/pixiv mcp --proxy http://127.0.0.1:7890
./build/pixiv mcp --no-proxy

未设置 PIXIV_REFRESH_TOKEN 时,pixiv mcp 会先回退到 auth.json.default_user_id;如果仍没有 refresh token 且 web_fallback_enabled=true,支持匿名 fallback 的 MCP tools 会直接使用 Pixiv web/ajax API。真实 token 写在 inline 环境变量里也可能进入 shell history;长期使用建议通过 MCP client 的私密环境配置或本地账号管理。

日志写入 stderr,stdout 保留给 MCP JSON-RPC。

MCP client 配置示例:

{
  "mcpServers": {
    "pixiv-server": {
      "command": "/absolute/path/to/pixiv-cli/build/pixiv",
      "args": ["mcp"],
      "env": {
        "PIXIV_REFRESH_TOKEN": "your refresh token or cookie with refresh_token=...",
        "DOWNLOAD_PATH": "./downloads",
        "FILENAME_TEMPLATE": "{author} - {title}_{id}"
      }
    }
  }
}

命令概览

CLI 命令:

  • auth add/login/list/remove/use/check
  • config path/get/set/unset
  • version
  • update
  • search
  • detail
  • ranking
  • recommended
  • download
  • mcp

MCP tools:

set_download_path, download, refresh_token, set_refresh_token, download_random_from_recommendation, search_illust, illust_detail, illust_related, illust_ranking, search_user, illust_recommended, trending_tags_illust, illust_follow, user_bookmarks, user_following, and get_thumbnail_base64.

开发验证

go test ./...
sh scripts/build.sh
./build/pixiv --help
./build/pixiv mcp --help
PIXIV_E2E_WEB_API=1 PIXIV_WEB_API_PROXY=http://127.0.0.1:7890 go test ./test/e2e -run WebAPIFallbackReal -count=1 -v

真实 Pixiv web fallback e2e 默认跳过;只有设置 PIXIV_E2E_WEB_API=1 时才会联网。

Directories

Path Synopsis
cmd
pixiv command
internal
buildinfo
Package buildinfo exposes metadata embedded by the Go linker at build time.
Package buildinfo exposes metadata embedded by the Go linker at build time.
cli
download/staticlib
Package staticlib 定义与 cgo encoder 解耦的 Rust staticlib 来源身份和完整性契约。
Package staticlib 定义与 cgo encoder 解耦的 Rust staticlib 来源身份和完整性契约。
update
Package update contains installation-source detection and update domain logic.
Package update contains installation-source detection and update domain logic.
scripts
homebrewformula command
Command homebrewformula 根据已验证 release checksums.txt 的六个 archive 渲染 URL 与 digest 均受约束的 Homebrew formula。
Command homebrewformula 根据已验证 release checksums.txt 的六个 archive 渲染 URL 与 digest 均受约束的 Homebrew formula。
licensebundle command
Command licensebundle 从六个 release Rust target 的锁定离线依赖图生成许可证 bundle。
Command licensebundle 从六个 release Rust target 的锁定离线依赖图生成许可证 bundle。
nativeevidence command
Command nativeevidence records and validates non-release native runner evidence.
Command nativeevidence records and validates non-release native runner evidence.
releaseassets command
Command releaseassets assembles the deterministic artifacts attached to a Pixiv CLI release.
Command releaseassets assembles the deterministic artifacts attached to a Pixiv CLI release.
releaseworkflow command
Command releaseworkflow 检查发布 workflow 的结构化安全与质量门禁。
Command releaseworkflow 检查发布 workflow 的结构化安全与质量门禁。

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL