banner
约 5,100 字
17 分钟

拼多多福袋互助平台部署(网页版):全程浏览器点选,零终端上线

拼多多福袋互助平台部署(网页版):全程浏览器点选,零终端上线

摘要

拼多多福袋互助平台网页版部署:注册 Cloudflare、建 D1、粘贴 170KB 单文件代码、绑定变量与 Cron 定时清空,复制粘贴 15 分钟免费上线,无需终端。

拼多多福袋互助平台部署(网页版):全程浏览器点选,零终端上线

这是《拼多多福袋互助平台部署(命令行版)》的姐妹篇。如果你连终端都不想打开——这篇就是为你准备的:全程在浏览器里点点点,不装任何软件,不用命令行,会复制粘贴就能部署,预计耗时 10~15 分钟。

版本对应:项目当前版本 0.9.2(2026-09-13,更新日志见仓库的 CHANGELOG.md)。整个站点就一个 src/index.js 文件(3586 行、约 170 KB),跑在 Cloudflare Workers + D1 上——零服务器、零成本、不需要备案。

三个入口,按需取:

🤖 顺便安利:教程里的 Skill、自动部署这些能力都来自 WorkBuddy——一个能帮你干活、写代码、发文章的 AI 助手。如果你还没用过,欢迎通过我的邀请链接注册:https://www.workbuddy.cn/events/invite?inviteCode=89uwntcjsnkvg

开始之前:确认这本教程适合你

本教程(纯网页部署)

命令行部署

需要装软件

不用

Node.js + Wrangler

获取源码

从 GitHub 网页复制

git clone

提交 / 取码 / 举报 / 黑名单 / 后台管理

✅ 全部可用

✅ 全部可用

识别截图(秒出互助码)

✅ 可用

✅ 可用

AI 识图兜底(可选)

✅ 可用(做第 6.2 步的 AI 绑定即可)

✅ 可用

部署完成后的样子(演示站桌面版):

部署完成后的站点首页(桌面版):邀请码输入、识别截图与今日统计
部署完成后的站点首页(桌面版):邀请码输入、识别截图与今日统计

两种方式功能完全一致。「识别截图」用的是内联在 src/index.js 里的像素匹配算法——不依赖任何需要额外上传的静态资源(早期版本曾用 tesseract.js,要拖一个 20MB 的模型包,那种方案网页版确实用不了)。所以只靠粘贴一个代码文件的网页版,同样能秒出结果、且图片不出本机。

唯一可选的是 AI 识图兜底:本地没认出码时,把图片再交给 Cloudflare Workers AI 试一次。需要在第 6.2 步绑定,不做也不影响识别截图。

整体流程一览

纯文本
注册 Cloudflare 账号
       ↓
创建 D1 数据库 (pdd-fudai-db)
       ↓
执行 SQL 建表 (6 张表 + 15 个索引)
       ↓
创建 Worker (pdd-fudai)
       ↓
从 GitHub 复制 src/index.js(Raw / Copy raw file)→ 粘贴 → Deploy
       ↓
Settings → Bindings → 添加 D1 绑定 (变量名: DB)
       ↓
Settings → Bindings → 添加 Workers AI 绑定 (变量名: AI)  ← 可选兜底
       ↓
Settings → Variables → 添加 ADMIN_KEY (Secret)
       ↓
Settings → Triggers → 添加 Cron (59 15 * * *)
       ↓
重新 Deploy → 访问网址 → 🎉上线
       ↓
(可选)绑定自定义域名 → /admin 进后台

第 1 步:注册 Cloudflare 账号

  1. 打开 https://dash.cloudflare.com/sign-up;

  2. 输入邮箱和密码,点 Create Account;

  3. 去邮箱收验证邮件,点验证链接;

  4. 登录成功(已有账号的直接登录)。

第 2 步:创建 D1 数据库

