Files
daily-checkin-panel/README.md
T

39 KiB
Raw Blame History

每日签到面板

跑在 Cloudflare Workers 上的自动签到面板:网页后台管账号 + D1 存数据 + 每天定时自动签到 + 推送通知。 零依赖,一个 Worker 搞定,另配一个浏览器扩展(负责抓 Cookie,以及用你家的网络代发请求)。

本项目只需要 Cloudflare 免费账号,不需要买服务器、不需要 Cloudflare 的 API Token。

GitHub License: MIT PRs welcome

开源共建:没有内置的网站,谁都能贡献一份适配 —— 在面板里把签到调通,导出成一段 JSON 发过来, 别人导入就能用,不用改代码、不用重新部署。见 社区站点适配。


先看这里:3 个最容易踩的坑

坑 后果 怎么办
wrangler.toml 里的 database_id 没换成自己的 Worker 连不上数据库,面板打不开/报错 见 第 3 步
又把 EXTERNAL_API_KEY 设成 Worker Secret 它的优先级高于面板里生成的那串 Key,会出现「面板里复制了 Key,扩展却连不上」 不要设置它,见 第 4 步 的注意事项
面板换了网址(或更新了版本)后没管扩展 扩展还在连旧地址 / 还是旧代码 换域名后去扩展弹窗改「签到面板地址」;面板更新后重新下载并重新加载一次扩展

目录


它是什么

一句话:把你每天要手动点的那些「签到」,交给 Cloudflare 每天自动点一遍,并把结果通知你。

能力 说明
多账号管理 增删改、启用/停用、单个或全部手动执行
定时自动签到 每天指定时间自动跑(精确到分钟),支持时区,每个账号还能设自己的时间
一键加账号 扩展「一键复制全部信息」→ 面板粘贴 → 自动认站点、自动填 Cookie 和 UA、自动试跑
本地网络执行 扩展代发 HTTP 请求,用你家的 IP + 你的 Cookie,绕过机房 IP 被拦的问题
万能「自定义 HTTP」 抓一次 cURL 就能接入任意网站,支持多步(先登录拿 token 再签到)
自动探测签到接口 给个网址,面板帮你找候选签到接口
运行日志 每次结果、耗时、网站原始回馈,保留最近 500 条
推送通知 Telegram / Bark / 通用 Webhook 推签到日报

架构一句话:Cloudflare 负责「什么时候跑、跑哪个账号、怎么判成功」,扩展负责「用你的网络和 Cookie 把请求发出去」。


部署:照着做一遍就能用

第 1 步:注册 Cloudflare + 装 Node.js

  1. 打开 https://dash.cloudflare.com/sign-up 注册一个免费账号(只要邮箱 + 密码,不用绑卡)。

  2. 装 Node.js 18 或更高版本:https://nodejs.org/ 下载 LTS 版一路下一步。

  3. 验证:打开命令行(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 加载:

  1. Chrome 地址栏输入 chrome://extensions(Edge 用 edge://extensions)回车
  2. 打开右上角的 开发者模式
  3. 点 加载已解压的扩展程序 → 选中第 8.2 步那个文件夹本身(不是里面的某个文件、更不是 zip)
  4. 工具栏出现 🍪 图标就装好了

8.4 配置:点扩展图标 →

  • 签到面板地址:已经自动带出来了;如果是空的就手填 https://你的域名
  • API Key:粘贴第 7 步复制的那串
  • 点 🔌 面板连接检查,显示 连接正常 ✅ API Key 有效(面板版本 2.2) 就成了

第 9 步:添加第一个账号(复制 → 粘贴,两步)

以 NodeSeek 为例:

  1. 浏览器打开 www.nodeseek.com,手动登录(有人机验证也没关系,你手点一下就好)
  2. 停在那个网站的页面上,点扩展图标 → 📋 一键复制全部信息(含 UA)
  3. 回到面板 → 账号页「添加 / 更新账号」→ 在输入框里按 Ctrl+V
  4. 粘上就自动完成:面板自动认出站点 → 自动建号 → 自动填 Cookie 和 User-Agent → 立刻试跑一次 → 弹出结果分解

User-Agent 不用你去找。 扩展会把浏览器真实 UA 一起带回来;万一没带,面板会自动用当前浏览器的 UA 兜底。

拉到的 Cookie 会连同 HttpOnly 的登录 Cookie 一起复制(NodeSeek 这类站点必须这样才行)。要加第二个站点就重复 1~4。

第 10 步:设置每天几点签到

面板 → 设置 → 「签到时间」:点时间胶囊选时/分,选时区,点保存。改完立即生效,不用重新部署。

  • 想给某个账号单独设时间:账号列表的「签到时间」列,点胶囊设置;点「跟随全局」就回到全局时间。
  • 时区默认 Asia/Shanghai(北京时间),下拉里可以换成别的。

第 11 步:绑定自定义域名(强烈建议)

*.workers.dev 在国内访问经常不稳定,会导致:你自己打不开面板、扩展连不上面板(于是所有需要本地网络的账号都被跳过)。

做法:

  1. 把你的域名托管到 Cloudflare(在 Cloudflare 里加站点,改域名的 NS)
  2. 控制台 → Workers 和 Pages → 选中你的 Worker → 设置 → 域和路由 → 添加 → 自定义域
  3. 用新域名打开面板
  4. ⚠️ 去扩展弹窗里把「签到面板地址」改成新域名,否则扩展还在连旧的 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 秒)

