{"id":31583979,"url":"https://github.com/funnyzak/weread-bot","last_synced_at":"2025-10-06T00:19:46.814Z","repository":{"id":315346680,"uuid":"1050822804","full_name":"funnyzak/weread-bot","owner":"funnyzak","description":"一个智能的微信读书自动阅读机器人，通过模拟真实用户阅读行为来积累阅读时长，支持多用户多种运行模式（立即执行、定时任务、守护进程），适用于需要提升微信读书等级或完成阅读任务的用户场景。","archived":false,"fork":false,"pushed_at":"2025-09-28T05:53:20.000Z","size":2179,"stargazers_count":14,"open_issues_count":0,"forks_count":7,"subscribers_count":0,"default_branch":"main","last_synced_at":"2025-09-28T07:21:20.599Z","etag":null,"topics":["automation","wechat","weread","wereadbot","wexin","wexinbot","wxread"],"latest_commit_sha":null,"homepage":"https://weread.gh.yycc.dev","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/funnyzak.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2025-09-05T02:06:37.000Z","updated_at":"2025-09-28T05:53:17.000Z","dependencies_parsed_at":"2025-09-18T05:28:06.793Z","dependency_job_id":"1c155f21-cfcf-4316-a0b9-105b9ccf1d6f","html_url":"https://github.com/funnyzak/weread-bot","commit_stats":null,"previous_names":["funnyzak/weread-bot"],"tags_count":6,"template":false,"template_full_name":null,"purl":"pkg:github/funnyzak/weread-bot","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/funnyzak%2Fweread-bot","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/funnyzak%2Fweread-bot/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/funnyzak%2Fweread-bot/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/funnyzak%2Fweread-bot/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/funnyzak","download_url":"https://codeload.github.com/funnyzak/weread-bot/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/funnyzak%2Fweread-bot/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":278539558,"owners_count":26003604,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-10-05T02:00:06.059Z","response_time":54,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["automation","wechat","weread","wereadbot","wexin","wexinbot","wxread"],"created_at":"2025-10-06T00:19:43.622Z","updated_at":"2025-10-06T00:19:46.805Z","avatar_url":"https://github.com/funnyzak.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"# WeRead Bot: 微信读书阅读机器人\n\n[![Auto Reading Bot](https://img.shields.io/github/actions/workflow/status/funnyzak/weread-bot/auto-reading.yml?style=flat-square\u0026label=Auto%20Reading)](https://github.com/funnyzak/weread-bot/actions/workflows/auto-reading.yml)\n[![Docker Tags](https://img.shields.io/docker/v/funnyzak/weread-bot?sort=semver\u0026style=flat-square\u0026label=docker%20image)](https://hub.docker.com/r/funnyzak/weread-bot/)\n[![Commit activity](https://img.shields.io/github/commit-activity/m/funnyzak/weread-bot?style=flat-square)](https://hub.docker.com/r/funnyzak/weread-bot/)\n[![Python](https://img.shields.io/badge/python-3.9+-blue?style=flat-square)](https://www.python.org/)\n[![GitHub license](https://img.shields.io/github/license/funnyzak/weread-bot?style=flat-square)](https://github.com/funnyzak/weread-bot/blob/main/LICENSE)\n\nWeRead Bot 是一个易用的微信读书自动阅读机器人，通过模拟真实用户阅读行为来积累阅读时长，支持多用户多种运行模式（立即执行、定时任务、守护进程），适用于需要提升微信读书等级或完成阅读任务的用户场景。\n\n💗 感谢 [findmover/wxread](https://github.com/findmover/wxread) 提供思路和部分代码支持。\n\n## 核心功能\n\n- ⏰ **智能延迟**：支持启动随机延迟，有效防止固定启动时间特征识别\n- 📚 **灵活阅读**：支持时长区间配置（如 30-90 分钟随机），模拟真实阅读习惯\n- 👥 **多用户支持**：支持多个微信读书账号顺序执行，每用户可独立配置阅读策略\n- 🎲 **多种阅读模式**：智能随机、顺序阅读、纯随机三种模式，满足不同使用场景\n- 🤖 **高级行为模拟**：模拟真实用户阅读行为，包括阅读速度变化、中途休息等\n- ⚙️ **多样化配置**：支持配置文件、环境变量、命令行参数三种设置方式，灵活适配各种部署环境\n- 📊 **详细统计报告**：提供完整的阅读数据、成功率统计和多维度分析\n- 📱 **多平台消息推送**：支持 PushPlus、Telegram、WxPusher、Apprise、Bark、Ntfy、飞书、企业微信、钉钉、Gotify 等通知服务\n- 🔧 **智能配置解析**：自动从 CURL 命令提取请求数据、headers 和 cookies，无需手动配置\n- 🎯 **精准请求模拟**：使用真实抓包数据，动态生成签名和校验，大幅提高成功率\n- 🕐 **灵活定时任务**：支持 cron 表达式定时执行，可自定义执行频率和时间\n- 🔄 **守护进程模式**：支持长期运行，自动管理会话间隔，每日会话数量可控\n- 🐳 **容器化部署**：提供 Docker 镜像，支持 Docker Compose 一键部署\n- ⚡ **云端自动化**：完美支持 GitHub Actions，实现免服务器自动阅读任务\n- 🎨 **配置生成器**：提供在线配置生成器，可视化界面生成配置文件，简化配置过程\n\n## 运行预览\n\n\u003cimg src=\"https://raw.githubusercontent.com/funnyzak/weread-bot/refs/heads/main/.github/assets/preview.png\" alt=\"运行预览\" style=\"filter: drop-shadow(0 4px 8px rgba(0, 0, 0, 0.2)); border-radius: 8px;\"/\u003e\n\n## 快速开始\n\n### 方式一：直接运行（推荐）\n\n```bash\n# 1. 下载文件\nwget https://raw.githubusercontent.com/funnyzak/weread-bot/refs/heads/main/weread-bot.py\nwget https://raw.githubusercontent.com/funnyzak/weread-bot/refs/heads/main/requirements.txt\n\n# 2. 安装依赖\npip install -r requirements.txt\n\n# 3. 设置环境变量\n# 设置CURL命令文件路径（推荐）\nexport WEREAD_CURL_BASH_FILE_PATH=\"curl_command.txt\"\n# 或 设置 CURL命令字符串\nexport WEREAD_CURL_STRING=\"curl 'https://weread.qq.com/web/book/read' -H 'cookie: wr_skey=user1_key; ...' --data-raw '{...}'\"\n\n# 4. 可选配置\nexport TARGET_DURATION=\"30-50\"        # 目标阅读时长（分钟），此为 30 到 50 分钟随机\nexport READING_MODE=\"smart_random\"    # 阅读模式\nexport PUSHPLUS_TOKEN=\"your_token\"    # PushPlus通知token（如需通知）\n\n# 5. 运行程序\npython weread-bot.py\n```\n\n\u003e 请将第 3 步中的 `curl_command.txt` 替换为实际保存CURL命令的文件路径。获取CURL命令详见[抓包配置详解](#🔧-抓包配置详解)\n\n### 方式二：配置文件运行\n\n```bash\n# 1. 下载配置模板\nwget https://raw.githubusercontent.com/funnyzak/weread-bot/refs/heads/main/config.yaml.example\n\n# 2. 创建配置文件\ncp config.yaml.example config.yaml\n\n# 3. 编辑配置文件\nvim config.yaml\n\n# 4. 运行程序\npython weread-bot.py --config config.yaml\n```\n\u003e 你可以访问： https://weread.gh.yycc.dev/config-generator.html ，通过图形界面生成配置文件\n\n### 方式三：多用户运行\n\n```bash\n# 1. 下载配置模板\nwget https://raw.githubusercontent.com/funnyzak/weread-bot/refs/heads/main/config.yaml.example\n\n# 2. 创建多用户配置文件进行配置\ncp config.yaml.example multiuser-config.yaml\n\n# 3. 为每个用户准备CURL文件\necho \"curl 'https://weread.qq.com/web/book/read' -H 'cookie: wr_skey=user1_key; ...' --data-raw '{...}'\" \u003e user1_curl.txt\necho \"curl 'https://weread.qq.com/web/book/read' -H 'cookie: wr_skey=user2_key; ...' --data-raw '{...}'\" \u003e user2_curl.txt\n\n# 5. 编辑配置文件\nvim multiuser-config.yaml\n\n# 6. 运行多用户会话\npython weread-bot.py --config multiuser-config.yaml\n```\n\n### 方式四：GitHub Actions 云端运行\n\n```bash\n# 1. Fork 本项目到你的 GitHub 账户\n# 2. 在仓库 Settings → Secrets 中配置必要的环境变量\n# 3. 在 Actions 页面手动触发或设置定时运行\n```\n\n\u003e **详细配置指南**: [GitHub Actions 自动阅读配置指南](https://github.com/funnyzak/weread-bot/blob/main/docs/github-action-autoread-guide.md)\n\n### 方式五：不同运行模式\n\n```bash\n# 立即执行（默认）\npython weread-bot.py\n\n# 定时执行\npython weread-bot.py --mode scheduled\n\n# 守护进程模式\npython weread-bot.py --mode daemon\n\n# 详细日志输出\npython weread-bot.py --verbose\n```\n\n### 方式六：Docker 方式运行\n\n使用一行命令单次运行：\n\n```bash\ndocker run -d --name weread-bot \\\n  --rm \\\n  -v /path/to/curl_command.txt:/app/curl_command.txt:ro \\\n  -e TZ=\"Asia/Shanghai\" \\\n  -e WEREAD_CURL_BASH_FILE_PATH=\"/app/curl_command.txt\" \\\n  -e TARGET_DURATION=\"30-50\" \\\n  -e READING_MODE=\"smart_random\" \\\n  -e PUSHPLUS_TOKEN=\"your_token\" \\\n  funnyzak/weread-bot:latest\n```\n\n\u003e 更多 Docker 方式运行方式，详见 [Docker部署](#docker部署)。\n\n## 配置说明\n\n配置项可通过环境变量或配置文件设置，优先级为：环境变量 \u003e 配置文件 \u003e 程序默认值。 配置文件模板见 [`config.yaml.example`](https://raw.githubusercontent.com/funnyzak/weread-bot/refs/heads/main/config.yaml.example)。\n\n### 配置生成器（推荐新手）\n\n使用在线配置生成器，通过可视化界面生成配置文件：\n\n```bash\n# 访问在线配置生成器\nopen https://weread.gh.yycc.dev/config-generator.html\n\n# 或本地运行配置生成器\nwget https://raw.githubusercontent.com/funnyzak/weread-bot/refs/heads/main/config-generator.html\nopen config-generator.html\n```\n\n**在线访问地址：**\n- 🌐 **配置生成器**: https://weread.gh.yycc.dev/config-generator.html\n- 📖 **项目文档**: https://weread.gh.yycc.dev/\n\n### 必需配置\n\n如果 **未使用配置文件配置**，必须通过环境变量参数提供以下配置：\n\n| 配置项 | 环境变量 | 说明 |\n|--------|----------|------|\n| CURL配置 | `WEREAD_CURL_STRING` 或 `WEREAD_CURL_BASH_FILE_PATH` | 从微信读书抓包得到的curl命令或命令文件路径 |\n\n- `WEREAD_CURL_STRING`：此环境变量适合在 青龙等面板、GitHub Actions 中直接创建环境变量，内容为完整的CURL命令字符串\n- `WEREAD_CURL_BASH_FILE_PATH`：此环境变量适合在本地或Docker中使用，内容为保存CURL命令的文件路径\n\n\u003e 获取CURL命令详见[抓包配置详解](#抓包配置详解)\n\n### 多用户配置\n\n支持通过配置文件配置多个用户的CURL命令和个性化参数，适合需要同时管理多个微信读书账号的场景。\n\n| 配置项 | 配置文件路径 | 说明 |\n|--------|-------------|------|\n| 多用户模式 | `curl_config.users` | 配置多个用户的CURL文件和个性化参数 |\n| 用户名称 | `curl_config.users[].name` | 用户标识名称 |\n| CURL文件 | `curl_config.users[].file_path` | 用户专属的CURL文件路径 |\n| 个性化配置 | `curl_config.users[].reading_overrides` | 用户特定的阅读参数覆盖 |\n\n\n### 应用配置\n\n| 配置项 | 环境变量 | 默认值 | 说明 |\n|--------|----------|--------|------|\n| 启动模式 | `STARTUP_MODE` | `immediate` | immediate/scheduled/daemon |\n| 启动延迟 | `STARTUP_DELAY` | `60-120` | 启动随机延迟（秒） |\n\n### 阅读配置\n\n| 配置项 | 环境变量 | 默认值 | 说明 |\n|--------|----------|--------|------|\n| 阅读模式 | `READING_MODE` | `smart_random` | smart_random/sequential/pure_random |\n| 目标时长 | `TARGET_DURATION` | `60-70` | 目标阅读时长（分钟） |\n| 阅读间隔 | `READING_INTERVAL` | `25-35` | 每次请求间隔（秒） |\n| 书籍连续性 | `BOOK_CONTINUITY` | `0.8` | 继续当前书籍的概率（0-1） |\n| 章节连续性 | `CHAPTER_CONTINUITY` | `0.7` | 顺序阅读章节的概率（0-1） |\n\n### 人类行为模拟配置\n\n| 配置项 | 环境变量 | 默认值 | 说明 |\n|--------|----------|--------|------|\n| 行为模拟 | `HUMAN_SIMULATION_ENABLED` | `true` | 是否启用人类行为模拟 |\n| 阅读速度变化 | `READING_SPEED_VARIATION` | `true` | 是否变化阅读速度 |\n| 休息概率 | `BREAK_PROBABILITY` | `0.15` | 中途休息概率（0-1） |\n| 休息时长 | `BREAK_DURATION` | `30-180` | 休息时长（秒） |\n| User-Agent轮换 | `ROTATE_USER_AGENT` | `true` | 是否轮换User-Agent |\n\n### 网络配置\n\n| 配置项 | 环境变量 | 默认值 | 说明 |\n|--------|----------|--------|------|\n| 超时时间 | `NETWORK_TIMEOUT` | `30` | 网络请求超时（秒） |\n| 重试次数 | `RETRY_TIMES` | `3` | 失败重试次数 |\n| 重试延迟 | `RETRY_DELAY` | `5-15` | 重试间隔（秒） |\n| 频率限制 | `RATE_LIMIT` | `10` | 请求频率（次/分钟） |\n\n### 通知配置\n\n| 配置项 | 环境变量 | 默认值 | 说明 |\n|--------|----------|--------|------|\n| 通知开关 | `NOTIFICATION_ENABLED` | `true` | 是否启用通知 |\n| 包含统计 | `INCLUDE_STATISTICS` | `true` | 是否包含详细统计 |\n\n**注意：通知配置采用多通道模式，支持同时启用多个通知服务**\n\n| 通知服务 | 配置参数 | 环境变量 | 说明 |\n|---------|---------|----------|------|\n| PushPlus | `token` | `PUSHPLUS_TOKEN` | PushPlus推送token |\n| Telegram | `bot_token` | `TELEGRAM_BOT_TOKEN` | Telegram机器人token |\n| | `chat_id` | `TELEGRAM_CHAT_ID` | Telegram聊天ID |\n| | `proxy.http` | `HTTP_PROXY` | HTTP代理地址 |\n| | `proxy.https` | `HTTPS_PROXY` | HTTPS代理地址 |\n| WxPusher | `spt` | `WXPUSHER_SPT` | WxPusher SPT |\n| Apprise | `url` | `APPRISE_URL` | Apprise通知URL |\n| Bark | `server` | `BARK_SERVER` | Bark推送服务器地址 |\n| | `device_key` | `BARK_DEVICE_KEY` | Bark设备密钥 |\n| | `sound` | `BARK_SOUND` | Bark通知音效 |\n| Ntfy | `server` | `NTFY_SERVER` | Ntfy服务器地址 |\n| | `topic` | `NTFY_TOPIC` | Ntfy推送主题 |\n| | `token` | `NTFY_TOKEN` | Ntfy访问令牌（可选） |\n| 飞书 | `webhook_url` | `FEISHU_WEBHOOK_URL` | 飞书机器人Webhook URL |\n| | `msg_type` | `FEISHU_MSG_TYPE` | 消息类型：text/rich_text |\n| 企业微信 | `webhook_url` | `WEWORK_WEBHOOK_URL` | 企业微信机器人Webhook URL |\n| | `msg_type` | `WEWORK_MSG_TYPE` | 消息类型：text/markdown/news |\n| 钉钉 | `webhook_url` | `DINGTALK_WEBHOOK_URL` | 钉钉机器人Webhook URL |\n| | `msg_type` | `DINGTALK_MSG_TYPE` | 消息类型：text/markdown/link |\n| Gotify | `server` | `GOTIFY_SERVER` | Gotify服务器地址 |\n| | `token` | `GOTIFY_TOKEN` | Gotify应用令牌 |\n| | `priority` | `GOTIFY_PRIORITY` | 消息优先级（1-10） |\n| | `title` | `GOTIFY_TITLE` | 消息标题 |\n\n### 通知方式详细说明\n\n#### PushPlus\n- 获取方式：访问 [pushplus.plus](https://www.pushplus.plus/) 注册获取token\n- 配置：设置 `PUSHPLUS_TOKEN` 环境变量\n\n#### Telegram\n- 获取方式：\n  1. 与 @BotFather 对话创建机器人获取 bot_token\n  2. 与 @userinfobot 对话获取 chat_id\n- 配置：设置 `TELEGRAM_BOT_TOKEN` 和 `TELEGRAM_CHAT_ID`\n- 代理：支持HTTP/HTTPS代理\n\n#### WxPusher\n- 获取方式：访问 [wxpusher.zjiecode.com](https://wxpusher.zjiecode.com/) 获取SPT\n- 配置：设置 `WXPUSHER_SPT` 环境变量\n\n#### Apprise（支持多种服务）\n- 支持：Discord、Slack、Email、企业微信等数十种服务\n- 配置：设置 `APPRISE_URL`，格式如：\n  - Discord: `discord://webhook_id/webhook_token`\n  - Email: `mailto://user:pass@domain.com`\n  - 更多格式见：[Apprise文档](https://github.com/caronc/apprise)\n\n#### Bark（iOS推送）\n- 获取方式：iOS App Store下载Bark应用，获取设备Key\n- 配置：设置 `BARK_SERVER`（默认：https://api.day.app）和 `BARK_DEVICE_KEY`\n- 音效：可选设置 `BARK_SOUND`\n\n#### Ntfy（开源推送）\n- 获取方式：使用公共服务 [ntfy.sh](https://ntfy.sh) 或自建服务\n- 配置：设置 `NTFY_SERVER` 和 `NTFY_TOPIC`\n- 私有主题：可选设置 `NTFY_TOKEN`\n\n#### 飞书（Lark）\n- 获取方式：\n  1. 在飞书群聊中添加机器人\n  2. 选择\"自定义机器人\"\n  3. 获取Webhook URL\n- 配置：设置 `FEISHU_WEBHOOK_URL`\n- 消息格式：支持 `text`（纯文本）和 `rich_text`（富文本）\n- 示例：`https://open.feishu.cn/open-apis/bot/v2/hook/your_webhook_token`\n\n#### 企业微信\n- 获取方式：\n  1. 在企业微信群聊中添加机器人\n  2. 选择\"自定义机器人\"\n  3. 获取Webhook URL\n- 配置：设置 `WEWORK_WEBHOOK_URL`\n- 消息格式：支持 `text`（纯文本）、`markdown`（Markdown格式）、`news`（图文消息）\n- 示例：`https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=your_webhook_key`\n\n#### 钉钉\n- 获取方式：\n  1. 在钉钉群聊中添加机器人\n  2. 选择\"自定义机器人\"\n  3. 获取Webhook URL\n- 配置：设置 `DINGTALK_WEBHOOK_URL`\n- 消息格式：支持 `text`（纯文本）、`markdown`（Markdown格式）、`link`（链接消息）\n- 示例：`https://oapi.dingtalk.com/robot/send?access_token=your_access_token`\n\n#### Gotify（开源推送服务）\n- 获取方式：\n  1. 部署 Gotify 服务器（自建或使用公共服务）\n  2. 创建应用并获取应用令牌\n  3. 配置服务器地址和令牌\n- 配置：设置 `GOTIFY_SERVER` 和 `GOTIFY_TOKEN`\n- 优先级：可选设置 `GOTIFY_PRIORITY`（1-10，数字越大优先级越高）\n- 标题：可选设置 `GOTIFY_TITLE` 自定义消息标题\n- 示例：`https://gotify.example.com` + `your_app_token`\n- 官网：https://gotify.net/\n\n### 定时任务配置（scheduled模式）\n| 配置项 | 环境变量 | 默认值 | 说明 |\n|--------|----------|--------|------|\n| 定时开关 | `SCHEDULE_ENABLED` | `false` | 是否启用定时任务 |\n| Cron表达式 | `CRON_EXPRESSION` | `0 */2 * * *` | 定时执行表达式 |\n| 时区 | `TIMEZONE` | `Asia/Shanghai` | 时区设置 |\n\n### 守护进程配置（daemon模式）\n| 配置项 | 环境变量 | 默认值 | 说明 |\n|--------|----------|--------|------|\n| 守护进程开关 | `DAEMON_ENABLED` | `false` | 是否启用守护进程 |\n| 会话间隔 | `SESSION_INTERVAL` | `120-180` | 会话间隔时间（分钟） |\n| 每日最大会话数 | `MAX_DAILY_SESSIONS` | `12` | 每日最大执行次数 |\n\n## 运行模式详解\n\n### 1. 立即执行模式 (immediate)\n```bash\npython weread-bot.py\n# 或\npython weread-bot.py --mode immediate\n```\n- 程序启动后立即开始一次阅读会话\n- 完成目标时长后自动退出\n- 适合单次使用或手动控制\n\n### 2. 定时执行模式 (scheduled)\n```bash\npython weread-bot.py --mode scheduled\n```\n配置定时任务：\n```yaml\nschedule:\n  enabled: true\n  cron_expression: \"0 */2 * * *\"    # 每2小时执行一次\n  timezone: \"Asia/Shanghai\"\n```\n支持的cron表达式示例：\n- `\"0 */2 * * *\"` - 每2小时执行一次\n- `\"30 9 * * *\"` - 每天9:30执行\n- `\"0 * * * *\"` - 每小时执行\n- `\"0 9,18 * * *\"` - 每天9点和18点执行\n\n### 3. 守护进程模式 (daemon)\n\n```bash\npython weread-bot.py --mode daemon\n```\n\n配置守护进程：\n```yaml\ndaemon:\n  enabled: true\n  session_interval: \"120-180\"       # 会话间隔2-3小时随机\n  max_daily_sessions: 12            # 每天最多12次会话\n```\n\n- 程序持续运行，自动管理会话间隔\n- 支持每日会话次数限制\n- 自动处理跨天重置\n- 支持优雅关闭（Ctrl+C）\n\n## 阅读模式详解\n\n### 1. 智能随机模式 (smart_random)\n\n```yaml\nreading:\n  mode: \"smart_random\"\n  smart_random:\n    book_continuity: 0.8          # 80%概率继续当前书籍\n    chapter_continuity: 0.7       # 70%概率顺序阅读章节\n    book_switch_cooldown: 300     # 换书冷却5分钟\n```\n\n- 模拟真实用户的阅读习惯\n- 倾向于连续阅读同一本书的连续章节\n- 偶尔随机跳转到其他书籍或章节\n- 有换书冷却机制，避免频繁切换\n\n### 2. 顺序阅读模式 (sequential)\n\n```yaml\nreading:\n  mode: \"sequential\"\n```\n\n- 按配置的书籍和章节顺序依次阅读\n- 读完一本书后自动切换到下一本\n- 最符合正常阅读逻辑\n\n### 3. 纯随机模式 (pure_random)\n\n```yaml\nreading:\n  mode: \"pure_random\"\n```\n\n- 完全随机选择书籍和章节\n- 每次请求都可能跳转到不同位置\n- 最大化随机性，但可能不够自然\n\n## 统计报告示例\n\n### 单用户统计报告\n\n```\n📊 微信读书自动阅读统计报告\n\n👤 用户: 用户1\n⏰ 开始时间: 2024-01-15 09:30:15\n⏱️ 实际阅读: 65分32秒\n🎯 目标时长: 65分钟\n✅ 成功请求: 328次\n❌ 失败请求: 5次\n📈 成功率: 98.5%\n📚 阅读书籍: 3本\n📄 阅读章节: 28个\n☕ 休息次数: 12次 (共1256秒)\n🚀 平均响应: 1.23秒\n\n🎉 本次阅读任务完成！\n```\n\n### 多用户统计报告\n\n```\n🎭 多用户阅读会话总结\n\n👥 用户统计:\n  📊 总用户数: 3\n  ✅ 成功用户: 2 (用户1, 用户3)\n  ❌ 失败用户: 1 (用户2)\n\n📖 阅读统计:\n  ⏱️ 总阅读时长: 128分45秒\n  ✅ 总成功请求: 652次\n  ❌ 总失败请求: 12次\n  📈 整体成功率: 98.2%\n\n🎉 多用户阅读任务完成！\n```\n\n## 抓包配置详解\n\n### 获取CURL命令步骤\n\n1. **打开微信读书网页版**：https://weread.qq.com/\n2. **登录账号**：确保已登录微信读书账号\n3. **开始阅读**：找一本书开始阅读\n4. **打开开发者工具**：按F12或右或者浏览器菜单选择“开发者工具”\n5. **翻页**：在阅读页面翻页，模拟正常阅读行为\n6. **查找请求**：\n   - 切换到 Network（网络）标签\n   - 在过滤器中输入 `read`\n   - 继续翻页，找到 `https://weread.qq.com/web/book/read` 请求\n7. **复制CURL**：\n   - 右键该请求\n   - 选择 `Copy` → `Copy as cURL (bash)`\n8. **保存配置**：将复制的内容保存为环境变量或文件\n\n### 智能数据提取\n\n程序会自动从CURL命令中提取：\n- **Headers**：包括 User-Agent、Content-Type、Referer 等\n- **Cookies**：包括认证相关的 wr_skey、wr_vid 等\n- **请求数据**：包括 appId、书籍ID、章节ID 等真实参数\n\n**示例CURL命令结构**：\n\n```bash\ncurl 'https://weread.qq.com/web/book/read' \\\n  -H 'accept: application/json, text/plain, */*' \\\n  -H 'accept-language: zh-CN,zh;q=0.9,en;q=0.8' \\\n  -H 'content-type: application/json;charset=UTF-8' \\\n  -H 'cookie: wr_skey=s_abc123; wr_vid=12345678; ...' \\\n  -H 'origin: https://weread.qq.com' \\\n  -H 'referer: https://weread.qq.com/web/reader/...' \\\n  -H 'user-agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) ...' \\\n  --data-raw '{\"appId\":\"wb987654321098h765432109\",\"b\":\"a1b2c3d4e5f6g7h8i9j0k1l\",\"c\":\"m2n3o4p5q6r7s8t9u0v1w2x\",\"ci\":60,\"co\":123,\"sm\":\"[插图]示例阅读内容\",\"pr\":65,\"rt\":88,\"ts\":1234567890123,\"rn\":114,\"sg\":\"abc123def456ghi789jkl012mno345pqr678stu901vwx234yz567890abcdef12\",\"ct\":1234567890,\"ps\":\"xxxxxxxxxxxxxxxxxxxxxxxx\",\"pc\":\"xxxxxxxxxxxxxxxxxxxxxxxx\",\"s\":\"abc12345\"}'\n```\n\n### 配置方式选择\n\n**方式1：环境变量（推荐）**\n\n```bash\nexport WEREAD_CURL_STRING=\"curl 'https://weread.qq.com/web/book/read' ...\"\n```\n\n**方式2：文件存储**\n\n```bash\n# 保存CURL命令到文件\necho \"curl 'https://weread.qq.com/web/book/read' ...\" \u003e curl_command.txt\nexport WEREAD_CURL_BASH_FILE_PATH=\"curl_command.txt\"\n```\n\n**方式3：配置文件**\n\n```yaml\ncurl_config:\n  file_path: \"curl_command.txt\"\n```\n\n### 数据提取验证\n\n程序启动时会显示提取结果：\n\n```text\n✅ 已从环境变量加载CURL配置\n✅ 已使用CURL中的请求数据，包含字段: ['appId', 'b', 'c', 'ci', 'co', 'sm', 'pr', 'rt', 'ts', 'rn', 'sg', 'ct', 'ps', 'pc', 's']\n✅ 使用CURL数据作为阅读起点: 书籍 ce032b305a9bc1ce0b0dd2a, 章节 2a3327002582a38a4a932bf\n```\n\n## Docker部署\n\n### 运行\n\n```bash\n# 运行容器（环境变量方式）\ndocker run -d \\\n  -e TZ=\"Asia/Shanghai\" \\\n  -e WEREAD_CURL_STRING=\"your_curl_here\" \\\n  -e TARGET_DURATION=\"60-70\" \\\n  -e PUSHPLUS_TOKEN=\"your_token\" \\\n  --name weread-bot \\\n  funnyzak/weread-bot\n\n# 运行容器（配置文件方式）\ndocker run -d \\\n  -e TZ=\"Asia/Shanghai\" \\\n  -v $(pwd)/config.yaml:/app/config.yaml \\\n  -v $(pwd)/curl_command.txt:/app/curl_command.txt \\\n  -v $(pwd)/logs:/app/logs \\\n  --name weread-bot \\\n  funnyzak/weread-bot\n\n# 守护进程模式\ndocker run -d \\\n  -e TZ=\"Asia/Shanghai\" \\\n  -e WEREAD_CURL_STRING=\"your_curl_here\" \\\n  -e STARTUP_MODE=\"daemon\" \\\n  --name weread-daemon \\\n  funnyzak/weread-bot\n\n# 查看日志\ndocker logs -f weread-bot\n```\n\n### Docker Compose\n\n```yaml\nversion: '3.8'\nservices:\n  weread-bot:\n    image: funnyzak/weread-bot:latest\n    container_name: weread-bot\n    environment:\n      - TZ=Asia/Shanghai\n    volumes:\n      - ./logs:/app/logs\n      - ./config.yaml:/app/config.yaml:ro\n      - ./curl_command.txt:/app/curl_command.txt:ro\n    restart: unless-stopped\n```\n\n运行：\n\n```bash\n\n# 启动服务\ndocker-compose up -d\n\n# 查看日志\ndocker-compose logs -f\n```\n\n## 高级功能\n\n### 1. 多用户会话管理\n\n```yaml\n# 多用户配置结构\ncurl_config:\n  users:\n    - name: \"用户1\"                    # 用户标识名称\n      file_path: \"user1_curl.txt\"      # 用户专属的CURL文件路径\n      reading_overrides:               # 用户特定的阅读参数覆盖（可选）\n        target_duration: \"45-90\"       # 阅读时长\n        mode: \"smart_random\"           # 阅读模式\n        reading_interval: \"30-48\"      # 阅读间隔\n        use_curl_data_first: true      # 是否优先使用CURL数据\n        fallback_to_config: true       # 是否回退到配置数据\n    \n    - name: \"用户2\"\n      file_path: \"user2_curl.txt\"\n      reading_overrides:\n        target_duration: \"30-60\"\n        mode: \"sequential\"\n        reading_interval: \"25-35\"\n```\n\n**多用户执行特性：**\n\n- **顺序执行**：用户按配置顺序依次执行，避免同时请求\n- **用户间隔**：每个用户完成后有30-60秒的间隔延迟\n- **独立配置**：每个用户可以有不同的阅读策略和时长\n- **错误隔离**：单个用户失败不影响其他用户执行\n- **统计汇总**：提供单用户和多用户的详细统计报告\n\n**配置覆盖优先级：**\n\n1. **用户特定配置** (`reading_overrides`) - 最高优先级\n2. **全局配置** (`reading`) - 默认配置  \n3. **程序默认值** - 最低优先级\n\n### 2. 智能书籍管理\n\n```yaml\nreading:\n  # 书籍配置列表\n  # 章节索引优先级：配置的索引值 \u003e 自动计算的索引 \u003e CURL提取的值\n  books:\n    - name: \"深度工作\"                    # 书籍名称\n      book_id: \"book_id_1\"               # 书籍ID\n      chapters:                          # 章节配置，支持新旧两种格式\n        # 新格式：包含章节ID和可选的章节索引（推荐）\n        - chapter_id: \"chapter_1\"\n          chapter_index: 60              # 可选：微信读书官方章节索引ID\n        - chapter_id: \"chapter_2\"\n          chapter_index: 61              # 可选：微信读书官方章节索引ID\n        # 旧格式：只有章节ID（向后兼容）\n        - \"chapter_3\"                    # 兼容旧格式，章节索引将自动计算或从CURL提取\n    \n    - name: \"原则\"\n      book_id: \"book_id_2\"\n      chapters:\n        # 也可以使用简化的字段名\n        - id: \"chapter_a\"\n          index: 25                      # 使用简化字段名\n        # 混合使用新旧格式\n        - \"chapter_b\"                    # 旧格式\n  \n  # 智能随机策略\n  smart_random:\n    book_continuity: 0.8          # 书籍连续性\n    chapter_continuity: 0.7       # 章节连续性\n    book_switch_cooldown: 300     # 换书冷却\n```\n\n#### 章节索引配置说明\n\n**什么是章节索引（ci）？**\n- 章节索引是微信读书为每个章节分配的专有数字标识符\n- 与章节ID（c）不同，章节索引通常是连续的数字（如：60, 61, 62...）\n\n**配置格式：**\n1. **新格式（推荐）**：包含章节ID和可选的章节索引\n   ```yaml\n   - chapter_id: \"9bf32f301f9bf31c7ff0a60\"\n     chapter_index: 60\n   ```\n   或使用简化字段名：\n   ```yaml\n   - id: \"9bf32f301f9bf31c7ff0a60\"\n     index: 60\n   ```\n\n2. **旧格式（兼容）**：只有章节ID字符串\n   ```yaml\n   - \"9bf32f301f9bf31c7ff0a60\"\n   ```\n\n**章节索引优先级：**\n1. **配置的索引值**：在配置文件中明确指定的 `chapter_index` 或 `index`\n2. **自动计算的索引**：章节在配置列表中的位置（从0开始）\n3. **CURL提取的值**：从抓取的CURL命令中提取的 `ci` 值\n\n**如何获取章节索引？**\n1. 在微信读书网页版翻页时，查看Network请求中的 `ci` 字段值\n2. 不同章节的 `ci` 值通常是连续递增的数字\n\n### 3. 高级网络配置\n\n```yaml\nnetwork:\n  timeout: 30                     # 请求超时\n  retry_times: 3                  # 重试次数\n  retry_delay: \"5-15\"            # 重试延迟\n  rate_limit: 10                 # 频率限制（请求/分钟）\n```\n\n### 4. 多平台通知支持\n\n```yaml\nnotification:\n  enabled: true\n  include_statistics: true       # 包含详细统计\n  \n  # 通知通道配置（支持多个通道同时使用）\n  channels:\n    # 通道1：PushPlus\n    - name: \"pushplus\"\n      enabled: true\n      config:\n        token: \"${PUSHPLUS_TOKEN}\"\n    \n    # 通道2：Telegram\n    - name: \"telegram\"\n      enabled: true\n      config:\n        bot_token: \"${TELEGRAM_BOT_TOKEN}\"\n        chat_id: \"${TELEGRAM_CHAT_ID}\"\n        proxy:\n          http: \"${HTTP_PROXY}\"\n          https: \"${HTTPS_PROXY}\"\n    \n    # 通道3：WxPusher\n    - name: \"wxpusher\"\n      enabled: false\n      config:\n        spt: \"${WXPUSHER_SPT}\"\n    \n    # 通道4：Apprise\n    - name: \"apprise\"\n      enabled: false\n      config:\n        # Apprise通知URL，支持多种服务（如Discord、Slack、Email等）\n        # 示例：discord://webhook_id/webhook_token\n        # 示例：mailto://user:pass@domain.com\n        # 详见：https://github.com/caronc/apprise\n        url: \"${APPRISE_URL}\"\n    \n    # 通道5：Bark\n    - name: \"bark\"\n      enabled: false\n      config:\n        # Bark服务器地址\n        server: \"${BARK_SERVER}\"     # 如：https://api.day.app\n        # 设备Key\n        device_key: \"${BARK_DEVICE_KEY}\"\n        # 通知音效（可选）\n        sound: \"${BARK_SOUND}\"\n    \n    # 通道6：Ntfy\n    - name: \"ntfy\"\n      enabled: false\n      config:\n        # Ntfy服务器地址（默认：https://ntfy.sh）\n        server: \"${NTFY_SERVER}\"     # 如：https://ntfy.sh\n        # 主题名称\n        topic: \"${NTFY_TOPIC}\"\n        # 访问令牌（可选，用于私有主题）\n        token: \"${NTFY_TOKEN}\"\n    \n    # 通道7：飞书\n    - name: \"feishu\"\n      enabled: false\n      config:\n        # 飞书机器人Webhook URL\n        webhook_url: \"${FEISHU_WEBHOOK_URL}\"\n        # 消息类型：text(纯文本), rich_text(富文本)\n        msg_type: \"text\"\n    \n    # 通道8：企业微信\n    - name: \"wework\"\n      enabled: false\n      config:\n        # 企业微信机器人Webhook URL\n        webhook_url: \"${WEWORK_WEBHOOK_URL}\"\n        # 消息类型：text(纯文本), markdown(Markdown), news(图文)\n        msg_type: \"text\"\n    \n    # 通道9：钉钉\n    - name: \"dingtalk\"\n      enabled: false\n      config:\n        # 钉钉机器人Webhook URL\n        webhook_url: \"${DINGTALK_WEBHOOK_URL}\"\n        # 消息类型：text(纯文本), markdown(Markdown), link(链接)\n        msg_type: \"text\"\n    \n    # 通道10：Gotify\n    - name: \"gotify\"\n      enabled: false\n      config:\n        # Gotify服务器地址\n        server: \"${GOTIFY_SERVER}\"     # 如：https://gotify.example.com\n        # 应用令牌\n        token: \"${GOTIFY_TOKEN}\"\n        # 消息优先级（1-10，数字越大优先级越高）\n        priority: \"${GOTIFY_PRIORITY}\"\n        # 消息标题（可选）\n        title: \"${GOTIFY_TITLE}\"\n```\n\n## 微信读书API字段说明\n\n程序会自动从CURL命令中提取并处理这些字段，无需手动配置：\n\n| 字段 | 示例值 | 说明 | 处理方式 |\n|------|--------|------|----------|\n| `appId` | `\"wb115321887466h953405538\"` | 应用唯一标识符 | 从CURL提取，保持不变 |\n| `b` | `\"241325c071f385dd2417ff2\"` | 书籍ID | 智能管理，支持多书籍切换 |\n| `c` | `\"02e32f0021b02e74f10ece8\"` | 章节ID | 智能管理，支持章节跳转 |\n| `ci` | `60` | 章节索引 | 智能管理，支持配置和自动计算 |\n| `co` | `336` | 内容位置/页码 | 从CURL提取，保持不变 |\n| `sm` | `\"2　开启你的专注之路有一篇名为《算术\"` | 当前阅读内容摘要 | 从CURL提取，保持不变 |\n| `pr` | `65` | 页码/段落索引 | 从CURL提取，保持不变 |\n| `rt` | `88` | 阅读时长（秒） | 动态计算，模拟真实阅读时间 |\n| `ts` | `1727580815581` | 时间戳（毫秒） | 动态生成，包含随机偏移 |\n| `rn` | `114` | 随机数/请求编号 | 动态生成随机数 |\n| `sg` | `\"bfdf7de...e22e724\"` | 安全签名 | 动态计算SHA256签名 |\n| `ct` | `1727580815` | 时间戳（秒） | 动态生成当前时间 |\n| `ps` | `\"xxxxxxxx\"` | 用户标识符 | 从CURL提取，保持不变 |\n| `pc` | `\"xxxxxxxx\"` | 设备标识符 | 从CURL提取，保持不变 |\n| `s` | `\"fadcb9de\"` | 数据校验和 | 动态计算哈希值 |\n\n### 安全机制\n- **签名算法**：使用时间戳、随机数和密钥生成SHA256签名\n- **数据校验**：通过特定算法计算请求数据的校验和\n- **时间同步**：动态生成符合服务器要求的时间戳\n- **Cookie管理**：自动刷新和维护认证Cookie\n\n## 常见问题\n\n### Q: 如何防止被微信识别为机器人？\n\n**A: 内置多层防检测机制：**\n- **启动延迟**：60-120秒随机延迟，避免批量启动特征\n- **阅读速度变化**：每30秒调整阅读速度（0.8-1.3倍）\n- **中途休息**：15%概率随机休息30-180秒\n- **智能换书**：基于概率的书籍和章节切换\n- **时间戳随机化**：请求时间包含随机偏移\n- **Cookie自动刷新**：维护有效的认证状态\n\n### Q: 程序运行多长时间？\n\n**A: 灵活的时长控制：**\n- **默认时长**：60-70分钟随机选择\n- **自定义区间**：支持如`\"60-120\"`的区间配置\n- **智能完成**：达到目标时长后自动停止\n- **守护模式**：可设置每日最大会话数和间隔时间\n\n### Q: 如何查看运行状态？\n**A: 多种监控方式：**\n- **实时日志**：详细的运行过程日志\n- **进度显示**：当前阅读进度和剩余时间\n- **统计报告**：完成后的详细统计信息\n- **推送通知**：支持多平台消息推送\n- **日志文件**：保存在`logs/weread.log`\n\n\n### Q: 程序报错\"Cookie刷新失败\"？\n**A: Cookie问题解决：**\n- 重新获取最新的CURL命令\n- 确保微信读书账号未过期\n- 检查网络连接是否正常\n- 尝试重启程序让Cookie自动刷新\n\n### Q: 支持多账号同时运行吗？\n\n**A: 支持多用户模式，顺序执行多个账号：**\n```yaml\n# 多用户配置方式\ncurl_config:\n  users:\n    - name: \"账号1\"\n      file_path: \"account1_curl.txt\"\n      reading_overrides:\n        target_duration: \"45-90\"\n    - name: \"账号2\"  \n      file_path: \"account2_curl.txt\"\n      reading_overrides:\n        target_duration: \"30-60\"\n```\n\n**执行特点：**\n- 按配置顺序依次执行，避免同时请求\n- 每个账号完成后有30-60秒间隔延迟\n- 单个账号失败不影响其他账号\n- 提供详细的多用户统计报告\n\n**传统方式（并行运行）：**\n```bash\n# 方法1：多个配置文件\npython weread-bot.py --config account1.yaml\npython weread-bot.py --config account2.yaml\n```\n\n### Q: 多用户模式总执行时间是多少？\n**A: 执行时间计算：**\n- **总时间** = 所有用户阅读时长之和 + 用户间隔延迟\n- **示例**：3个用户，每个60分钟，间隔45秒\n  - 总时间 ≈ 180分钟 + 1.5分钟 = 181.5分钟\n- **优化建议**：合理设置每个用户的阅读时长，避免总时间过长\n- **说明**：总体是依次执行，不是并行执行，避免单次大量请求被识别异常\n\n### Q: 某个用户失败了怎么办？\n**A: 错误处理机制：**\n- **错误隔离**：单个用户失败不影响其他用户执行\n- **详细日志**：记录每个用户的执行状态和错误信息\n- **继续执行**：失败用户跳过，继续执行下一个用户\n- **统计报告**：最终报告中显示成功和失败的用户列表\n\n### Q: 如何调整阅读策略更自然？\n**A: 策略优化建议：**\n```yaml\n# 更保守的策略\nhuman_simulation:\n  break_probability: 0.2        # 增加休息频率\n  break_duration: \"60-300\"      # 延长休息时间\nreading:\n  target_duration: \"45-90\"      # 缩短单次时长\n  smart_random:\n    book_continuity: 0.9        # 提高书籍连续性\n    chapter_continuity: 0.8     # 提高章节连续性\n```\n\n## 性能优化建议\n\n### 1. 网络优化\n```yaml\nnetwork:\n  timeout: 30              # 根据网络情况调整\n  retry_times: 3           # 网络不稳定时增加重试\n  retry_delay: \"5-15\"      # 重试间隔\n  rate_limit: 8            # 降低请求频率更安全\n```\n\n### 2. 行为优化\n```yaml\nhuman_simulation:\n  break_probability: 0.2   # 提高休息频率\n  break_duration: \"60-300\" # 延长休息时间\n  reading_speed_variation: true\n```\n\n### 3. 时长策略\n```yaml\nreading:\n  target_duration: \"60-90\"   # 较短时长更安全\n  reading_interval: \"30-45\"  # 增加请求间隔\n```\n\n## 安全建议\n\n1. **不要分享CURL命令**：包含个人认证信息\n2. **定期更新**：Cookie会过期，需要重新获取\n3. **适度使用**：避免过度频繁的阅读行为\n4. **监控日志**：关注异常和错误信息\n5. **备份配置**：保存有效的配置文件\n\n## 鸣谢\n\n特别感谢以下项目提供的实现参考：\n\n- https://github.com/findmover/wxread\n\n## 免责声明\n\n本项目仅供学习和研究目的，不得用于任何商业活动。用户在使用本项目时应遵守所在地区的法律法规，对于违法使用所导致的后果，本项目及作者不承担任何责任。 本项目可能存在未知的缺陷和风险（包括但不限于账号封禁等），使用者应自行承担使用本项目所产生的所有风险及责任。 作者不保证本项目的准确性、完整性、及时性、可靠性，也不承担任何因使用本项目而产生的任何损失或损害责任。 使用本项目即表示您已阅读并同意本免责声明的全部内容。\n\n## 许可证\n\nMIT License\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ffunnyzak%2Fweread-bot","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ffunnyzak%2Fweread-bot","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ffunnyzak%2Fweread-bot/lists"}