Skip to content

bwwq/Pixiv-XP-Pusher

Repository files navigation

Pixiv-XP-Pusher

🎨 智能 XP 捕获与推送系统

基于用户收藏自动分析 XP(性癖/兴趣偏好)画像,全网搜索并智能推送最懂你的 Pixiv 插画。支持 Telegram / QQ (OneBot) 多渠道推送。


✨ 核心特性

  • 🧠 XP 画像构建 - 深度分析你的收藏夹,提取核心 Tag 权重,比你更懂你的口味
  • 🤖 AI 增强引擎 [New!]
    • 语义匹配 (Embedding): 理解标签背后的深层含义,发现画风相似但标签不同的宝藏
    • 智能清洗: 集成 LLM (OpenAI/DeepSeek) 过滤无意义标签、归并同义词
    • 多样性控制: 智能抑制刷屏画师,确保推荐内容丰富多元
  • 🔍 混合搜索策略 -
    • XP 搜索: 基于画像权重的多标签组合搜索
    • 互动发现: [New!] 深度挖掘常互动画师的社交圈,发现同好圈子
    • 关联推荐: 自动发掘高分作品的"相似作品",发现潜在 XP
    • 画师订阅: 自动追踪关注画师的最新作品
    • 排行榜: 每日/每周排行榜筛选
  • 🧬 反馈闭环 - [New!]
    • 连锁反应: 点击 Like ❤️ 立即推送关联作品,自动回复形成消息链 (单图深度可控),好图停不下来
    • 画师权重: 反馈直接影响画师评分,喜欢的画师会更常出现
    • 智能屏蔽: 厌恶达到阈值仅提示确认,尊重用户选择
  • 🎭 智能过滤 -
    • R-18 混合模式: 支持 纯R18 / 净网 / 混合模式 三档调节
    • 多维度去重(ID/图片指纹)
    • AI 作画检测与过滤
    • 动态阈值(热门 Tag 需高收藏,冷门 Tag 宽容度高)
  • 📱 多渠道推送 -
    • Telegram:
      • 支持 MediaGroup 图集、直传图片(防盗链/被墙)
      • 交互式菜单 [New!]: /menu 打开控制面板,按钮操作无需记指令
      • Telegraph 批量模式 [New!]: 多图合并为 Telegraph 页面,界面简洁
      • 交互式指令:
        • /menu - 📋 打开控制面板 (推荐)
        • /push - 立即触发推送
        • /push <ID> - 手动推送指定作品 ID
        • /xp - 查看您的 XP 画像 (Top Tags)
        • /stats - 查看各策略 (XP搜索/订阅/榜单) 的成功率
        • /schedule - 查看或修改定时任务时间
        • /block - 快速屏蔽讨厌的标签
        • /block_artist - 快速屏蔽画师 ID
    • OneBot (QQ): 支持 Go-CQHTTP/Lagrange,链接卡片或图文消息,多图并发下载
    • AstrBot [实验性]: 通过 HTTP API 接入 AstrBot 多平台框架,支持 QQ/微信/Telegram 等
  • ⚙️ 完全自动化
    • 智能调度器,支持多时间点运行
    • 每日日报: 每天生成 XP 变化报告与策略统计
    • 健康检查: 每 30 分钟自动检测 Telegram 连接,断线自动重连 [New!]
    • Web API: /health 端点,易于接入外部监控
  • 🛠️ 懒人配置 - 提供交互式引导脚本 launcher.py,一键完成环境与参数配置

🚀 快速开始

方式一:Docker 部署 (推荐)

最简单、最稳定的运行方式。

# 1. 下载项目
git clone https://github.com/bwwq/Pixiv-XP-Pusher.git
cd Pixiv-XP-Pusher

# 2. 启动服务 (自动构建并运行)
chmod +x deploy.sh
./deploy.sh start

# 3. 查看日志
./deploy.sh logs
  • 初次启动
    • 容器会自动启动 Web UI调度程序
    • 访问 http://VPS_IP:8000 设置管理密码并完成初始化配置
    • 首次执行一次 "Run Once" 任务,然后进入定时调度模式
  • 管理命令
    • ./deploy.sh stop - 停止服务
    • ./deploy.sh once - 手动触发一次推送
    • ./deploy.sh reset-xp - 清空 XP 缓存(保留收藏数据)

方式二:本地直接运行 (Windows/Linux)

1. 环境准备

确保已安装 Python 3.10+。

