# juejin_checkin **Repository Path**: didiplus/juejin_checkin ## Basic Information - **Project Name**: juejin_checkin - **Description**: 基于 Playwright 的最小化签名方案:通过页面内 `fetch` 让 `webmssdk.js` SDK 自动注入 `a_bogus` / `msToken` / `X-Bogus` 等签名参数,无需逆向算法即可调用掘金成长体系 API - **Primary Language**: Unknown - **License**: AGPL-3.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-10-15 - **Last Updated**: 2026-10-16 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 掘金每日签到 + 抽奖 > 基于 Playwright 的最小化签名方案:通过页面内 `fetch` 让 `webmssdk.js` SDK 自动注入 `a_bogus` / `msToken` / `X-Bogus` 等签名参数,无需逆向算法即可调用掘金成长体系 API。 --- ## 功能特性 - **自动签到** — 每日签到领取矿石,失败自动重试 3 次 - **免费抽奖** — 签到后自动消耗免费抽奖次数(默认开启,可关闭) - **矿石查询** — 实时查询当前矿石余额 - **多账号** — 单配置管理多账号,账号间随机抖动防风控 - **邮件通知** — 签到结果以 HTML 邮件推送,模板基于 Jinja2 可自由定制 - **灵活调度** — 支持单次执行、常驻进程、crontab、systemd timer、Windows 任务计划 - **扫码登录** — 内置交互式登录导出 cookie,免去手动复制 ## 项目结构 ``` juejin_checkin/ ├── src/ # 核心模块 │ ├── config.py # 配置加载、常量、日志 │ ├── browser.py # Playwright 页面初始化 + SDK 注入 + 签名 fetch │ ├── api.py # 签到 / 抽奖 / 矿石查询 API 封装 │ ├── runner.py # 账号执行器(单次 / 登录) │ ├── scheduler.py # APScheduler 常驻调度 │ ├── notify.py # 邮件发送 + 报告生成(业务层) │ └── email_template.py # Jinja2 邮件模板渲染(展示层) ├── templates/ # 邮件 HTML 模板 │ ├── base.html # 基础骨架(样式 + 头尾) │ ├── checkin_report.html # 签到报告 │ └── test_email.html # 测试邮件 ├── main.py # CLI 入口 ├── config.json # 账号与邮件配置 ├── pyproject.toml # 项目依赖(uv/pip) ├── register_task.bat # Windows 任务计划注册 ├── register_cron.sh # Linux crontab 注册 ├── register_systemd.sh # Linux systemd timer 注册 └── checkin.log # 运行日志 ``` ## 快速开始 ### 1. 安装依赖 ```bash pip install -r requirements.txt playwright install chromium # Linux 额外安装系统依赖(需 sudo): playwright install-deps chromium ``` ### 2. 配置账号 编辑 `config.json`,填入账号信息: ```jsonc { "accounts": [ { "name": "主账号", "cookie": "sessionid=xxx; ...", // 浏览器 F12 → Application → Cookies 复制 "ua": "Mozilla/5.0 ..." // 真实 Chrome UA,避免 headless 风控 } ], "email": { "enabled": true, "smtp": { "host": "smtp.qq.com", "port": 465, "user": "you@qq.com", "password": "授权码", "from_addr": "you@qq.com", "to_addrs": ["you@qq.com"] } } } ``` > 不需要邮件通知时,将 `email.enabled` 设为 `false` 或删除 `email` 字段。 ### 3. 运行 ```bash # 签到 + 抽奖(所有账号,抽奖默认开启) python main.py once --all # 仅签到,不抽奖 python main.py once --all --no-lottery # 常驻调度,每日 06:00 自动执行签到 + 抽奖 python main.py schedule --all # 扫码登录导出 cookie(交互式,需有头浏览器) python main.py login --all # 测试邮件配置是否正确 python main.py test-email ``` ## 命令参考 | 命令 | 说明 | |------|------| | `once --all` | 执行所有账号(签到 + 抽奖) | | `once` | 仅执行第一个账号 | | `once --all --no-lottery` | 签到但不抽奖 | | `schedule --all` | 常驻进程,每日 06:00 触发 | | `login --all` | 扫码登录并导出 cookie | | `test-email` | 发送测试邮件验证 SMTP 配置 | ## 平台部署 | 平台 | 定时方式 | 命令 | |------|---------|------| | Windows | 任务计划 | 管理员运行 `register_task.bat`(每日 09:00) | | Linux | crontab | `chmod +x register_cron.sh && ./register_cron.sh` | | Linux | systemd timer | `sudo ./register_systemd.sh`(推荐:开机自启 + 错过补跑) | | 全平台 | 常驻进程 | `python main.py schedule --all` | ## 邮件模板定制 邮件 HTML 由 `templates/` 下的 Jinja2 模板渲染: - `base.html` 定义整体骨架、样式与页头页脚,子模板通过 `{% block body_content %}` 填充主体 - `checkin_report.html` 渲染签到报告(统计概览 + 各账号卡片) - `test_email.html` 渲染测试邮件 修改模板文件即可自定义样式与布局,无需改动 Python 代码。模板变量自动 HTML 转义,防注入。 ## 常见问题 | 现象 | 原因 | 解决 | |------|------|------| | `err_no=401` | 登录态失效 | 重新复制 cookie 到 `config.json` | | `err_no=15003` | 今日已签到 | 正常,无需处理 | | `err_no=2 请求路由不存在` | 请求方法不匹配 | 已修复,矿石查询走 GET | | `msToken 缺失` | Cookie 里没 msToken | 浏览器刷新掘金页面后重新复制 | | Headless 被风控 | UA 暴露 headless | `config.json` 里 `ua` 用真实 Chrome UA | ## 风控提示 - 每日 1 次即可,**不要短时间反复刷** - 多账号已加 5~15s 随机抖动,systemd 调度加 30 分钟抖动 - Cookie 有效期约 30 天,过期需重新复制 - 掘金 TOS 禁止自动化,使用后果自负