MIT License

技术解读

以下内容由 GitRead 中文社区 编辑团队基于项目 README 与官方资料整理, 结合中文开发者的常见使用场景补充技术选型建议。具体以项目官方文档为准。

把「每日签到」交给机器:Daily-Bonus 的多站点签到工程实践

项目背景与痛点

签到脚本这个品类看起来很小,却精准命中了一处很实际的矛盾:不少社区把「每日签到」设计成活跃度指标,用户为了维持等级、积分、铜币或下载额度,不得不每天打开五六个站点重复点击。这件事本身不产生任何信息增量,却长期占用注意力。

Daily-Bonus 解决的并不是单个站点的自动化,而是把散落在不同认证方式、不同接口形态下的签到行为收拢进同一个执行单元:赛马娘网页签到、V2EX、Bilibili、百合会、Yurifans、哔咔漫画。它们的共性是:都依赖登录态(Cookie / Token),都以「每日一次」为幂等单位,都能用一次 HTTP 请求完成;差异在于接口形态——有的是标准 REST API,有的需要解析 HTML 页面,有的要模拟 App 请求体。

真正难的地方在运维面:GitHub Actions 的 cron 是「尽力而为」,高峰期可能延迟甚至跳过;公共仓库的 workflow 在长期无提交后会被自动禁用;Secrets 里的 Cookie 会静默过期。这些构成了典型的「看起来跑通了,其实早就失败了」场景。所以这个项目的工程重点不在签到请求本身,而在可观测性与失效告警。

核心技术揭秘

整体上,它是一个轻量的任务编排器 + 一组站点适配器。分层大致为:入口层(Actions workflow 触发主函数)、配置层(从环境变量/Secrets 注入凭据)、适配层(每站点一个 handler)、结果层(统一收集成败并推送通知)。

graph TD A[GitHub Actions 定时触发] --> B[入口调度器] B --> C[读取 Secrets 中的 Cookie 与 Token] C --> D{"按站点分发任务"} D -->|"Bilibili"| E[调用签到接口] D -->|"V2EX"| F[领取每日铜币] D -->|"百合会 / Yurifans"| G[页面签到解析] D -->|"哔咔漫画"| H[模拟 App 接口] E --> I[解析响应判定成败] F --> I G --> I H --> I I --> J{"Cookie 是否失效"} J -->|"失效"| K[标记需人工更新] J -->|"有效"| L[记录签到结果] K --> M[聚合推送通知] L --> M

几个值得注意的设计取向:

凭据与代码彻底分离。 所有 Cookie、Token 走环境变量注入,仓库里不留明文。这是这类脚本能被公开分享的前提,也决定了它必须依赖 CI 的 Secrets 部署,而不是本地配置文件。

以「站点」为粒度的插件化。 每个站点的签到逻辑相互独立,新增站点只需加一个 handler 并在调度处注册,主流程不感知具体协议。这种写法牺牲了一点抽象的优雅,换来的是极高的可读性和极低的贡献门槛——对社区项目而言,这是正确的取舍。

结果聚合而非逐条报错。 单站点失败不该中断整轮执行,合理做法是统一捕获异常、记录状态码与返回文案,最后汇总成一条通知。你在手机上看到的应是「6 个站点中 4 成功、2 失败(Cookie 过期)」,而不是一片刷屏日志。

幂等与重试的边界。 签到大多是写操作,重复调用可能触发风控或返回「今日已签到」。正确策略是:业务层返回「已签到」即视为成功,不做盲目重试;网络层超时可做有限次重试,业务层失败则直接放弃。

功能亮点与差异

零基础设施。 不需要服务器、不需要常驻进程,Fork 后配置 Secrets 即可运行,边际成本近乎为零。这是相对「自建 crontab + 云主机」方案最直接的优势。

覆盖面有取舍。 它没有追求「支持几百个站点」,而是集中服务 ACG 与中文技术社区这一垂直圈层。接口适配质量,比数量更重要。

通知闭环。 签到脚本的价值不在于跑,而在于「跑失败了你知道」。把结果推送到即时通讯渠道,是把后台脚本升级为可运维系统的关键一步。

应用场景与落地建议

适合个人自用,不适合批量账号或任何形式的代签服务——那会直接踩到站点风控与用户协议。

落地注意四点:其一,仓库务必设为私有,公共仓库的 Actions 有活动度限制,且 workflow 日志对所有人可见,凭据暴露风险更高;其二,Cookie 有效期通常以周或月计,应配合通知做失效提醒,别等积分断了才发现;其三,cron 表达式留出冗余,别把执行时刻压在站点结算的临界点上;其四,访问频率要克制,同一出口 IP 短时间内打多个站点,容易被判为异常流量。

综合评价

优点清晰:结构扁平、易读易改、部署成本为零,覆盖了中文开发者日常高频的几个站点。它是一个「够用且好用」的工具,而不是一个平台。

局限同样明显:缺少统一的接口契约抽象,新增站点仍靠人工读接口;没有凭据自动续期能力,Cookie 过期只能靠人;对风控的应对是消极的(低频、固定 UA),站点一旦改版或加验证码,脚本随即失效;依赖 GitHub Actions 也意味着受制于第三方调度。