# 安装依赖
pip install -r requirements.txt

2. 交互式配置 (小白推荐)

运行引导脚本,跟随提示完成 Token 获取、账号设置和推送配置。

# Windows
start.bat

# Linux/macOS
python launcher.py

3. 手动运行

# 获取 Pixiv Token (需要浏览器交互)
python get_token.py

# 立即执行一次推送
python main.py --once

# 启动定时调度模式 (守护进程)
python main.py --now

⚙️ 配置文件 (config.yaml)

如果跳过引导脚本手动配置,请参考以下结构。

注意:推荐使用 launcher.py 自动生成配置。

pixiv:
  user_id: 12345678 # 你的 Pixiv 用户 ID(用于分析 XP)
  refresh_token: "..." # 必填,用于搜索/排行榜等操作

  # [New!] 可选:同步专用 Token (仅用于获取收藏和关注动态)
  # 使用独立 Token 可降低主号因搜索等操作被封禁的风险
  sync_token: "" # 留空则使用主 Token

profiler:
  ai:
    enabled: true
    provider: "openai" # 支持 openai 格式接口
    api_key: "sk-..."
    base_url: "https://api.openai.com/v1"
    model: "gpt-4o-mini"

    # [New!] 语义搜索配置
    embedding:
      model: "text-embedding-3-small"
      dimensions: 1536

  scan_limit: 1000 # 每次分析收藏的数量
  discovery_rate: 0.1 # 探索新 Tag 的概率

fetcher:
  # MAB 策略配额限制 (防止某一策略独占)
  mab_limits:
    min_quota: 0.2
    max_quota: 0.6

  bookmark_threshold:
    search: 1000 # 搜索结果的最低收藏数要求
  subscribed_artists: [] # 额外关注的画师 ID 列表

filter:
  daily_limit: 20 # 每日推送上限
  exclude_ai: true # 过滤 AI 生成作品
  r18_mode: false # 是否允许 R18 (需 Token 权限)

scheduler:
  # 定时任务配置 (Cron 表达式: 分 时 日 月 周)
  # 支持多个时间点,用逗号分隔
  cron: "0 12 * * *, 0 21 * * *"
  # 每日维护任务 (发送日报 + 清理数据)
  daily_report_cron: "0 0 * * *"

notifier:
  # 启用的推送通道列表
  types: [telegram]

  telegram:
    bot_token: "123456:ABC..."
    # 你的 Telegram User ID (必须配置,否则无法使用指令)
    allowed_users:
      - "123456789"
    chat_ids: [123456789]

  onebot:
    ws_url: "ws://127.0.0.1:3001"
    private_id: 12345678

# 进阶配置 (可选)
web:
  password: "" # 留空表示首次访问时设置
  # 启动后访问 http://localhost:8000 查看管理面板

进阶配置项 [New!]

notifier:
  multi_page_mode: "media_group" # cover_link | media_group
  max_pages: 10 # 多图模式最大页数 (1-10)

  telegram:
    image_quality: 85 # JPEG 压缩质量 (50-95),越低越快
    max_image_size: 2000 # 最大边长 (px),越小越快

    # Topic 智能分流 [New!]
    topic_rules:
      r18: 12345 # R18 作品自动发到此 Topic
      wallpaper: 67890 # "wallpaper" 标签发到此 Topic
    topic_tag_mapping:
      wallpaper: ["風景", "背景", "scenery"]

🎨 Web 管理后台 [New!]

启动服务后,访问 http://localhost:8000 (默认端口) 即可进入管理后台。

  • Dashboard: 查看 XP 画像词云、近期推送统计。
  • Gallery: 浏览推送历史,提供无限滚动画廊。
    • 画廊代理: 内置本地反代服务,无需梯子即可在画廊中浏览 Pixiv 图片(需配置 proxy_url)。
  • 设置: 首次访问需设置管理密码,之后凭密码登录。

📂 项目结构

pixiv-xp/
├── config.yaml          # 配置文件
├── main.py              # 程序主入口 (调度/执行)
├── launcher.py          # 交互式引导/管理菜单
├── start.bat            # Windows 启动脚本
├── deploy.sh            # Docker 管理脚本
├── get_token.py         # Pixiv Token 获取工具
├── requirements.txt     # Python 依赖
├── docker-compose.yml   # Docker 编排
├── pixiv_client.py      # Pixiv API 封装
├── profiler.py          # XP 画像分析核心
├── fetcher.py           # 内容搜索与抓取
├── filter.py            # 过滤与去重逻辑
├── database.py          # SQLite 数据存储
└── notifier/            # 推送适配器 (Telegram, OneBot)

