39 KiB
每日签到面板
跑在 Cloudflare Workers 上的自动签到面板:网页后台管账号 + D1 存数据 + 每天定时自动签到 + 推送通知。 零依赖,一个 Worker 搞定,另配一个浏览器扩展(负责抓 Cookie,以及用你家的网络代发请求)。
本项目只需要 Cloudflare 免费账号,不需要买服务器、不需要 Cloudflare 的 API Token。
开源共建:没有内置的网站,谁都能贡献一份适配 —— 在面板里把签到调通,导出成一段 JSON 发过来, 别人导入就能用,不用改代码、不用重新部署。见 社区站点适配。
先看这里:3 个最容易踩的坑
| 坑 | 后果 | 怎么办 |
|---|---|---|
wrangler.toml 里的 database_id 没换成自己的 |
Worker 连不上数据库,面板打不开/报错 | 见 第 3 步 |
又把 EXTERNAL_API_KEY 设成 Worker Secret |
它的优先级高于面板里生成的那串 Key,会出现「面板里复制了 Key,扩展却连不上」 | 不要设置它,见 第 4 步 的注意事项 |
| 面板换了网址(或更新了版本)后没管扩展 | 扩展还在连旧地址 / 还是旧代码 | 换域名后去扩展弹窗改「签到面板地址」;面板更新后重新下载并重新加载一次扩展 |
目录
- 它是什么
- 部署:照着做一遍就能用
- 日常使用
- 执行模式:云端 / 本地网络
- 内置站点
- 开源共建:不写代码也能加站点(社区站点适配)
- 手动取 Cookie 的各种方式
- 常见问题 FAQ
- 数据与安全
- 更新与备份
- 项目结构 / 自己加站点
- 免责
它是什么
一句话:把你每天要手动点的那些「签到」,交给 Cloudflare 每天自动点一遍,并把结果通知你。
| 能力 | 说明 |
|---|---|
| 多账号管理 | 增删改、启用/停用、单个或全部手动执行 |
| 定时自动签到 | 每天指定时间自动跑(精确到分钟),支持时区,每个账号还能设自己的时间 |
| 一键加账号 | 扩展「一键复制全部信息」→ 面板粘贴 → 自动认站点、自动填 Cookie 和 UA、自动试跑 |
| 本地网络执行 | 扩展代发 HTTP 请求,用你家的 IP + 你的 Cookie,绕过机房 IP 被拦的问题 |
| 万能「自定义 HTTP」 | 抓一次 cURL 就能接入任意网站,支持多步(先登录拿 token 再签到) |
| 自动探测签到接口 | 给个网址,面板帮你找候选签到接口 |
| 运行日志 | 每次结果、耗时、网站原始回馈,保留最近 500 条 |
| 推送通知 | Telegram / Bark / 通用 Webhook 推签到日报 |
架构一句话:Cloudflare 负责「什么时候跑、跑哪个账号、怎么判成功」,扩展负责「用你的网络和 Cookie 把请求发出去」。
部署:照着做一遍就能用
第 1 步:注册 Cloudflare + 装 Node.js
-
打开 https://dash.cloudflare.com/sign-up 注册一个免费账号(只要邮箱 + 密码,不用绑卡)。
-
装 Node.js 18 或更高版本:https://nodejs.org/ 下载 LTS 版一路下一步。
-
验证:打开命令行(Windows 按
Win+R输入cmd回车;Mac 打开「终端」),输入:node -v能打印出
v18.x/v20.x/v22.x之类就 OK。看不到版本号说明没装好,先解决这个再往下。
第 2 步:登录 wrangler
wrangler 是 Cloudflare 的官方命令行工具,用 npx 免安装直接跑(第一次会自动下载,等十几秒)。
npx wrangler@latest login
浏览器会弹出一个授权页,点 Allow / 同意。命令行出现 Successfully logged in 就成功了。
所有命令都建议写成
npx wrangler@latest。不要直接写wrangler,老版本不支持本项目的静态资源(assets)配置。
第 3 步:创建 D1 数据库,并把 id 填进去
D1 是 Cloudflare 的免费 SQLite 数据库,账号和 Cookie 都存在这里。
3.1 在项目目录里执行(先 cd 到你解压出来的那个文件夹):
npx wrangler@latest d1 create daily-checkin-panel
输出大概长这样,注意最后那行 database_id:
✅ Successfully created DB 'daily-checkin-panel' in region WEUR
Created your new D1 database.
[[d1_databases]]
binding = "DB"
database_name = "daily-checkin-panel"
database_id = "1a2b3c4d-5e6f-7a8b-9c0d-1e2f3a4b5c6d"
3.2 复制那串 database_id,打开项目根目录的 wrangler.toml,替换掉这一行:
[[d1_databases]]
binding = "DB"
database_name = "daily-checkin-panel"
database_id = "把这里换成你自己的那一串"
database_name:就是上面命令里用的名字daily-checkin-panel。你想换个名字也行,但两次要一致(d1 create用的名字 = 这里填的名字)。binding = "DB":不要改,代码里就是按这个名字取数据库的。- 仓库里自带的
database_id是作者自己的库,不改就连不上。
命令报错
database with name ... already exists?说明你之前建过。执行下面这条查 id,填进wrangler.toml即可:npx wrangler@latest d1 list
3.3 表结构不用手动建。 第一次打开面板时会自动建表,以后升级代码也会自动加列(不删你的数据)。
第 4 步(可选但强烈建议):设置加密密钥
账号里的 Cookie、密码、token 都是加密后存进 D1 的,密钥叫 ENCRYPT_KEY。
- 不设置也能用:首次运行会自动生成一把密钥并存在 D1 里。
- 但建议固定下来,否则哪天你重建了 D1,旧数据就解不开了。
4.1 生成一把 32 字节的密钥(任选一条命令,效果一样):
# 有 Node.js 就能用,Windows / Mac 通用
node -e "console.log(require('crypto').randomBytes(32).toString('base64'))"
# Mac / Linux 用 openssl 也行
openssl rand -base64 32
会得到类似 Xq7l0nJm8vP2sT4uW6yA1bC3dE5fG7hI9jK0lM2nO4= 的一串。
4.2 把它写进 Worker Secret:
npx wrangler@latest secret put ENCRYPT_KEY
会提示 Enter a secret value:,把上面那串粘进去回车(粘贴时屏幕不显示,正常现象)。
⚠️ 必须是正好 32 字节的 base64。如果面板报错
ENCRYPT_KEY 必须是 32 字节的 base64 字符串,说明长度不对,重新用上面的命令生成。
⚠️ 不要把
EXTERNAL_API_KEY设成 Secret。 面板里的「扩展用 API Key」默认存在 D1(在面板上生成、随时可换)。而环境变量里的EXTERNAL_API_KEY优先级更高,一旦设了,就会盖掉面板里那串 —— 表现就是「面板里复制了 Key,扩展却一直连不上 / 报 API Key 无效」。 只有一种情况才需要它:你想把 Key 固定成环境变量、不让人在面板上改。那就把它设成和面板里显示的一模一样。
第 5 步:部署
npx wrangler@latest deploy
成功后会打印你的网址,形如:
https://daily-checkin-panel.你的账号名.workers.dev
这个地址就是你的签到面板。wrangler.toml 里的定时触发器(每分钟唤醒一次)也会在这步一起生效,不用去控制台设置。
第 6 步:打开面板、设置管理密码
浏览器打开上面那个网址 → 输入并确认管理密码(至少 6 位)→ 进入后台。
-
密码用 PBKDF2-SHA256 加盐哈希后存 D1,不存明文。
-
忘了密码:页面上没法找回。清掉 D1 里的
admin_hash就能重新走一次「设置管理密码」:npx wrangler@latest d1 execute daily-checkin-panel --remote --command "DELETE FROM settings WHERE key='admin_hash'"建议平时把密码记在密码管理器里。
第 7 步:生成扩展用的 API Key
面板 → 设置 → 找到「🔌 浏览器扩展」→ 点 🎲 生成 → 再点 📋 复制。
这串 Key 是扩展调用面板接口的凭证:
- 它不会被写进扩展的下载包里,需要你手动粘到扩展弹窗里(这样扩展包就算被别人拿到,也连不上你的面板)。
- 泄露了就回来点「生成」换一把,然后在扩展里更新。
第 8 步:安装浏览器扩展
8.1 下载:面板 → 账号页底部「添加 / 更新账号」→ 展开「🧩 还没装扩展?」→ 点下载链接。也可以直接在地址栏访问:
https://你的域名/cookie-plugin-2.2.zip
从面板下载的扩展里已经自动填好了面板地址,不用担心填错。
8.2 解压到一个固定文件夹(例如 D:\cookie插件)。
⚠️ 解压后不要删除、不要移动这个文件夹,浏览器会一直读它。
8.3 加载:
- Chrome 地址栏输入
chrome://extensions(Edge 用edge://extensions)回车 - 打开右上角的 开发者模式
- 点 加载已解压的扩展程序 → 选中第 8.2 步那个文件夹本身(不是里面的某个文件、更不是 zip)
- 工具栏出现 🍪 图标就装好了
8.4 配置:点扩展图标 →
- 签到面板地址:已经自动带出来了;如果是空的就手填
https://你的域名 - API Key:粘贴第 7 步复制的那串
- 点 🔌 面板连接检查,显示
连接正常 ✅ API Key 有效(面板版本 2.2)就成了
第 9 步:添加第一个账号(复制 → 粘贴,两步)
以 NodeSeek 为例:
- 浏览器打开
www.nodeseek.com,手动登录(有人机验证也没关系,你手点一下就好) - 停在那个网站的页面上,点扩展图标 → 📋 一键复制全部信息(含 UA)
- 回到面板 → 账号页「添加 / 更新账号」→ 在输入框里按 Ctrl+V
- 粘上就自动完成:面板自动认出站点 → 自动建号 → 自动填 Cookie 和 User-Agent → 立刻试跑一次 → 弹出结果分解
User-Agent 不用你去找。 扩展会把浏览器真实 UA 一起带回来;万一没带,面板会自动用当前浏览器的 UA 兜底。
拉到的 Cookie 会连同 HttpOnly 的登录 Cookie 一起复制(NodeSeek 这类站点必须这样才行)。要加第二个站点就重复 1~4。
第 10 步:设置每天几点签到
面板 → 设置 → 「签到时间」:点时间胶囊选时/分,选时区,点保存。改完立即生效,不用重新部署。
- 想给某个账号单独设时间:账号列表的「签到时间」列,点胶囊设置;点「跟随全局」就回到全局时间。
- 时区默认
Asia/Shanghai(北京时间),下拉里可以换成别的。
第 11 步:绑定自定义域名(强烈建议)
*.workers.dev 在国内访问经常不稳定,会导致:你自己打不开面板、扩展连不上面板(于是所有需要本地网络的账号都被跳过)。
做法:
- 把你的域名托管到 Cloudflare(在 Cloudflare 里加站点,改域名的 NS)
- 控制台 → Workers 和 Pages → 选中你的 Worker → 设置 → 域和路由 → 添加 → 自定义域
- 用新域名打开面板
- ⚠️ 去扩展弹窗里把「签到面板地址」改成新域名,否则扩展还在连旧的 workers.dev 地址
第 12 步:推送通知(可选)
面板 → 设置 → 「推送通知」,任选一个填:
| 渠道 | 要填 |
|---|---|
| Telegram | Bot Token(找 @BotFather 申请)+ Chat ID(找 @userinfobot 查) |
| Bark | Bark Key(App 里那串) |
| 通用 Webhook | 一个能收 POST JSON 的地址,收到 {title, body} |
不填就不推送,不影响签到。勾上「启用推送」并保存即可。
日常使用
| 你在哪做什么 | 结果 |
|---|---|
| 账号列表 → 执行 | 立刻跑这个账号,日志里能看到网站原始回馈 |
| 账号列表 → 全部执行 | 依次跑所有启用的账号 |
| 账号列表 → 切换(模式徽章) | 跟随默认 → 🌐 本地网络 → ☁️ 云端 循环切换 |
| 账号列表 → 启用开关 | 关掉的账号不参与定时任务 |
| 日志页 | 每次运行的时间、耗时、网站真实返回原文;可按账号/结果筛选 |
状态徽章怎么看:
- ✅ 已签到 / 🔴 未签到 —— 按你设置的时区算「今天」,过了当地 00:00 会自动全部回到「未签到」,只有当天真的签到成功(或站点明确回「今日已签到」)才变回「已签到」;跳过和失败都不会让它变成已签到
- 网站反馈那一列,失败时下方会给一句中文「怎么办」(比如「该网站屏蔽了 CF 网络,请切本地网络」)
- ⏭️ 跳过(需要本地网络但扩展不在线;不算失败,也不会覆盖上一次的结果)
- 顶部的 🌐 / ☁️ 表示这次用的是本地网络还是云端
首页右上角那个「扩展在线」胶囊:就在「退出」按钮下面。
- 🟢 扩展在线(自动中继已启用):扩展正在接单,账号可以切到「本地网络」
- ⚪ 扩展离线(本地网络不可用):点它可立即重测一次;此状态下不允许把账号切到「本地网络」(面板会直接拒绝并告诉你原因,不会让你切进一个根本跑不了的模式)
- 每 30 秒自动重测一次,扩展断线/上线会自己变
执行模式:云端 / 本地网络
| 徽章 | 含义 | 适合 |
|---|---|---|
| ☁️ 云端 | Cloudflare 机房的 IP 直接发请求 | 普通 API 类站点(机场、Akile、天翼云盘…) |
| 🌐 本地网络 | 请求经由你的浏览器扩展发出,用你家的 IP + 你的登录态 | 会拦机房 IP 的站点(吾爱破解、NodeSeek、糊涂鳄…) |
几个要点:
- 账号默认跟随站点推荐的模式;扩展在线时,需要本地网络的账号会自动走你的网络。
- 扩展离线时,这些账号记为 ⏭️ 跳过,不会瞎报失败。
- 面板判断「扩展在线」的依据是:最近 90 秒内有扩展来领过任务。
- 扩展是常驻的:它向面板发起 15 秒的长轮询,你一点「执行」,请求通常 1 秒内就被扩展领走。
扩展弹窗上的按钮:
| 按钮 | 作用 |
|---|---|
| 一键发送到签到面板 | 把当前网页的 Cookie + UA 发给面板,自动打开面板并保存 |
| 一键复制全部信息(含 UA) | 复制成一段 JSON,去面板「添加/更新账号」粘贴即可 |
| 🔌 面板连接检查 | 验证面板地址 + API Key 是否配对成功 |
工具栏上那个图标是蓝色方块里的**「签」。弹窗里不需要**点任何「执行」类按钮:扩展后台一直在等单, 面板点「执行」就会自己接单。
内置站点
| 站点 | 需要填 | 备注 |
|---|---|---|
| NodeSeek | Cookie | 登录带 Cloudflare 人机验证,无法自动登录;支持「试试手气 / 固定 5 鸡腿」开关。建议本地网络(云端出口没有 IPv6 会被跳提示页) |
| 吾爱破解 | Cookie + User-Agent | Cookie 必须含 wzws_cid,UA 必须与抓 Cookie 的浏览器一致。云端一定会被 403(网宿 UrlACL 封机房 IP),请用本地网络;会自动回读吾爱币/威望。每日状态看顶栏那个按钮(未签到 =「打卡签到」,已签到 =「签到完毕」);已签到就直接结束,不打签到接口 |
| 糊涂鳄 | 站点地址 + Cookie | WordPress/RiPro。只打首页悬浮窗真正的签到接口 user_qiandao(每日 5 晶石,站点主题 ripro/assets/js/app.js 里就是这么绑的),不会退回会员中心那个只给 1 积分的 xb_user_qiandao(只有真接口「不存在」时才降级,且会在反馈里标注)。中继超时后会先重打同一接口复核(可能其实已签成功);两次都没回包就报「结果未知」并自动补跑。本站按 UTC 计日(北京时间 08:00 才重置),签到时间建议设在 08:05 之后 |
| V2EX | Cookie | 每日登录奖励,先读页面再取动态参数 |
| 看雪论坛 | Cookie | csrf_token 自动获取 |
| AkileCloud | akile-token |
从浏览器 localStorage 取;临近过期自动续期 |
| V2Board 机场 | 机场域名 + 邮箱 + 密码 | 表单登录后签到领流量 |
| Discuz 每日签到 | 论坛地址 + Cookie | 通用模块,适用于装 k_misign 插件的论坛 |
| 天翼云盘 | 189 手机号 + 密码 | 登录前自动检测是否需要验证码;需要时先在官方 App/网页登录一次(关掉设备锁) |
| 夸克网盘 | kps / sign / vcode |
手机抓包获取,约 2 个月过期 |
| 自定义 HTTP | URL/方法/头/体 + 判定规则 | 万能模块,支持多步录制。没内置的网站用这个录一遍,然后导出成社区配置分享出去 |
🌍 在这个列表之外的网站,不需要等作者更新代码:用下面的「社区站点适配」自己录一份,或者导入别人录好的。
开源共建:不写代码也能加站点(社区站点适配)
面板里的站点分两类:
- 内置站点:写在
src/sites/里的代码模块(上表那些),要改代码才能加 - 社区站点:一段 JSON(怎么发请求、怎么判成功),存进 D1,导入后立刻生效,不用重新部署
用别人分享的配置(30 秒)
面板 → 账号页 → 🌍 社区站点(开源共享) 卡片:
- 把配置的 raw 链接(GitHub raw / Gist / 任意网址都行)粘到「或:配置的原始链接」,或直接把 JSON 全文粘进文本框
- 点 🔎 校验预览 —— 会告诉你这是什么站、要填哪些字段、几步请求、有没有夹带凭据
- 点 ⬇️ 导入 → 然后「添加账号」里就能选到它(列表里带 🌍 社区 标记)
仓库里 community/sites/ 放着可用的配置和模板,索引在 community/index.json。
把自己调通的站点分享出去
- 「添加账号」→ 站点选 自定义 HTTP → 多步录制:把人工签到的过程(F12 →「复制为 cURL」)一步步录进去,点「测试运行」确认能跑通
- 回到 🌍 社区站点卡片 → 右侧「导出我的配置」→ 选这个账号 → 📤 导出为社区配置
- 面板自动把真实 Cookie / token 换成
{{cookie}}这类占位符,把https://你的域名/xx换成{{site_url}}/xx - 再按用到的占位符倒推出「别人要填哪些字段」,所以导出就是一份别人能直接用的配置
- 面板自动把真实 Cookie / token 换成
- 复制或存成
.json→ 放到仓库community/sites/并更新index.json→ 开 PR(或先开 Issue 贴出来)
安全:配置里绝不允许带任何凭据。导出时面板会自动清洗,导入时校验器也会直接拒绝带明文 Cookie 的配置。 详细规范(字段速查、PR 检查清单、Discuz 两步示例)见 CONTRIBUTING.md 和 community/README.md。
手动取 Cookie 的各种方式
正常情况用扩展一键复制就够了。下面这些是「不装扩展」时的备用手段,都在面板「添加 / 更新账号」→ 展开「🛠 不装扩展时的手动方式」里:
| 方式 | 怎么做 | 注意 |
|---|---|---|
| 请求头(推荐) | F12 → 网络 → 点任一请求 → 复制请求头整段 → 粘到面板 | Cookie 和 UA 会一起提取,吾爱这种要求配对的站点最省事 |
| cURL 命令 | F12 → 网络 → 右键请求 → 复制为 cURL → 粘到面板 | 同样能带出 UA |
| 小书签 | 面板生成一段书签 → 拖到书签栏 → 在目标网站点一下 | 读不到 HttpOnly Cookie,NodeSeek 这类不行 |
| 地址栏代码 | 面板复制代码 → 粘到手机浏览器地址栏(javascript: 要手打) |
同上,手机端应急用 |
| 控制台代码 | F12 → Console → 输入 document.cookie 回车 → 复制结果 |
同上 |
| Cookie-Editor JSON | 用 Cookie-Editor 插件导出后粘进面板 | 需要先装那个插件 |
| cookie.txt | 粘 Netscape 格式的内容 | 少数抓包工具导出的格式 |
小贴士
- 有些站点(吾爱破解)要求 Cookie 与 User-Agent 配对,UA 不一致会被 WAF 拦。用扩展或「请求头」方式就不用操心。
- Cookie 会过期。到期后日志会提示「登录已失效 / Cookie 已失效」,按第 9 步重新复制粘贴一次即可。
常见问题 FAQ
Q:面板显示「已签到」,但我去网站点签到还能领到积分? A:这曾在糊涂鳄(hutue.cn / dj.hutue.cn)真实发生过,根因是站点有两个长得一模一样的「签到」:
| 入口 | 接口(action) | 奖励 |
|---|---|---|
| 首页右侧悬浮窗「打卡签到」(真签到) | user_qiandao(父主题 RiPro 的 app.js) |
每天 5 晶石 |
| 会员中心的「首页签到」 | xb_user_qiandao(子主题 xb-app.js) |
只有 1 积分 |
旧版面板打错了后者:它确实回 status:1「签到成功,赠送1积分」,于是面板报成功 —— 但真签到根本没做,你去网站点悬浮窗照样能再领 5 晶石。现在面板优先打 user_qiandao,并且会从首页按钮真正绑定的代码里发现它(主题升级也不容易失效)。
另外糊涂鳄按 UTC 计日(北京时间 08:00 才算它新的一天),签到时间建议设在 08:05 之后;面板也按 UTC 记糊涂鳄的「今天」,08:00 一到状态列会自己回到「未签到」。
Q:吾爱破解怎么判断我到底签没签? A:看站点顶栏那个按钮 —— 「打卡签到」= 还没签(可点、还挂着去签到的链接);「签到完毕」= 已签(点了没反应)。面板就是照它判的:看到「签到完毕」就直接结束、连签到接口都不打;等接口超时后也会回读这个按钮再下结论 —— 是「签到完毕」就报已签到,是「打卡签到」就明确告诉你「本次没有生效」,并提示你在浏览器手动点一次。
Q:本地网络执行时提示「中继超时」,但网站里其实签到过了?
A:这多发生在吾爱破解 —— 它的签到接口 home.php?mod=task&do=apply 受网宿 WAF 最严格的那一档保护,经中继时连接会被吊死到超时,而那一次请求往往已经生效。现在的做法是:每次先读一次任务页(home.php?mod=task),只要那儿显示「签到完毕」就直接判已签到,连签到接口都不打;真的超时了也会再回读一次任务页,确认签过了就报成功。
糊涂鳄(RiPro)则会先自己重打一次同一个签到接口,用站点的回答来判断上一次到底送达没有;两次都没回包就记「结果未知」,并交给定时任务自动补跑复核 —— 不再直接写「签到失败」冤枉网站。另外超时文案也直说了「请求已发出但没收到回包,站点可能已记录」,不再是含糊的「已放弃该请求」。
旧版扩展的任务硬超时是 45 秒,而「首次试探 12 秒 + 激活前台 1.2 秒 + 前台重试 30 秒」就要 43 秒, 于是第二次明明快要拿到响应也被掐掉 —— 面板上永远只有「中继执行超时」。 现在硬超时按公式算(
12 + 1.2 + 30 + 15 ≈ 58 秒),并且有单测钉住这个预算关系。 所以升级后请务必在面板里重新下载扩展并「重新加载」,否则跑的还是旧的 45 秒逻辑。
Q:扩展显示「API Key 无效 / 连不上面板」,但面板里明明复制了 Key?
A:九成是你之前给 Worker 设过 EXTERNAL_API_KEY 这个 Secret —— 它的优先级高于面板里生成的那串。去 Cloudflare 控制台 → 你的 Worker → 设置 → 变量和密钥,把 EXTERNAL_API_KEY 删掉;或者用命令删:
npx wrangler@latest secret delete EXTERNAL_API_KEY
删掉后回面板重新生成一把 Key,填进扩展。
Q:点「执行」后一直在转圈?
A:如果这个账号是 🌐 本地网络,说明扩展没接单。检查(1)扩展是否装着并启用;(2)扩展弹窗里地址和 Key 对不对(点「面板连接检查」);(3)workers.dev 在国内能不能打开,不行就绑自定义域名。
另外确认面板和扩展都是最新版:新版是「长轮询」接单(1 秒级响应),旧版要等 15~30 秒。
Q:日志说「本地网络执行失败:中继执行超时」? A:扩展在你的浏览器里发这次请求超时了。常见原因是目标站有安全验证/Slider,或者那个域名没有可用的标签页。手动在浏览器打开该站点一次,确认能正常浏览,再试。
Q:吾爱破解云端执行报 403 / reason:UrlACL? A:这不是 bug。吾爱破解用网宿 WAF 直接封了 Cloudflare 机房 IP。把该账号切到 🌐 本地网络(需要扩展在线)就能签到。
Q:点「切换」切不到「本地网络」,提示扩展离线? A:这是有意拦截。没有在线扩展就没有本地网络中继,切过去只会永远等待。先按首页右上角的胶囊确认扩展在线(离线就点「面板连接检查」排查地址/Key);扩展离线时,「切换」会在「跟随默认」和「CF 网络」之间循环,跳过本地网络这一档。
Q:今天明明签到过了,面板却显示「未签到」? A:看的是设置里那个时区的今天。如果站点用的是别的时区,跨零点前后可能对不上;把「签到时间设置」里的时区改成该站的时区即可。另外「已签到」只认成功的运行记录,跳过/失败不算。
Q:日志说「遇到安全验证(WAF)」? A:站点识别到你不是正常浏览器。用浏览器打开该站点,手动过一次验证并登录,然后重新用扩展「一键复制全部信息」更新 Cookie 和 UA。
Q:日志说「遇到人机验证」? A:验证码/滑块无法自动过(所有签到脚本的通病)。人工在浏览器里登录一次,再重新抓一次 Cookie 即可。
Q:执行结果一直是 ⏭️ 跳过? A:这个账号需要本地网络但扩展不在线(见上一条 Q)。
Q:想加一个没有内置的网站? A:用「自定义 HTTP」:浏览器里人工登录并手动签到一次 → F12 → 网络 → 找到签到请求 → 右键「复制为 cURL」→ 面板粘贴导入 → 填「响应应包含」关键词 → 保存试跑。多步流程(先登录拿 token)用「多步录制」。
Q:粘进来的那一长串 Cookie,我怎么知道哪段是干什么的?
A:用面板「添加 / 更新账号」下面的 Cookie 解析器(只解析、不保存):把扩展复制的内容(或 F12 的请求头、cURL、cookie.txt、光秃秃的 a=1; b=2)粘进去点「拆分看看」,它会逐段告诉你:
- 登录必需(绿的):
PHPSESSID、wordpress_logged_in_*、saltkey(Discuz 登录盐)… 这些丢了就签不了; - 网站安全校验(橙的):
wzws_cid(网宿 WAF,吾爱破解缺它直接 403)、cf_clearance(Cloudflare 人机校验,换 IP/换浏览器会失效); - 表单防护(蓝的):
XSRF-TOKEN这类,提交任务时要一起带上; - 统计 / 界面偏好(灰的):
_ga、Hm_lvt_*、theme这些丢了也不影响签到。
值本身只显示形态(长度、像不像 JWT / 时间戳 / base64),不把凭据全文摊在屏幕上。想真用起来点「↗️ 填到上面并保存」即可。
Q:扩展弹窗里需要点「立即执行」吗? A:不需要(那个按钮已经删了)。扩展后台是常驻长轮询,面板点「执行」后 1 秒内就会接单;弹窗打开时也只是顺手叫醒一次。另外,工具栏上那个图标是蓝色方块里的**「签」**,看到它就说明扩展已经装好了。
Q:签到时面板要打开浏览器标签页吗? A:只有「本地网络」且站点声明了需要浏览器执行时才开(比如吾爱破解)。扩展会复用该站已打开的标签页,没有就新建一个后台标签页;执行完只关掉自己新建的那个,不会碰你正在看的页面。
Q:更新面板代码会丢账号吗? A:不会。更新只替换 Worker 脚本,D1 数据库是独立的;表结构变更走版本化迁移(缺列自动补,不重建表)。
Q:D1 免费额度够吗? A:个人使用完全够。每分钟一次 Cron 唤醒,绝大多数只是比对时间后立即返回,不写数据库。
Q:定时签到到底什么时候跑?漏了一分钟会怎样? A:三条规则,都好预期:
- 到点就跑:到达「签到时间」(各账号可不同),Cron 下一分钟就执行;
- 一天只成功一次:当天已经成功过就不再重复(改了时间也一样,不会重复签);
- 失败/结果未知会自动补跑:隔 15 分钟再试一次,直到成功或超出补跑窗口(6 小时)。
第 3 条是给「漏一分钟」兜底的:旧逻辑要求「当前分钟恰好等于设定分钟」,只要那一分钟没被触发 (部署、抖动),或者你把时间改成了已经过去的时刻,当天就再也不会自动签到了 —— 看起来就是「不会自动签到」。 超出 6 小时窗口(比如晚上才部署、或把 20:00 改成 08:05)不会深夜突然批量签到,点一次「执行」即可。
部署新版后的头一次 Cron 属于「补跑窗口内」,可能会把所有已过点的账号都跑一遍 —— 站点当天已签的话会直接回「已签到」,纯属正常,不会重复签。
「网站反馈」里那行字是谁说的?
第一行是网站自己的原话(响应 JSON 里的 message / msg / status_msg),
下面缩进的一行是网站原始返回(完整 JSON / 页面片段),鼠标移上去看全文。
- 面板不替网站说话:不会把「今天已完成签到,请勿重复操作」改写成「今日已签到,不能重复签到」; 判定结果看「状态」列的已签到/未签到徽章
- 如果是把早先版本存的旧记录,面板会从原始返回里读出网站原话补上,并打一个「网站原话」小标记
- 原始返回后面还会跟一句
· 接口 user_qiandao这样的标注:这是这次到底把请求打给了哪个接口。 想核实「面板有没有真打通」,看这一句就行 —— 站点有两个长得一样的签到时,它能一眼看出走的是哪个。 例如糊涂鳄打的是首页悬浮窗的user_qiandao(每天 5 晶石);如果哪天被迫退回会员中心的xb_user_qiandao(只给 1 积分),后面会额外写明「注意:本次走的是会员中心签到」
「结果未知」是什么状态?
本地中继把请求发出去了、但没等到回包(站点慢 / 反爬把连接吊住),面板不会报「签到失败」—— 因为请求可能已经送达、站点可能已经签好了。这种情况记「签到结果未知」(状态列仍是未签到, 不会冒充成功),并说明白:
- 糊涂鳄这类站会先自己重打一次同一个接口:上一次若真生效了,站点这次会直接回「今日已签到」, 面板就正确地报已签到(反馈里会留一句「重试过」的痕迹)
- 仍然拿不到回包 → 定时任务会隔 15 分钟自动补跑复核,一直到当天成功或超出补跑窗口
- 机场这类把促销公告塞进 msg 的,只展示第一段,不会把广告刷满一屏
- 红标「!」在反馈末尾:鼠标移上去看怎么处理(切本地网络 / 重新取 Cookie / 过滑块…)
吾爱破解这类论坛,面板是怎么判断「今天签没签」的?
这类 Discuz 论坛(52pojie、飘云阁、卡饭…)有个坑:当天状态常常是图片,不是文字。
吾爱破解把「📋打卡签到」画在 …/common/qds.png 里,那个链接的文本节点是空的,
所以「读按钮文字」对它无效。可靠判据是服务端状态:
| 页面上的迹象 | 面板结论 |
|---|---|
还挂着 home.php?mod=task&do=apply&id=2 这条「去签到」链接(或 …/qds.png 那个按钮) |
未签到 → 自己去触发签到(浏览器执行时导航过去,等同人手点一下) |
签到完毕 / 您已完成过此任务 / 恭喜…获得… |
已签到(任务页已显示时不打签到接口、不重复请求) |
游客页(注册[Register]) |
登录失效,提示重新取 Cookie |
判定用的是那个任务行的信息,不会把任务列表里别的任务(验证邮箱、推广任务)的「已完成」算到签到头上。
「签到完毕」是图片版也认:签完之后那条 do=apply 链接会消失,链接不在了就是今天已签。
同类站点(
plugin.php?id=dsu_paulsign:sign、k_misign:sign、zqlj_sign、.punch_btn等)也能识别; 认得出入口就直接触发,认不出就老实告诉你「请在浏览器手动签一次」,不会假装成功。
数据与安全
- 管理密码:PBKDF2-SHA256(10 万次迭代)加盐哈希后存 D1,不存明文。
- 账号凭据(Cookie / 密码 / token):AES-GCM 加密后存 D1;密钥来自
ENCRYPT_KEYSecret,没设就在首次运行时自动生成并存进 D1。 - 会话:服务端 session + HttpOnly + Secure + SameSite Cookie,7 天过期。
- 扩展接口:独立的「扩展用 API Key」鉴权;服务端还支持对扩展请求做 HMAC 签名校验 + 防重放(默认不强制,兼容旧版扩展)。
- 推送密钥:设置页读取时脱敏,更新时留空即保留旧值。
- Cookie 传输:扩展「一键发送」通过面板页面地址传回,面板读到后立即用
history.replaceState清掉地址栏里的参数。
更新与备份
更新面板:拿到新代码后在项目目录重新部署,账号数据不受影响。
npx wrangler@latest deploy
如果这次更新包含扩展改动,部署完再去面板下载一次扩展并重新加载(面板里内嵌的是扩展源码,必须重新下载才会更新)。
备份数据库(建议偶尔做一次):
npx wrangler@latest d1 export daily-checkin-panel --remote --output backup.sql
备份文件里是加密后的凭据。如果
ENCRYPT_KEY是自动生成的,恢复时请用同一个 D1,否则解不开。 想随时查看账号列表:npx wrangler@latest d1 execute daily-checkin-panel --remote --command "SELECT id,name,site FROM accounts"
项目结构 / 自己加站点
daily-checkin-panel/
├── wrangler.toml # Worker 配置、Cron、D1 绑定(要改 database_id)
├── src/
│ ├── index.js # 路由 + API + Cron 入口
│ ├── runner.js # 执行引擎(遍历账号 / 写日志 / 推送)
│ ├── db.js # 表结构 + 版本化迁移
│ ├── crypto.js # 密码哈希 / 凭据加解密
│ ├── schedule.js # 签到时间与时区判定
│ ├── notify.js # Telegram / Bark / Webhook
│ ├── probe.js # 签到接口自动探测
│ ├── ext-zip.js # 动态生成扩展 zip(注入面板地址)
│ ├── ext-files.js # 自动生成:扩展源码内嵌(别手改)
│ ├── lib/
│ │ ├── web.js # 模拟浏览器的请求工具(UA/Referer/表单)
│ │ ├── relay.js # 本地网络中继(Worker 侧)
│ │ ├── signals.js # 统一网站反馈识别(成功/已签/登录/验证码/WAF)
│ │ └── ext-auth.js # 扩展请求鉴权(API Key + 签名 + 防重放)
│ └── sites/ # 各站点签到模块 + index.js 注册表
│ ├── community.js # 社区站点适配:校验 / 导入导出 / 声明式配置 → 可执行站点
│ ├── sites/http.js # 自定义 HTTP 多步引擎(社区配置也跑它)
├── public/
│ ├── index.html # 管理后台 SPA
│ └── ext-src/ # 扩展源文件(改完需重新生成 ext-files.js)
├── community/ # 社区贡献的站点适配(JSON)+ 模板 + 索引
├── tools/
│ ├── gen-ext-files.mjs # 把 public/ext-src/ 打包进 src/ext-files.js
│ ├── gen-tp-preview.mjs # 生成时间选择器预览页
│ ├── gen-ui-preview.mjs # 生成卡片排版预览页
│ └── check-html.mjs # 标签配对检查
└── test/ # 零依赖单测:node test/xxx.test.mjs
加一个站点(两种选择):
- 不改代码:用「自定义 HTTP」录一遍 → 导出为社区配置 → 自己导入或分享(见上一节)。这适用于绝大多数「带 Cookie 打一两个接口」的网站。
- 要写代码(需要特殊逻辑:人机验证、签名、多步浏览器流程):按下面走。
自己加一个内置站点:
- 在
src/sites/新建文件(照着nodeseek.js抄最省事):
export const mysite = {
id: 'mysite',
name: '我的站点',
desc: '一句话说明',
fields: [{ key: 'cookie', label: 'Cookie', type: 'textarea', required: true }],
tips: '给用户的提示',
async run(creds, ctx) {
// ctx: { env, db, account, meta };meta 可读写并会自动持久化
return { ok: true, message: '签到成功' };
},
};
- 在
src/sites/index.js的SITES里注册。 - 重新部署,网页表单会自动出现这个站点。
改扩展:改 public/ext-src/ 下的文件 → 跑 node tools/gen-ext-files.mjs 重新生成 src/ext-files.js → 部署。否则用户下载到的还是旧版扩展。
免责
本项目仅供学习交流。签到接口由各站点提供,若对方改版导致失效,需按新接口调整对应的 src/sites/ 文件。请勿用于非法用途。