一句话总结:这是一份务实的自动化清单,用最小的工程复杂度换取稳定的日常收益。把它当作可维护的个人工具,而不是生产级系统,预期就对了。

简要分析

热度分
465
价值分
150
活跃状态
活跃

语言占比

Python

README

Daily-Bonus

GitHub stars GitHub forks GitHub issues

自动签到脚本,通过 GitHub Actions 定时执行,支持 Telegram 推送签到结果。

如果觉得有用,右上角点个 ⭐ Star 支持一下,感谢!

功能

站点 方式 奖励
V2EX Cookie 铜币
Bilibili Cookie 硬币
Yamibo(百合会 / 300) 账号密码 对象
Yurifans 账号密码 积分
赛马娘 Cookie 游戏内道具 + 积分
哔咔漫画 账号密码 经验
网易云音乐 Cookie 云贝签到
FF14 商城 账号密码 积分

⚠️ FF14 商城签到已废弃。SDO 登录接口接入了 Geetest 风控,脚本登录会触发滑块验证码,无法自动绕过。

⚠️ Yurifans 签到已废弃。站点接入雷池 WAF 人机验证,先弃用了(平时也不用这个网站…)。

Telegram 推送:

快速开始

  1. Fork 本仓库
  2. 添加环境变量:Settings → Secrets and variables → Actions → New repository secret
  3. 默认使用 GitHub-hosted runner(ubuntu-latest),北京时间每天 07:30 自动运行

更新:打开自己 fork 的仓库,点击 Sync fork → Update branch 即可同步

签到结果示例:

GitHub-hosted Self-hosted

Runner 说明

项目提供两个 workflow 文件:

文件 Runner 说明
checkin.yml ubuntu-latest fork 直接使用,无需额外配置
checkin-self-hosted.yml self-hosted 需自建 runner,纯 shell 步骤不依赖 action 下载

GitHub-hosted(ubuntu-latest)

Fork 后开箱即用。Yamibo 论坛有百度 WAF 防护,脚本通过 Playwright 解决 JS 挑战。

Self-hosted

适合需要本地网络环境的场景(例如 Yamibo 签到),使用 myoung34/docker-github-actions-runner 在本地启动 runner:

docker run -d \
  --name github-runner \
  --net=host \
  --platform linux/amd64 \
  --restart unless-stopped \
  -e ACCESS_TOKEN="<PAT>" \
  -e DEBUG_OUTPUT="true" \
  -e LABELS="self-hosted,linux" \
  -e REPO_URL="https://github.com/jckling/Daily-Bonus" \
  -e RUN_AS_ROOT="true" \
  -e RUNNER_NAME="local-runner" \
  -v /var/run/docker.sock:/var/run/docker.sock \
  -v runner_work:/_work \
  myoung34/github-runner:latest

需要修改的参数:

  • ACCESS_TOKEN:GitHub Personal Access Token
  • REPO_URL:fork 的仓库地址

问题排查

Self-hosted runner 卡住没有日志

检查容器能否连接 launch.actions.githubusercontent.com,国内网络可能无法直连。checkin-self-hosted.yml 已改为纯 shell 步骤(git clone + curl),不依赖 external action 下载。如仍有问题,给容器配置代理或使用 --net=host。

Yamibo 签到提示「页面被拦截」

Yamibo 启用了百度 WAF JS 挑战,curl_cffi 无法执行 JS 会返回 405。脚本通过 Playwright 启动 headless Chromium 解决挑战并提取 nox_jst_v1 cookie。GitHub-hosted runner 已内置 Playwright 浏览器安装步骤;self-hosted runner 需确保 Docker 容器内有 Chromium 运行依赖。

签到失败

在 Actions 页面点击 Re-run 重新运行即可。Cookie 可能过期,重新获取后更新 Secrets。

配置

在仓库 Settings → Secrets → Actions 中添加以下环境变量,按需配置:

Telegram 推送

Name Description
TG_BOT_TOKEN Bot Token,参考 How Do I Create a Bot?
TG_USER_ID 用户 ID,参考 How can I send a message to someone with my telegram bot using their Username

赛马娘网页签到

使用 Cookie 登录,需要 site、joy_jct、DedeUserID、SESSDATA

Name Description
UMA_COOKIES Cookie

V2EX

使用 Cookie 登录,需要 PB3_SESSION、A2、V2EX_LANG、V2EX_TAB

Name Description
V2EX_COOKIES Cookie

Yamibo

使用账号密码登录,通过 Playwright 解决百度 WAF JS 挑战

Name Description
YAMIBO_USERNAME 用户名
YAMIBO_PASSWORD 密码

Bilibili

使用 Cookie 登录,需要 SESSDATA、DedeUserID

Name Description
BILIBILI_COOKIES Cookie

哔咔漫画

Name Description
PICA_USERNAME 用户名或邮箱
PICA_PASSWORD 密码

网易云音乐

使用 Cookie 登录,需要 MUSIC_U,浏览器登录 music.163.com 获取

Name Description
NETEASE_MUSIC_COOKIES Cookie

开发环境

  • macOS (Apple Silicon, ARM64)
  • Python 3.13
  • uv(依赖管理)
  • curl_cffi(TLS 指纹伪装)
  • Playwright(WAF JS 挑战)
  • Chrome DevTools / HAR 抓包

致谢

许可证

MIT

评论

暂无评论