D1 是 Cloudflare 的免费 SQLite 数据库,用来存邀请码、黑名单等数据。

  1. 登录后,在左侧菜单找到 Storage & Databases;

  2. 点 D1 SQL Database → Create Database;

  3. Database name 填:pdd-fudai-db;

  4. 点 Create。

创建完成后停留在数据库页面,下一步还要回来。

第 3 步:建数据库表

  1. 在数据库页面点 Console(控制台)标签页,你会看到一个 SQL 输入框;

  2. 把下面的 SQL 全部复制,粘贴到输入框里:

SQL
-- 邀请码表
CREATE TABLE IF NOT EXISTS codes (
  id INTEGER PRIMARY KEY AUTOINCREMENT,
  code TEXT NOT NULL,              -- 完整邀请码 (8-9位数字)
  code_masked TEXT NOT NULL,       -- 脱敏后的码 (中间两位隐藏)
  ip TEXT NOT NULL,                -- 提交者IP
  status TEXT DEFAULT 'active',    -- active / used
  used_at TEXT,                    -- 被点击跳转的时间
  created_at TEXT NOT NULL,        -- 提交时间
  location TEXT DEFAULT ''         -- 提交者归属地 (如: 嘉兴市 电信)
);

-- IP 黑名单表
CREATE TABLE IF NOT EXISTS blacklist (
  id INTEGER PRIMARY KEY AUTOINCREMENT,
  ip TEXT NOT NULL UNIQUE,         -- 被拉黑的IP
  reason TEXT DEFAULT '',          -- 拉黑原因
  location TEXT DEFAULT '',        -- 归属地 (如: 嘉兴市 电信)
  duration TEXT DEFAULT '24h',     -- 封禁期限: 24h / 1m / 1y / permanent
  expires_at TEXT,                 -- 过期时间 (NULL表示永久)
  created_at TEXT NOT NULL         -- 拉黑时间
);

-- 假码举报表
CREATE TABLE IF NOT EXISTS reports (
  id INTEGER PRIMARY KEY AUTOINCREMENT,
  code TEXT NOT NULL,              -- 被举报的邀请码 (脱敏展示)
  ip TEXT NOT NULL,                -- 举报人IP
  submitter_ip TEXT DEFAULT '',    -- 被举报码的提交者IP (用于自动拉黑判断)
  status TEXT DEFAULT 'pending',   -- pending / handled / dismissed
  created_at TEXT NOT NULL         -- 举报时间
);

-- 提交日志表 (用于速率限制和审计)
CREATE TABLE IF NOT EXISTS submit_logs (
  id INTEGER PRIMARY KEY AUTOINCREMENT,
  ip TEXT NOT NULL,
  code TEXT,
  action TEXT NOT NULL,            -- submit / use / blocked / ocr_ai / admin_fail
  reason TEXT DEFAULT '',
  created_at TEXT NOT NULL
);

-- 访问统计表(首页每次访问记录一次,供今日访问量/IP 统计)
CREATE TABLE IF NOT EXISTS visits (
  id INTEGER PRIMARY KEY AUTOINCREMENT,
  ip TEXT NOT NULL,
  created_at TEXT NOT NULL
);

-- 站点设置表 (公告、广告、联系方式等)
CREATE TABLE IF NOT EXISTS settings (
  key TEXT PRIMARY KEY,            -- notice / ads / qq_group / qq_owner / smart_enabled ...
  value TEXT,                      -- 内容 (ads 存 JSON 数组)
  updated_at TEXT NOT NULL
);

