XGift

X (Twitter) Premium 礼品兑换平台。你生成兑换码发给用户,用户在网页上输入兑换码和自己的 X 用户名,系统自动完成 Premium 赠送的下单与付款。

  • 兑换页:用户自助兑换,实时显示处理进度
  • 管理后台:生成/停用兑换码、批次文件夹、统计面板、订单状态
  • 安全:凭据逐条 AES-256-GCM 加密存储,付款前逐项校验金额与商户,付款确认只提交一次

截图

以下截图来自本地模拟预览(全部为示例数据):

兑换页 管理页(统计概览)
兑换页 管理页 · 浅色

管理页深色模式:

管理页 · 深色

本地预览(不写任何真实配置)

想先看看界面?只需要 Node.js 22+:

npm ci
npm run build
npm run preview

打开 http://127.0.0.1:4173 是兑换页,http://127.0.0.1:4173/admin 是管理后台。所有数据都是内存示例,不连接真实服务。在兑换页输入 XG- 加 48 个字母 A 可以演示完整成功流程。

部署教程

第一步:准备这些东西

部署前请先准备好以下四样东西,配置向导会逐项询问:

  1. X 登录 Cookie(auth_token 和 ct0):在浏览器登录 x.com 后,按 F12 打开开发者工具 → Application(应用)→ Cookies → https://x.com,复制这两项的值。这是系统以你的 X 账号身份发起赠送的凭据。
  2. 一张用于付款的银行卡:卡号、有效期、CVC,以及发卡行登记的持卡人姓名、账单邮箱和账单国家(两位代码,如 BD)。请只填真实信息。
  3. 代理(可选):服务器能直接访问 x.com 就选「直连」;否则准备一个代理节点。支持 sing-box 的任意 outbound 类型(anytls、socks、http、shadowsocks、vmess、vless、trojan 等),也可以直接粘贴完整 sing-box 配置。
  4. Stripe 公钥:X 结账页面使用的 pk_live_ 开头公钥。使用默认 X Premium 目录时向导会说明;它与商户、商品、价格一起保存在「目录」配置中,也可以完全自定义。

另外需要:一台 Linux 服务器、一个指向该服务器的域名、服务器上安装 Go 1.27+(或在自己电脑上构建后上传二进制)。

第二步:构建

git clone https://github.com/mizorewww/x_gift_bot.git
cd x_gift_bot
npm ci && npm run build        # 构建前端(只需一次,产物已随仓库提交时可跳过)
go build -o bin/xgift ./cmd/xgift
go build -o bin/xgift-web ./cmd/xgift-web

第三步:运行配置向导

./bin/xgift setup

向导会一步步引导你完成配置,全程有中文提示:

  1. 密码文件 — 自动生成一个随机密码用于加密保管库,保存在你指定的路径(默认 sqlite/vault-password,仅本人可读)。请务必备份这个文件,丢失后所有加密数据无法恢复。
  2. X 凭据 — 粘贴第一步准备的两个 Cookie。
  3. 支付卡 — 输入卡信息和账单信息(卡号会自动校验)。
  4. 代理 — 选直连、按提示填 AnyTLS 节点,或粘贴 sing-box 配置;保存前会实际启动验证配置是否有效。
  5. Stripe 公钥 — 粘贴 pk_live_ 公钥。
  6. 商品目录 — 直接回车使用 X Premium 默认目录(3/6 个月套餐),或自定义商户、币种和套餐。
  7. 站点配置 — 输入你的域名(如 https://xp.example.com),向导会生成 site.env 和随机的后台管理员密码(只显示一次,同时保存在文件里)。

完成后运行 ./bin/xgift status,六条记录全部显示 verified 即为成功。

第四步:启动网站

把向导生成的 site.env、admin-password、vault-password 放到安全目录(生产建议 /etc/xgift/,权限 0600),然后:

sudo systemctl link $PWD/deploy/xgift.service   # 或直接复制到 /etc/systemd/system/
# 编辑 deploy/xgift.service 中的路径使其与你的安装位置一致
sudo systemctl enable --now xgift

site.env 各字段含义:

字段 说明
XGIFT_ORIGIN 站点完整域名(https:// 开头)
XGIFT_LISTEN 监听地址,只能回环,如 127.0.0.1:8787
XGIFT_DATA_DIR 数据目录(vault.db、site.db 所在)
XGIFT_PASSWORD_FILE 保管库密码文件路径
XGIFT_ADMIN_PASSWORD_FILE 后台密码文件路径
XGIFT_PAYMENTS_ENABLED true 开放充值,false 暂停(不消耗兑换码)

第五步:配置 HTTPS 反向代理

程序只监听本机端口,需要 Caddy(或任意反向代理)提供 HTTPS。deploy/Caddyfile 是模板,把 xp.example.com 替换成你的域名后放到 Caddy 配置目录并 reload 即可。模板默认只放行 Cloudflare 回源 IP,不用 Cloudflare 时删掉 @cloudflare 相关段、保留 reverse_proxy 即可。

验证:

curl https://你的域名/healthz     # {"ok":true,...} 即成功

第六步:开始使用

浏览器打开 https://你的域名/admin,输入用户名 admin 和向导生成的密码:

  1. 在「生成兑换码」选套餐、数量、批次名,点生成,复制或下载兑换码发给用户。
  2. 顶部「统计概览」随时查看兑换进度和成功率。
  3. 用户打开 https://你的域名,输入兑换码和 X 用户名即可完成充值。

日常维护

./bin/xgift status              # 检查所有加密记录是否完好
./bin/xgift check               # 测试代理能否访问 x.com
./bin/xgift import-chrome       # macOS:从本机 Chrome 重新导入 X Cookie(过期时用)

更新配置用 put(从标准输入读取新值):

echo '新的ct0等JSON' | ./bin/xgift put --name cookies      # 还有 card / proxy / api-auth
echo 'pk_live_新公钥' | ./bin/xgift put --name stripe-key
echo '{"merchant":"acct_...","currency":"bdt","plans":[...]}' | ./bin/xgift put --name catalog

常见问题

密码文件丢了怎么办? 无法恢复。加密数据全部作废,需要删除 vault.db 后重新运行 xgift setup。请把它和数据库一起备份。

X Cookie 过期了? macOS 上用 ./bin/xgift import-chrome 一键刷新;其他系统重新从浏览器复制后用 put --name cookies 更新。

想暂停充值? 把 site.env 里 XGIFT_PAYMENTS_ENABLED 改为 false 并重启服务。用户兑换会被婉拒,兑换码不消耗。

付款结果不明怎么办? 系统宁可标记「待核实」也不会重复扣款。用户用原兑换码点「重新检查并继续兑换」即可自动核对,确认成功后自动补上状态。

升级程序? 重新构建两个二进制,备份数据目录和密码文件,替换后 systemctl restart xgift。不要覆盖线上数据库。

数据与安全

  • vault.db:所有敏感信息(Cookie、卡、代理、订单)逐条 AES-256-GCM 加密,密钥由密码文件派生。没有密码文件谁也读不了。
  • site.db:兑换码只存摘要和尾号,不存明文;用户名、状态为明文。请限制文件权限。
  • 所有密钥文件均为 0600(仅本人可读);后台使用 HTTPS Basic Auth;接口有限流和同源校验。
S
Description
X Premium gift CLI and redemption site
xp.kfcv50.today
Readme MIT
15 MiB
0 Stars 1 Watchers 0 Forks
Languages
Go 55.7%
TypeScript 37.7%
JavaScript 4.4%
Python 1.4%
HTML 0.8%