本文以 HDTime(hdtime.org)为例,手把手把「每天惦记着打开 PT 站点签到」这件事变成零操作、还能收到微信推送的自动化任务。方法同样适用于其他 NexusPHP 架构的 PT 站。
为什么要折腾这个
玩 PT 的朋友都知道,签到是门槛最低但最容易忘的事:
- 连续签到能攒魔力值、拿连续签到奖励;
- 忘了签到断了连续天数,奖励就得从头攒;
- 人一忙起来,”今天签了吗”永远想不起来。
人工签到需要:打开浏览器 → 登录 → 找到签到按钮 → 点一下。一年下来,这几十次点击完全可以省掉。我们要做的就是:让一台不停机的机器每天定时替你点这一下,点完再推条微信告诉你结果。
整体思路
青龙面板(定时器 + 运行环境)
│ 每天 08:00 触发
▼
签到脚本(Python / Node 任选)
│ 携带 Cookie 请求 https://hdtime.org/attendance.php
▼
签到成功 ──► WxPusher ──► 微信收到结果推送
三条主线:搭面板 → 配 Cookie → 配推送。下面按顺序来。
第一步:搭好青龙面板
青龙(QingLong)是一个开源的定时任务管理面板,Docker 一行命令就能跑起来:
docker run -d \
--name qinglong \
--restart unless-stopped \
-p 5700:5700 \
-v /docker/qinglong/data:/ql/data \
whyour/qinglong:latest
已经在 NAS(飞牛、群晖等)上跑着青龙的话,这步直接跳过。
启动后访问 http://NAS的IP:5700,按引导设置管理员账号密码进入面板。面板里我们只会用到四个地方:脚本管理、环境变量、定时任务、依赖管理。
第二步:获取脚本
脚本分两个版本,功能完全一样,任选其一:
| 版本 | 依赖 | 适合 |
|---|---|---|
hdtime_signin.py | 需要 requests | 想后续加代理、扩展功能的 |
hdtime_signin.js | 零依赖 | 想省事、面板上什么都不想装的 |
把脚本放进青龙的脚本目录(容器内 /ql/data/scripts/),或者直接在面板「脚本管理」里新建文件粘贴内容。
⚠️ 安全提示:这份脚本里硬编码了你的登录 Cookie 和 WxPusher token,等同于账号钥匙。不要传到公开仓库、不要发给别人。
第三步:拿到签到 Cookie(最关键的一步)
脚本本身没有魔法,它只是替你「带着你的登录态」去点签到。所以 Cookie 一定要拿对。
- 电脑浏览器打开 hdtime.org 并登录;
- 按
F12打开开发者工具,切到 Network(网络) 标签; - 按
F5刷新页面,点击列表里的第一个请求(一般就是hdtime.org); - 在右侧 Request Headers(请求标头) 里找到
Cookie:这一整行; - 完整复制它的值。
然后在脚本里找到这一段,把值替换进去:
DEFAULT_COOKIE = (
"*******&" # ← 前面是备注名,随意
"c_secure_uid=********; "
"c_secure_pass=xxxxxxxxxxxxxxxxxxxxxxxxxxxx; "
"c_secure_ssl=********; "
"c_secure_tracker_ssl=*******; "
"c_secure_login=********; "
"cf_clearance=xxxxxxxxxxxxxxxx" # ← 这个千万不能漏
)
不想改代码的话,也可以走环境变量:面板「环境变量」→ 新建 HDTIME_COOKIE,值直接粘贴完整 Cookie。环境变量优先级高于脚本内置值。
💡 脚本会自动清理粘贴时的常见杂质:
Cookie:前缀、换行、多余空格、结尾分号,都能处理。
第四步:先手动跑一次验证
面板「定时任务」→ 新建任务:
- 名称:
HDTime 签到 - 命令:
python3 hdtime_signin.py(Node 版写node hdtime_signin.js) - 定时规则:先随便设一个,比如
0 8 * * *
点「执行」,看日志。正常的话会看到类似输出:
[2026-09-25 14:30:01] 共解析到 1 个账号
[2026-09-25 14:30:01] ===== 开始处理:账号1 =====
[2026-09-25 14:30:02] 校验登录状态 ...
[2026-09-25 14:30:02] 登录有效,当前魔力值:2,401,386.7
[2026-09-25 14:30:02] 执行签到 ...
[2026-09-25 14:30:03] 签到成功!获得 10 魔力值,连续 11 天,排名 2304 / 5814
日志里如果看到的是「今日已签到」,也是正常的——说明配置没问题,等第二天再看。
Python 版第一次跑之前记得装依赖:面板「依赖管理 → Python3」→ 添加 requests。Node 版不需要任何依赖。
第五步:配微信推送(WxPusher)
签到成功了没人告诉你,等于没做。这里用 WxPusher,免费、不用搭服务、直接推到微信。
- 打开 wxpusher.zjiecode.com,微信扫码登录,创建一个应用拿到 appToken(
AT_开头); - 微信里关注它的公众号,扫码绑定后能看到你的 UID(
UID_开头); - 把两个值填进脚本:
DEFAULT_WXPUSHER_TOKEN = "AT_你的appToken"
DEFAULT_WXPUSHER_UID = "UID_你的UID"
配完再跑一次,微信里就会收到一条排版好的结果卡片:
✅ HDTime 签到通知
本次获得:10 魔力值
累计签到:第 1514 次 | 连续签到:11 天
今日排名:2304 / 5814
当前魔力值:2,401,386.7
如果青龙里已经在用 notify.js / notify.py 这类统一通知模块,脚本也会自动调用它,双通道并行,互不影响。临时不想收推送,配环境变量 HDTIME_PUSH=0 即可。
第六步:设置正式的定时
验证通过后,把定时规则改成正式的:
0 8 * * *
即每天早上 8 点执行。几点跑都行,建议错开整点(比如 7 9 * * *),整点是定时任务高峰。
多账号怎么办?在 HDTIME_COOKIE 的值里直接换行分隔,每行一个:
账号A&c_secure_uid=xxx; c_secure_pass=xxx; cf_clearance=xxx
账号B&c_secure_uid=yyy; c_secure_pass=yyy; cf_clearance=yyy
脚本会逐个签到(默认间隔 5 秒,可用 HDTIME_DELAY 调整),最后汇总推送「N/M 成功」。
必须知道的坑:cf_clearance 会过期
这是整套方案唯一需要你后期维护的地方,值得单独讲。
HDTime 挂在 Cloudflare 后面,它的 Cookie 分两类:
| Cookie | 性质 | 有效期 |
|---|---|---|
c_secure_uid / c_secure_pass / c_secure_ssl / c_secure_login | 站点登录凭证 | 长期有效 |
cf_clearance | Cloudflare 人机验证通行证 | 几小时到几天 |
cf_clearance 有两个特性,决定了它一定会过期:
- 绑定浏览器指纹和出口 IP:换设备、换网络、甚至浏览器大版本升级都可能失效;
- 有效期短:Cloudflare 对它有严格时限。
过期之后,脚本请求会被 Cloudflare 拦截(HTTP 403 或跳出人机验证页)。好消息是脚本专门识别了这种情况,日志和推送会明确告诉你:
❌ ******:被 Cloudflare 拦截,请更新 cf_clearance
应对方法:重复第三步,从浏览器重新复制一份完整 Cookie 换进去,就恢复了。整个过程大概一分钟。
两个补充建议:
- 被拦截时不要高频重试。请求打多了容易触发 Cloudflare 风控,越试越难放行。
- 如果服务器 IP 长期被风控,可以给脚本配代理:
HDTIME_PROXY=http://代理地址:端口,多个代理换行分隔会随机使用。
其他踩坑记录
顺手把调试过程中确认过的几个点记录下来,给改脚本的人参考:
- HDTime 的签到页是幂等的。当天重复访问
attendance.php,页面依然显示「签到成功」,但累计次数不会重复增加(对比「这是您的第 N 次签到」即可确认)。所以不用担心定时任务一天跑几次会刷魔力值。 - 请求要带
Referer。部分 NexusPHP 站点会校验来源,脚本里已带上https://hdtime.org/。 - 先访问首页再签到。脚本会先请求首页确认登录态和 Cloudflare 状态,避免拿着失效的 Cookie 白跑一趟。
- 退出码有讲究。全部成功返回
0,全部失败返回2,配置错误返回1。青龙靠退出码标记任务失败,方便接告警。
环境变量速查表
全部可选,不配也能跑(用的是脚本内置值):
| 变量 | 说明 | 默认 |
|---|---|---|
HDTIME_COOKIE | Cookie,多账号换行分隔,行格式 [备注&]Cookie | 内置值 |
WXPUSHER_TOKEN_VAL | WxPusher appToken | 内置值 |
WXPUSHER_UID | WxPusher UID,多个逗号分隔 | 内置值 |
HDTIME_PUSH | 0/off 关闭推送 | 开 |
HDTIME_PROXY | 代理,多个换行则随机取 | 不走代理 |
HDTIME_RETRY | 请求失败重试次数 | 3 |
HDTIME_DELAY | 多账号间隔秒数 | 5 |
总结
整套东西的维护成本只剩一件事:隔几天看一眼微信推送,出现「Cloudflare 拦截」就去复制个新 Cookie。如果连这个都嫌烦,可以关注两个方向:
- 用能常驻浏览器的方案(Playwright / FlareSolverr)自动过 Cloudflare 验证,彻底免维护,但部署复杂度高不少;
- 换没有 Cloudflare 前置的站点签到逻辑会简单很多。
对我来说,一分钟换一次 Cookie 换来每天魔力值不断,这笔账是划算的。祝签到愉快。