-- 索引:加速查询
-- 注意:限流/统计类查询都是 (ip, action, created_at) 三条件组合,
-- 单列索引 idx_logs_ip 会先扫出该 IP 的所有历史日志再过滤,量大后明显变慢;
-- 复合索引可直接命中。
CREATE INDEX IF NOT EXISTS idx_codes_status ON codes(status);
CREATE INDEX IF NOT EXISTS idx_codes_created ON codes(created_at);
-- 列表查询:WHERE status=? ORDER BY created_at DESC
CREATE INDEX IF NOT EXISTS idx_codes_status_created ON codes(status, created_at);
-- 重复提交检查:WHERE code=? AND status IN (...)
CREATE INDEX IF NOT EXISTS idx_codes_code ON codes(code);
-- used 码 30 秒轮换清理:WHERE status='used' AND used_at < ?
CREATE INDEX IF NOT EXISTS idx_codes_used_at ON codes(used_at);

CREATE INDEX IF NOT EXISTS idx_blacklist_ip ON blacklist(ip);
CREATE INDEX IF NOT EXISTS idx_blacklist_created ON blacklist(created_at);

-- 限流三件套:checkRateLimit / checkDailyLimit / checkActionRateLimit
CREATE INDEX IF NOT EXISTS idx_logs_ip_action_created ON submit_logs(ip, action, created_at);
-- 旧的单列 ip 索引已被上面的复合索引完全覆盖(ip 为最左前缀),保留只会增加写放大
DROP INDEX IF EXISTS idx_logs_ip;
-- 今日统计:WHERE created_at > ? AND action = ?
CREATE INDEX IF NOT EXISTS idx_logs_action_created ON submit_logs(action, created_at);
CREATE INDEX IF NOT EXISTS idx_logs_created ON submit_logs(created_at);

-- visits 限流(WHERE ip=? AND created_at>?)与今日统计
CREATE INDEX IF NOT EXISTS idx_visits_created ON visits(created_at);
CREATE INDEX IF NOT EXISTS idx_visits_ip_created ON visits(ip, created_at);

CREATE INDEX IF NOT EXISTS idx_reports_status ON reports(status);
-- 举报防刷:WHERE ip=? AND created_at>?
CREATE INDEX IF NOT EXISTS idx_reports_ip_created ON reports(ip, created_at);
-- 自动拉黑判定:WHERE submitter_ip=? AND created_at>?
CREATE INDEX IF NOT EXISTS idx_reports_submitter_created ON reports(submitter_ip, created_at);
  1. 点 Execute,看到绿色 Success 就建好了(6 张表 + 15 个索引)。

⚠️ 千万别漏掉 visits 表和那几条索引。 首页的「今日访问量」统计会读 visits 表,表不存在的话 /api/config 接口会直接报错,打开首页就是白屏。限流接口也依赖 idx_logs_ip_action_created,缺了会退化成全表扫描。 这份 SQL 与仓库里的 schema.sql 完全一致。将来代码更新时,判断依据以仓库文件为准——在 GitHub 打开它,点右上角 Copy raw file 复制全部内容,再粘到这里执行即可(重复执行是安全的,所有语句都带 IF NOT EXISTS)。

第 4 步:创建 Worker

  1. 回到 Cloudflare 主页(点左上角 logo);

  2. 左侧菜单 Workers & Pages → Create → Create Worker;

  3. Name 填:pdd-fudai;

  4. 点 Deploy(先随便部署,下一步替换代码);

  5. 部署完成后点 Edit code 进入代码编辑器。

第 5 步:获取代码并粘贴到编辑器

5.1 从 GitHub 复制代码(不用装任何软件)

  1. 用浏览器打开源码页面:https://github.com/jjsxjxj/pdd-fudai/blob/main/src/index.js;

  2. 点代码框右上角的 Copy raw file(复制原始文件)按钮——整份代码会复制到剪贴板;

  3. 如果没看到这个按钮:点右上角的 Raw,在新打开的纯文本页面里按 Ctrl+A 全选、Ctrl+C 复制。

⚠️ 不要在 GitHub 的代码预览页直接 Ctrl+A 复制。 预览页每一行开头都带着行号,粘进编辑器后整份代码都会报语法错误。必须用 Copy raw file 按钮或 Raw 页面。 网盘下载的包里也有同一份 src/index.js,两边可以互相校验。