面板 → 账号页 → 🌍 社区站点(开源共享) 卡片:

  1. 把配置的 raw 链接(GitHub raw / Gist / 任意网址都行)粘到「或:配置的原始链接」,或直接把 JSON 全文粘进文本框
  2. 点 🔎 校验预览 —— 会告诉你这是什么站、要填哪些字段、几步请求、有没有夹带凭据
  3. 点 ⬇️ 导入 → 然后「添加账号」里就能选到它(列表里带 🌍 社区 标记)

仓库里 community/sites/ 放着可用的配置和模板,索引在 community/index.json。

把自己调通的站点分享出去

  1. 「添加账号」→ 站点选 自定义 HTTP → 多步录制:把人工签到的过程(F12 →「复制为 cURL」)一步步录进去,点「测试运行」确认能跑通
  2. 回到 🌍 社区站点卡片 → 右侧「导出我的配置」→ 选这个账号 → 📤 导出为社区配置
    • 面板自动把真实 Cookie / token 换成 {{cookie}} 这类占位符,把 https://你的域名/xx 换成 {{site_url}}/xx
    • 再按用到的占位符倒推出「别人要填哪些字段」,所以导出就是一份别人能直接用的配置
  3. 复制或存成 .json → 放到仓库 community/sites/ 并更新 index.json → 开 PR(或先开 Issue 贴出来)

安全:配置里绝不允许带任何凭据。导出时面板会自动清洗,导入时校验器也会直接拒绝带明文 Cookie 的配置。 详细规范(字段速查、PR 检查清单、Discuz 两步示例)见 CONTRIBUTING.md 和 community/README.md。


正常情况用扩展一键复制就够了。下面这些是「不装扩展」时的备用手段,都在面板「添加 / 更新账号」→ 展开「🛠 不装扩展时的手动方式」里:

方式 怎么做 注意
请求头(推荐) 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:三条规则,都好预期:

  1. 到点就跑:到达「签到时间」(各账号可不同),Cron 下一分钟就执行;
  2. 一天只成功一次:当天已经成功过就不再重复(改了时间也一样,不会重复签);
  3. 失败/结果未知会自动补跑:隔 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_KEY Secret,没设就在首次运行时自动生成并存进 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 打一两个接口」的网站。
  • 要写代码(需要特殊逻辑:人机验证、签名、多步浏览器流程):按下面走。

自己加一个内置站点:

  1. 在 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: '签到成功' };
  },
};
  1. 在 src/sites/index.js 的 SITES 里注册。
  2. 重新部署,网页表单会自动出现这个站点。

改扩展:改 public/ext-src/ 下的文件 → 跑 node tools/gen-ext-files.mjs 重新生成 src/ext-files.js → 部署。否则用户下载到的还是旧版扩展。


免责

本项目仅供学习交流。签到接口由各站点提供,若对方改版导致失效,需按新接口调整对应的 src/sites/ 文件。请勿用于非法用途。