📖 新手完整教程 (Step-by-Step)

从零开始,一步步教你跑起来!

Step 1: 环境准备

必需软件:

  • Python 3.10+: 下载地址
  • Git (可选): 用于克隆项目
  • 代理软件 (国内必需): v2rayN / Clash 等,用于连接 Telegram

安装依赖:

# 克隆项目(或直接下载 ZIP)
git clone https://github.com/bwwq/Pixiv-XP-Pusher.git
cd Pixiv-XP-Pusher

# 安装 Python 依赖
pip install -r requirements.txt

Step 2: 获取 Pixiv Token

⚠️ 这是最关键的一步! Token 是访问 Pixiv API 的钥匙。

python get_token.py

脚本会自动打开浏览器窗口,请登录您的 Pixiv 账号。登录成功后,Token 会自动保存到 config.yaml

无法打开浏览器? (服务器环境)

  1. 在本地电脑运行 get_token.py 获取 Token
  2. 将获取到的 refresh_token 手动复制到服务器的 config.yaml

Step 3: 配置 Telegram Bot

3.1 创建 Bot

  1. 在 Telegram 中搜索 @BotFather
  2. 发送 /newbot 创建机器人
  3. 按提示设置名称,获得 bot_token(形如 123456789:ABCdefGHIjklMNO...

3.2 获取 Chat ID

  1. 将你的 Bot 拉入目标群组(或直接私聊)
  2. 访问 https://api.telegram.org/bot<你的token>/getUpdates
  3. 发送任意消息给 Bot,刷新页面,找到 "chat": {"id": -100xxxxx} 就是 Chat ID

3.3 获取 User ID

  1. 在 Telegram 中搜索 @userinfobot
  2. 发送 /start,它会回复你的 User ID

3.4 填写配置

打开 config.yaml,填入获取到的信息:

notifier:
  types: [telegram]

  telegram:
    bot_token: "123456789:ABCdefGHIjklMNO..." # BotFather 给你的
    chat_ids:
      - "-1001234567890" # 你的群组 ID(或个人 Chat ID)
    allowed_users:
      - "987654321" # 你的 User ID(用于权限控制)
    proxy_url: "http://127.0.0.1:7890" # 代理地址(国内必填!)

🔴 国内用户必看: proxy_url 必须填写你的代理软件地址,否则 Bot 无法连接 Telegram!

3.5 (可选) 配置 OneBot (QQ)

如果您使用 QQ 而非 Telegram,请配置 OneBot:

  1. 安装 Lagrange.OneBotGo-CQHTTP
  2. 启动后获取 WebSocket 地址(默认 ws://127.0.0.1:3001
  3. 填写配置:
notifier:
  types: [onebot]

  onebot:
    ws_url: "ws://127.0.0.1:3001"
    private_id: 12345678 # 你的 QQ 号(推送目标)
    master_id: 12345678 # 主人 QQ(只有主人能使用指令)
    push_to_private: true

OneBot 支持与 Telegram 相同的指令:/push, /xp, /stats, /block, /unblock, /schedule, /help

3.6 (可选) 配置 AstrBot [实验性]

⚠️ 实验性功能:AstrBot 渠道目前为实验性支持,API 接口可能随 AstrBot 版本更新而变化。

如果您使用 AstrBot 多平台机器人框架:

前置条件:

  1. 已安装并运行 AstrBot
  2. 在 AstrBot 管理面板安装 astrbot_plugin_http_adapter 插件
  3. 获取目标会话的 unified_msg_origin(从 AstrBot 日志或管理面板获取)
notifier:
  types: [astrbot]

  astrbot:
    http_url: "http://127.0.0.1:6185" # HTTP API 地址
    unified_msg_origin: "QQOfficial:group:123456" # 目标会话标识
    api_key: "" # API 密钥(如需认证)

提示: unified_msg_origin 格式通常为 平台:类型:ID,如 QQOfficial:group:123456Telegram:private:789


Step 4: 配置 AI 清洗 (可选但推荐)

AI 功能可以智能合并同义词(如"白发"="White Hair"),提升画像精准度。

profiler:
  ai:
    enabled: true
    provider: "openai"
    api_key: "sk-..." # 你的 OpenAI API Key
    base_url: "https://api.openai.com/v1" # 或中转地址
    model: "gpt-4o-mini" # 推荐,便宜又好用

没有 API? 设置 enabled: false,系统会用纯统计模式运行。


Step 5: 启动程序

# 方式A: 立即执行一次推送(测试用)
python main.py --once

# 方式B: 启动定时任务 + 立即执行一次
python main.py --now

# 方式C: 仅启动定时任务(后台守护)
python main.py

Windows 用户: 直接双击 start.bat 启动交互菜单。


Step 6: 使用 Bot 指令

Bot 启动后,在 Telegram 聊天框输入 / 可看到所有指令:

指令 功能
/push 🚀 立即触发一次推送
/push <ID> 📌 手动推送指定作品
/xp 🎯 查看你的 XP 画像(Top 标签)
/stats 📈 查看各策略的成功率
/schedule ⏰ 查看/修改定时时间
/block <tag> 🚫 屏蔽讨厌的标签
/unblock <tag> ✅ 取消屏蔽标签
/help ℹ️ 显示帮助

修改定时时间示例:

/schedule 9:30,21:00   # 每天 9:30 和 21:00 推送

Step 7: 日常维护

  • 重置 XP 画像: python main.py --reset-xp
  • 查看日志: 日志保存在 logs/ 目录
  • 更新项目: git pull && pip install -r requirements.txt

🙋 常见问题

Q: telegram.error.NetworkError / httpx.ConnectError

原因: 无法连接 Telegram 服务器(国内被墙)

解决:config.yaml 中配置代理:

telegram:
  proxy_url: "http://127.0.0.1:7890" # 改成你的代理地址
Q: 点击 喜欢/不喜欢 按钮提示"无权限"

原因: 你的 User ID 没有加入 allowed_users 列表

解决:

  1. 通过 @userinfobot 获取你的 User ID
  2. 将 ID 添加到 config.yamlallowed_users 列表中
Q: 如何获取 Pixiv Refresh Token? 运行 python get_token.py,脚本会启动一个 Selenium 浏览器窗口引导登录,登录成功后会自动捕获并保存 Token。
Q: 部署在服务器,无法打开浏览器获取 Token 怎么办? 请在本地电脑运行 python get_token.py 获取 Token 后,将其复制到服务器的 config.yaml 中。
Q: XP 画像是如何生成的? 系统会拉取你的 Pixiv 收藏夹(公开+私密),统计所有作品的标签频率。结合 AI (如果启用) 清洗同义词(如 "白发" = "White Hair"),计算出这一标签的权重。推送时会根据这些权重组合搜索关键词。
Q: 为什么 AI 模式报错 401/502? 请检查 `config.yaml` 中 LLM 的 `api_key` 和 `base_url` 是否正确。如果 API 不稳定,可以在配置中关闭 AI 功能 (`enabled: false`),系统将回退到纯统计模式运行。

📜 许可证

MIT License


📝 更新日志 / Changelog

2026-01-26

🐛 修复 / Bug Fixes

  • Docker 部署修复 / Docker Deployment Fix
    • 🇨🇳 修复 Docker 容器只启动主程序,未启动 Web UI 的问题。现在容器启动后会同时运行 Web UI (uvicorn) 和调度程序 (main.py --now)
    • 🇺🇸 Fixed Docker container only starting the main program without the Web UI. Now the container runs both Web UI (uvicorn) and scheduler (main.py --now) simultaneously
    • 🇨🇳 修复 config.yaml 挂载为只读导致首次设置密码失败的问题。已移除 :ro 只读限制
    • 🇺🇸 Fixed config.yaml being mounted as read-only, causing password setup to fail. Removed :ro read-only restriction
    • 🇨🇳 添加 8000:8000 端口映射,使 Web UI 可从外部访问
    • 🇺🇸 Added 8000:8000 port mapping to make Web UI accessible externally

📖 文档更新 / Documentation

  • 🇨🇳 更新 Docker 部署说明,明确首次启动需访问 http://VPS_IP:8000 设置密码
  • 🇺🇸 Updated Docker deployment instructions, clarifying that users need to visit http://VPS_IP:8000 to set password on first launch

🔄 升级指南 / Upgrade Guide

# 拉取更新 / Pull updates
git pull

# 重新构建并启动 / Rebuild and start
docker-compose up -d --build

# 访问 Web UI / Access Web UI
# http://VPS_IP:8000

About

根据你的xp个性化推送图片

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors

Languages