5.2 粘贴并部署

  1. 回到 Cloudflare 代码编辑器(左边是代码区,右边是预览区);

  2. 把左边代码区里的内容全部删掉(点进代码区,Ctrl+A 全选,再按 Delete);

  3. Ctrl+V 粘贴刚才复制的代码;

  4. 等代码加载完(文件约 170 KB、3586 行,粘贴后等 2~3 秒);

  5. 检查代码:开头应是 `/,结尾应是 };`**。如果被截断了,说明没复制完整,回到 5.1 重来;

  6. 点右上角 Deploy(部署)。

第 6 步:绑定数据库与 AI

6.1 绑定数据库(必须)

Worker 要连上第 2 步的数据库才能工作。

  1. 回到 Worker 页面(不是代码编辑器),点 Settings;

  2. 找到 Bindings,点 Add binding → 选 D1 database;

  3. 填写:

  • Variable name:DB(必须是大写的 DB,不能写错);

  • D1 database:下拉选中 pdd-fudai-db;

  1. 点 Save。

⚠️ 变量名是最大的坑:代码里用的是 env.DB,绑定时就得填 DB。填成 db、database 之类的,运行时直接报错,首页白屏。

6.2 绑定 Workers AI(AI 识图兜底,可选)

不绑定也能用「识别截图」——本地像素识别内联在页面代码里,不需要任何额外资源。绑定 AI 只是多一层兜底:本地没认出码时,自动把图片再交给 AI 试一次。不想要这层兜底,可以直接跳过本步。

  1. 仍在 Settings → Bindings 区域,点 Add binding;

  2. 类型选 Workers AI;

  3. Variable name 填 AI(大写);

  4. 点 Save;

  5. 回到代码编辑器,点一次 Deploy 让绑定生效。

识别方式说明:识别截图先在浏览器里做本地像素识别(不联网、图片不出本机、毫秒级);只有本地没认出或置信度偏低时,才会走服务端 AI(此时图片会发给 Cloudflare Workers AI 模型处理,每 IP 每分钟限 10 次)。 想启用这层兜底:登录后台 → 站点设置 → 把 识别截图模式 选成「本地识别 + AI 兜底」。

第 7 步:设置管理密码

  1. 在 Settings 页面,找到 Variables and Secrets;

  2. 点 Add variable:

  • Variable name:ADMIN_KEY;

  • Value:自己想一个强密码(比如 mySecret123!@#);

  • Type:选 Secret(加密存储,更安全);

  1. 点 Save。

⚠️ 请牢记这个密码——它是进后台的钥匙,丢了只能删掉重建。

第 8 步:设置定时清空

让平台每天 23:59 自动清空互助码,零点开始新一天:

  1. Settings 页面找到 Triggers → Cron Triggers;

  2. 点 Add Cron Trigger;

  3. 填入 Cron 表达式:59 15 * * *;

  4. Save。

为什么是 59 15? Cloudflare Cron 用的是 UTC 时间,中国时间 = UTC + 8。所以「北京时间 23:59」要写「UTC 15:59」。

常用换算对照:

中国时间

Cron 表达式

23:59

59 15 * * *

00:00

0 16 * * *

06:00

0 22 * * *

12:00

0 4 * * *

Cron 最多延迟几分钟触发属正常现象;即使没触发,用户下次访问也会触发懒清理兜底。

第 9 步:重新部署上线

  1. 回到 Worker 主页面,点 Edit code;

  2. 什么都不用改,直接点右上角 Deploy(让绑定和变量生效);

  3. 显示 "Deployed" 就完成了 🎉

你的网址是:https://pdd-fudai.<你的子域名>.workers.dev,在 Worker 主页顶部能看到。

大陆用户注意:workers.dev 域名在中国大陆可能打不开,解决方案见下一步。

第 10 步:绑定自定义域名(可选,但推荐)

有自己的域名体验更好:网址短好记,全球可访问。

域名先接入 Cloudflare(如果还没接入):

  1. Cloudflare 主页 → Add a Site → 输入域名 → 选 Free 计划;

  2. 按提示去域名注册商把 NS 记录改成 Cloudflare 给的两组地址;

  3. 等待生效(几分钟到几小时)。

然后给 Worker 加自定义域名:

  1. 进入 Worker → Settings → Domains & Routes;

  2. 点 Add Custom Domain;

  3. 输入想用的子域名,比如 fudai.yourdomain.com;

  4. 点 Add Domain,DNS 记录会自动创建,不需要手动设置;

  5. 再点一次 Deploy 让域名生效。

之后就可以用 https://fudai.yourdomain.com 访问了。

第 11 步:进入后台管理

  1. 在网址后面加 /admin,例如 https://fudai.yourdomain.com/admin;

  2. 输入第 7 步设置的 ADMIN_KEY;

  3. 登录,后台功能一览:

标签页

功能

数据统计

活跃码数、已使用、黑名单数、今日提交/访问/拦截、待处理举报

站点设置

公告、广告位、弹窗广告标题、QQ 群/站长 QQ、智能直达开关、刷新间隔(3~30 秒)、识别截图模式、iOS 快捷指令地址、每分钟/每日提交上限

邀请码管理

查看所有码(含完整码)、归属地、状态,可手动删除

IP 黑名单

添加/移除,支持封禁期限(24h/1 月/1 年/永久),自动获取归属地,过期自动解禁

举报管理

处理/驳回/删除假码举报,提交者 IP 脱敏显示

提交日志

分页查看所有提交记录,审计异常行为

识别截图模式怎么选:默认 local(仅本地像素识别,秒出、不消耗 AI 额度)——建议保持默认;想让本地没认出时自动交给 AI,再改成「本地识别 + AI 兜底」(需要第 6.2 步的 AI 绑定)。 自动拉黑规则:某个提交者的 IP 在 24 小时内被 3 个以上不同举报人举报,系统会自动拉黑该 IP(默认 24 小时)。

加餐:连复制粘贴都省了?用 Skill 让 AI 帮你部署

如果你在用 WorkBuddy(或其他支持 Skill 的 AI 助手),还有一个终极偷懒方案——这套部署流程被打包成了 cloudflare-workers-deploy Skill。装好之后,直接跟 AI 说「帮我部署一个项目到 Cloudflare」,它会全程引导你:该点哪个按钮、SQL 贴哪里、报错了怎么排查,都不用自己翻教程。

安装 Skill

方式一:对话安装(推荐)

在 WorkBuddy 对话框直接输入:

纯文本
安装 skill cloudflare-workers-deploy

WorkBuddy 会自动搜索并完成安装,Skill 会存放在 ~/.workbuddy/skills/cloudflare-workers-deploy/。

方式二:手动安装

从上面的网盘链接下载 cloudflare-workers-deploy.zip,解压到 ~/.workbuddy/skills/cloudflare-workers-deploy/,重启 WorkBuddy 会话后 Skill 会被自动发现。

验证安装

安装后随便说一句:

我不用命令行,能在网页上部署到 Cloudflare 吗?

AI 能识别意图并开始引导你走网页部署流程,就说明装好了。它会依次询问:

  1. 选择部署路径(命令行 / 网页在线);

  2. 是否已有 Cloudflare 账号;

  3. 是否需要绑定自定义域名;

  4. 是否需要配置定时任务。

按你的回答给出对应步骤,报错直接把错误信息发给它即可。

Skill 包内含:SKILL.md(流程入口)、references/deploy-web.md(本文完整版)、references/deploy-cli.md(命令行版教程)、assets/schema.sql(建表脚本)、assets/wrangler.toml(配置模板)。

常见问题

Q: 打开网站白屏?

按顺序检查:

  1. 代码有没有粘贴完整(开头 /**,结尾 };);

  2. D1 绑定变量名是不是大写的 DB;

  3. visits 表建了没有——首页的「今日访问量」要读它,缺了会让 /api/config 接口报错、页面直接白屏。把第 3 步的 SQL 重新完整执行一遍即可(所有语句都带 IF NOT EXISTS,重复执行安全);

  4. 数据库表有没有全部建成功;

  5. 改完绑定之后,有没有回代码编辑器点过一次 Deploy;

  6. 去 Worker 页面的 Real-time Logs 看具体报错。

Q: 点「识别截图」没反应,或提示识别失败?

识别截图的第一道是本地像素识别(秒出、不联网),所以先检查图片本身:

  1. 确认选的是拼多多的福袋分享图或手机整屏截图,码清晰可见、没被裁掉边缘;

  2. 图片别太大(超过 4MB 会被直接拒绝);

  3. 本地没认出码时,页面会提示「没识别到邀请码,请手动输入」——直接手输即可;想让系统自动改用 AI 再试一次,需要做第 6.2 步的 Workers AI 绑定,并在后台把 识别截图模式 设为「本地识别 + AI 兜底」;

  4. 弹窗里的识别结果可以手动改——码区原图就在上面,对照着改完再点「确认提交」。

如果 AI 兜底也失败,多半是调用频率限制(同一 IP 每分钟 10 次),稍等再试。

Q: workers.dev 打不开?

大陆网络下可能被屏蔽。绑定自己的域名(第 10 步)即可解决。

Q: 后台提示密码错误?

Worker → Settings → Variables and Secrets → 删掉旧的 ADMIN_KEY → 重新 Add variable(名称 ADMIN_KEY,Type 选 Secret)→ 再 Deploy 一次。

Q: IP 归属地显示英文?

归属地走的是「本地优先」链路:

  1. 本地优先:IPv6 或内网地址直接跳过外部查询(百度和 ipwho.is 都是 IPv4 库,对 IPv6 只能返回空或限流报错),改用 Cloudflare 自带数据;

  2. 百度开放数据 API(全中文)— 首选;

  3. ipwho.is(HTTPS,中文地名)— 备用;

  4. Cloudflare 自带数据 — 兜底,且会经过内置的中文城市/省份映射表转成中文。

所以显示英文已经很少见;失败结果也会进缓存,不会每次提交都白跑。归属地只影响展示,不影响功能。

Q: 提示「提交过于频繁」?

防刷规则生效:同一 IP 1 分钟最多 5 次、1 天最多 30 次。等一会儿再试。

Q: 怎么查看数据库数据?

Cloudflare 主页 → Storage & Databases → D1 → pdd-fudai-db → Console,输入 SQL 点 Execute。例如:

SQL
SELECT * FROM codes;        -- 查看所有码
SELECT * FROM blacklist;    -- 查看黑名单
DELETE FROM codes;          -- 手动清空所有码

Q: 免费额度够用吗?

Workers 每天 100,000 次请求、D1 免费 5GB、Cron Trigger 免费。个人互助平台完全够用。

Q: 以后怎么更新代码?

Worker → Edit code → 改完点 Deploy,几秒上线。右边就是实时预览。如果只改了这些设置项(公告、广告、识别模式、限流阈值),直接在后台改就行,不用碰代码。

写在最后

网页版和命令行版的分界线很简单:

  • 只部署一次、不想折腾环境 → 网页版(本文),10 分钟搞定;

  • 经常改代码、要本地调试 → 命令行版,wrangler deploy 一键更新;

  • 连教程都懒得翻 → 装 cloudflare-workers-deploy Skill,让 AI 全程引导(见上文加餐)。

两篇对照着看,这个拼多多福袋邀请码互助平台从零到上线就全齐了。部署遇到问题欢迎评论区留言。

END