Skip to content

tear-shepp/NumberKeeper-Telegram

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

80 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

NumberKeeper-Telegram

基于 Number-preservation 6.3 增强的 eSIM / 实体卡保号看板,支持 Telegram Bot 交互、Cloudflare KV 配置、GitHub Actions 自动部署、Webhook 自动设置、一键续期和按钮化平台管理。

来源致谢

本项目基于 GeniusZeroTwo 的 Number-preservation 改造和扩展,保留原项目主体框架,并在此基础上增加 Telegram Bot 管理能力、自动化部署说明和运行时配置说明。

上游原仓库:https://github.com/GeniusZeroTwo/Number-preservation

📸 界面预览 / Screenshots

image image

教程

🛠️ 极简部署指南 / Deployment Guide

部署过程全程在网页端完成,小白也能在 5 分钟内搞定。

Fork 后会发生什么

Fork NumberKeeper-Telegram 后,代码、README、wrangler.toml.github/workflows/deploy.yml 会复制到你的仓库里,但 GitHub Secrets、GitHub Variables 和 Cloudflare KV 数据不会复制。

这意味着你第一次 Sync Fork、push 到 main,或者 GitHub 自动运行 Deploy Worker 时,可能会看到部署失败。最常见的原因不是代码坏了,而是新仓库还没有配置 CLOUDFLARE_KV_IDCLOUDFLARE_API_TOKENTG_BOT_TOKENWORKER_URL

如果日志里看到类似下面的内容:

kv_namespaces[0] bindings should have a string "id" field but got {"binding":"ESIM_DB","id":""}

说明 CLOUDFLARE_KV_ID 没有配置,或者配置值为空。把下面步骤 3 的 Secrets / Variables 补齐后,重新运行 Actions 的 Re-run jobs 即可;也可以等你下一次 push 到 main 时自动重新部署。

准备工作

  1. 准备一个 Cloudflare 账号。
  2. 准备一个 Telegram 账号,搜索 @BotFather 发送 /newbot 创建一个机器人,记录下 Bot Token
  3. 搜索 @userinfobot 发送任意消息,记录下你的数字 Chat ID
  4. 主动给你刚建的机器人发送任意一条消息激活它(机器人不能主动发起会话)。

步骤 1:创建 KV 数据库

  1. 登录 Cloudflare 控制台,左侧菜单找到 Workers & Pages -> KV
  2. 点击 Create a namespace,命名为 esim_db,点击添加。
  3. 创建成功后,复制它旁边长长的一串 ID(比如 09fe63fac...)备用。

步骤 2:Fork 本仓库并确认 wrangler.toml 占位符

  1. 将本项目 Fork 到你自己的 GitHub 账号下。

  2. 在你 Fork 后的仓库中,打开 wrangler.toml 文件。

  3. 确认最下方的 KV 配置保持占位符形式,不要写死你的真实 KV ID:

    [[kv_namespaces]]
    binding = "ESIM_DB"
    id = "${KV_ID}"
  4. 不要把自己的真实 KV ID 提交到代码里。真实 KV ID 后面会放到 GitHub Secrets,由 GitHub Actions 在部署前自动替换。

这样做的好处是:以后你同步原作者仓库更新时,wrangler.toml 不需要反复手动改 ID,也不会把个人配置写进公开代码。

步骤 3:配置 GitHub Actions Secrets

项目使用 .github/workflows/deploy.yml 自动部署到 Cloudflare。这个文件不会保存你的真实密钥,而是从 GitHub Secrets 中读取。

新环境部署时,这一步必须重新配置。GitHub 不会把原仓库的 Secrets / Variables 复制到你的 Fork 或新仓库。

进入你自己的 GitHub 仓库页面,按下面步骤配置:

  1. 点击顶部的 Settings

  2. 左侧找到 Secrets and variables,展开后点击 Actions

  3. 点击 New repository secret,添加第一个密钥:

    Name: CLOUDFLARE_KV_ID
    Secret: 你的 Cloudflare KV Namespace ID
    
  4. 再点击 New repository secret,添加第二个密钥:

    Name: CLOUDFLARE_API_TOKEN
    Secret: 你的 Cloudflare API Token
    
  5. 再点击 New repository secret,添加第三个密钥:

    Name: TG_BOT_TOKEN
    Secret: 你的 Telegram Bot Token
    
  6. 切换到 Variables,点击 New repository variable,添加 Worker 访问地址:

    Name: WORKER_URL
    Value: https://你的 Worker 域名
    

    示例:

    https://esim-api.xxx.workers.dev
    

CLOUDFLARE_KV_ID 用来替换 wrangler.toml 里的 ${KV_ID}CLOUDFLARE_API_TOKEN 用来授权 GitHub Actions 把 Worker 部署到你的 Cloudflare 账号。TG_BOT_TOKENWORKER_URL 用来在部署完成后自动设置 Telegram Webhook。

Cloudflare API Token 建议使用最小权限:能编辑 Workers,并能读取账号资源。Telegram Bot Token 和 Cloudflare API Token 都只保存到 GitHub Secrets,不要写进 README、代码或聊天记录。

配置位置对应关系:

配置项 放在哪里 用途
CLOUDFLARE_KV_ID GitHub Actions Secret 部署前替换 wrangler.toml 里的 ${KV_ID}
CLOUDFLARE_API_TOKEN GitHub Actions Secret 授权 GitHub Actions 部署 Cloudflare Worker。
TG_BOT_TOKEN GitHub Actions Secret 部署后自动调用 Telegram setWebhook
WORKER_URL GitHub Actions Variable 生成 Webhook 地址,例如 https://你的域名/api/telegram/webhook
TG_BOT_TOKEN Cloudflare KV Worker 运行时给 Telegram 发送消息。
TG_CHAT_ID Cloudflare KV 限制只有你的 Telegram 账号能操作机器人。

步骤 4:理解 .github/workflows/deploy.yml 的作用

.github/workflows/deploy.yml 是 GitHub Actions 自动部署脚本。你向 main 分支推送代码,或者 Sync Fork 后产生新的提交时,它会自动执行。

当前流程做了四件事:

  1. 拉取仓库代码:

    - name: Checkout Code
      uses: actions/checkout@v4
  2. 部署前把 wrangler.toml 里的 ${KV_ID} 替换成 GitHub Secrets 里的真实 KV ID:

    - name: Replace KV ID Placeholder
      run: sed -i 's/${KV_ID}/${{ secrets.CLOUDFLARE_KV_ID }}/g' wrangler.toml
  3. 使用 Cloudflare 官方 wrangler-action 部署 Worker:

    - name: Deploy to Cloudflare Workers
      uses: cloudflare/wrangler-action@v3
      with:
        apiToken: ${{ secrets.CLOUDFLARE_API_TOKEN }}
  4. 部署完成后自动设置 Telegram Webhook:

    - name: Set Telegram Webhook
      env:
        TG_BOT_TOKEN: ${{ secrets.TG_BOT_TOKEN }}
        WORKER_URL: ${{ vars.WORKER_URL }}
      run: |
        WEBHOOK_URL="${WORKER_URL%/}/api/telegram/webhook"
        curl --fail --show-error --silent --request POST "https://api.telegram.org/bot${TG_BOT_TOKEN}/setWebhook" \
          --data-urlencode "url=${WEBHOOK_URL}"
        echo "Telegram webhook set to ${WEBHOOK_URL}"

所以日常更新时,你只需要把代码推送到自己的 GitHub 仓库,GitHub Actions 会自动完成 KV ID 替换、Worker 部署和 Telegram Webhook 设置。

步骤 4.1:第一次部署失败怎么办

如果 Fork 后第一次 Deploy Worker 失败,先看失败位置:

失败位置 常见原因 处理方式
Replace KV ID Placeholderid = "" CLOUDFLARE_KV_ID 没有配置或为空 回到步骤 3 添加 GitHub Secret。
Deploy to Cloudflare Workers 报认证失败 CLOUDFLARE_API_TOKEN 没有配置、填错或权限不足 重新创建 Cloudflare API Token,并保存到 GitHub Secret。
Set Telegram Webhook 失败 TG_BOT_TOKENWORKER_URL 没有配置 补齐 GitHub Secret TG_BOT_TOKEN 和 Variable WORKER_URL
Telegram 机器人不回复 Cloudflare KV 没有 TG_BOT_TOKENTG_CHAT_ID 回到步骤 6,在 KV 中添加运行时配置。

补齐配置后有两种方式重新部署:

  1. 在 GitHub Actions 失败记录里点击 Re-run jobs
  2. main 分支推送一次新提交,让 workflow 自动重新运行。

如果你已经确认 origin 或 Cloudflare Pages/Workers 正在部署,不需要额外重新部署,只要保证新环境的 Secrets、Variables 和 KV 已经补齐即可。

步骤 5:在 Cloudflare 部署

  1. 在 Cloudflare 左侧菜单点击 Workers & Pages -> Overview
  2. 点击右上角 Create Application,选择 Workers 选项卡,然后点击 Connect to Git
  3. 授权连接你的 GitHub 账号,选择你刚刚 Fork 的仓库。
  4. 关键配置(Setup build 区域):
    • Root directory (根目录):留空
    • Build command (构建命令):留空
    • Entry point (入口点):手动输入 worker/worker.js
  5. 点击 Save and Deploy,等待系统部署完成(出现绿色对勾),点击 Continue to project

如果你已经配置了 GitHub Actions,也可以直接向 main 分支 push 代码,让 .github/workflows/deploy.yml 自动部署。

步骤 6:在 KV 数据库中添加 TG 密钥

由于 Cloudflare 的环境变量偶尔会有部署延迟的 Bug,我们直接将验证密钥存入 KV 数据库,100% 稳定触发:

  1. 回到 Cloudflare 左侧菜单,找到 Workers & Pages -> KV
  2. 点击进入你在步骤 1 创建的 esim_db 详情页。
  3. 点击顶部的 KV Entries (KV 条目) 选项卡。
  4. 在此处手动添加两条数据:
    • Key (键) 填 TG_BOT_TOKEN,Value (值) 填你的机器人 Token。点击 Add (添加)
    • Key (键) 填 TG_CHAT_ID,Value (值) 填你的数字 ID。点击 Add (添加)

步骤 7:设置 Telegram 机器人 Webhook

如果你已经按步骤 3 配置了 TG_BOT_TOKENWORKER_URL,GitHub Actions 会在每次部署后自动设置 Webhook,通常不用手动打开链接。

如果你想手动设置,或需要排查自动设置是否成功,可以继续使用下面的备用方法。

  1. 先确认 Worker 已经部署成功,并记下你的 Worker 访问地址,例如:

    https://esim-api.xxx.workers.dev
    
  2. 在浏览器打开下面的链接,把 <TG_BOT_TOKEN> 换成你的机器人 Token,把 <你的Worker域名> 换成上面的 Worker 地址:

    https://api.telegram.org/bot<TG_BOT_TOKEN>/setWebhook?url=<你的Worker域名>/api/telegram/webhook
    
  3. 如果返回类似下面的内容,就表示 Webhook 设置成功:

    {"ok":true,"result":true,"description":"Webhook was set"}
  4. 安全限制:机器人只处理 TG_CHAT_ID 对应用户发来的消息。其他人就算知道机器人,也不能添加或查看你的号码数据。

  5. 如果要检查当前 Webhook 是否已经设置成功,可以打开:

    https://api.telegram.org/bot<TG_BOT_TOKEN>/getWebhookInfo
    

步骤 8:开始使用!

由于密钥直接存入了数据库,配置会立即生效,无需等待!
现在访问 Cloudflare 为你分配的 Worker 域名(例如 https://esim-api.xxx.workers.dev),点击“向 TG 机器人获取验证码”,开始享受你的保号面板吧!

也可以打开 Telegram,向你的机器人发送 /start 查看欢迎说明和添加号码流程,或发送 /help 查看可用命令。

新环境部署检查清单

正式使用前,按下面顺序检查:

  • Cloudflare KV namespace 已创建,并拿到了 KV ID。
  • GitHub Secret CLOUDFLARE_KV_ID 已填写真实 KV ID。
  • GitHub Secret CLOUDFLARE_API_TOKEN 已填写可部署 Worker 的 API Token。
  • GitHub Secret TG_BOT_TOKEN 已填写 Telegram Bot Token。
  • GitHub Variable WORKER_URL 已填写你的 Worker 访问地址。
  • Cloudflare KV 已添加 TG_BOT_TOKEN
  • Cloudflare KV 已添加 TG_CHAT_ID
  • GitHub Actions 的 Deploy Worker 已成功运行。
  • Telegram getWebhookInfo 显示 webhook 指向 <WORKER_URL>/api/telegram/webhook
  • Telegram 中 /start/help/list/add/renew/platform 可正常使用。

🤖 Telegram 机器人功能说明

设置 Webhook 后,Telegram 机器人不仅能接收登录验证码和到期提醒,还可以直接管理保号数据。机器人写入的数据会保存到同一个 KV key:esim_list,所以网页端和 Telegram 端看到的是同一份号码列表。

安全规则:机器人只处理 TG_CHAT_ID 对应账号发来的消息,其他 Chat ID 会被直接忽略,不会回复,也不会写入数据。

命令总览

/start  查看欢迎说明
/help   查看可用命令
/list   查看当前号码列表
/add    按步骤添加一个新号码
/renew  一键续期,使用 /renew 序号 快速操作
/skip   跳过当前选填字段
/site   显示网站访问链接
/platform 按钮化管理已注册平台
/cancel 取消当前未完成的添加流程

命令详情

命令 作用
/start 显示欢迎说明、完整添加号码流程,并含导航按钮。
/help 只显示可用命令列表,并含导航按钮。
/list 查看当前已保存的号码列表,包括卡片名称、号码、到期日、周期、平台和备注,并含导航按钮。
/add 启动逐步添加号码流程。每步提示和错误校验都含导航按钮,方便随时跳转。
/renew 一键续期,/renew(无参数)显示列表并含导航按钮;/renew 序号 直接续期,不含按钮。
/skip 在选填字段中跳过当前项,只能用于手机号、已注册平台、备注 / 保号要求。
/site 显示网页看板访问链接。
/platform 打开按钮化平台管理入口,可新增、删除、重命名或清空某个号码的已注册平台。
/cancel 取消当前未完成的添加流程,并清理临时会话。

导航按钮

发送 /start/help/list/site/renew(无参数)、/platform/add 流程中,机器人回复下方都会常驻导航按钮:

[添加号码] [查看列表]
[打开网站] [帮助]
[一键续期] [修改平台]

按钮对应动作:

按钮 等同命令
添加号码 /add
查看列表 /list
打开网站 /site
帮助 /help
一键续期 /renew
修改平台 /platform

按钮只是快捷入口,不会改变原有命令。以下命令回复不带导航按钮:

  • /renew N 续期结果
  • /cancel 取消确认

机器人每天会在授权用户首次交互时,额外显示一次底部输入框旁的 /start 按钮。这个按钮使用 Telegram 的一次性键盘,点击或使用后会自动收起;同一天不会重复显示,第二天再次交互时会重新出现一次。

使用 /add 添加号码

发送 /start 可以查看完整添加号码流程说明。

发送 /add 后,机器人会按下面 6 步询问:

  1. 卡片名称:必填。

    示例:KnowRoaming。

  2. 手机号:选填。

    示例:+1 234 567 8900。

    如果不想填写,发送 /skip 跳过。

  3. 保号周期:必填,输入大于 0 的整数。

    示例:180。

  4. 到期日:必填,格式为 YYYY-MM-DD

    示例:2026-12-31。

  5. 已注册平台:选填。

    多个平台请用空格或英文逗号分隔。

    示例:Telegram Google OpenAI。

    或:Telegram, Google, OpenAI。

    如果不想填写,发送 /skip 跳过。

  6. 备注 / 保号要求:选填。

    示例:半年发一次短信。

    如果不想填写,发送 /skip 跳过。

填写完成后,机器人会发送汇总信息。回复 确认 保存,回复 取消 或发送 /cancel 放弃。

如果周期或日期格式不正确,机器人会提示错误,并停留在当前步骤,不会保存错误数据。

字段规则

字段 是否必填 输入规则
卡片名称 必填 不能为空,例如 KnowRoaming
手机号 选填 建议带国际区号,例如 +1 234 567 8900;不填时发送 /skip
保号周期 必填 必须是大于 0 的整数,例如 180
到期日 必填 必须是 YYYY-MM-DD 格式,例如 2026-12-31
已注册平台 选填 多个平台用空格或英文逗号分隔,例如 Telegram Google OpenAITelegram, Google, OpenAI;不填时发送 /skip
备注 / 保号要求 选填 可填写保号动作、注意事项、充值要求等;不填时发送 /skip

添加流程示例

你:/add
机器人:第 1/6 步:卡片名称
你:KnowRoaming

机器人:第 2/6 步:手机号
你:/skip

机器人:第 3/6 步:保号周期
你:180

机器人:第 4/6 步:到期日
你:2026-12-31

机器人:第 5/6 步:已注册平台
你:Telegram, Google, OpenAI

机器人:第 6/6 步:备注/保号要求
你:半年发一次短信

机器人:请确认新增号码信息
你:确认

保存成功后,新号码会立即出现在网页看板中,也会参与后续 Cron 到期提醒。

会话和错误处理

  • 每次 /add 会创建一个临时添加会话。
  • 如果流程还没结束,再次发送 /add,机器人会提醒你先继续填写或发送 /cancel 取消。
  • 当前流程可随时发送 /cancel 或回复 取消 放弃。
  • 周期格式错误时,机器人会要求重新输入大于 0 的整数。
  • 日期格式错误时,机器人会要求重新输入 YYYY-MM-DD 格式日期。
  • 非授权账号发送命令时,机器人不会回复,也不会写入 KV。

使用 /renew 一键续期

一键续期命令可以快速延长到期日,以今天为基准顺延保号周期天数。

  • /renew — 显示号码列表,回复序号直接续期
  • /renew 序号 — 直接续期,无需二次确认

例如:

你:/renew 1
机器人:✅ KnowRoaming 已续期至 2026-12-01
你:/renew
机器人:选择要续期的号码
1. KnowRoaming | 2026-12-31 | 180 天
回复序号直接续期,例如 /renew 1

注意:

  • 序号从 1 开始,对应 /list 显示的列表顺序。
  • 续期不会修改名称、号码、平台、备注等字段。
  • 如果未设置有效保号周期(cycle),需要先在网页端编辑后使用。

使用 /platform 管理已注册平台

/platform 用来管理某个号码已经注册过的平台。这个功能以按钮为主,不需要记复杂命令。

发送 /platform 后,机器人会先显示号码列表,并提示你点击号码进入平台管理页:

请选择要管理已注册平台的号码。

点击下面的号码进入平台管理页。

[1. KnowRoaming]
[2. Firsty]

进入某个号码后,机器人会显示当前平台和可用操作:

KnowRoaming 当前已注册平台:

1. Telegram
2. Google
3. OpenAI

你可以通过下面按钮新增、删除、重命名或清空平台。

按钮包括:

[新增平台]
[删除 Telegram] [删除 Google]
[删除 OpenAI]
[重命名平台]
[清空平台]
[返回号码列表]

新增平台时,点击 [新增平台] 后按提示输入平台名。可以一次输入一个,也可以一次输入多个:

Claude GitHub OpenRouter

多个平台请用空格或英文逗号分隔。保存后机器人会立即刷新当前平台列表,新的平台也会立刻出现在删除按钮中。

删除平台时,直接点击对应的 [删除 平台名] 按钮即可。删除后机器人会刷新列表,已删除的平台按钮会消失。

重命名平台时,点击 [重命名平台],再点击要修改的平台,然后输入新名称。例如把 Google 改成:

Google Voice

清空平台时,点击 [清空平台] 后机器人会先二次确认,确认后才会清空,避免误触。

如果输入 /platform 1 add Claude 这类旧式命令,机器人不会执行修改,只会提示你使用按钮操作。

显示网站链接

发送 /site 后,机器人会返回网页看板地址(你的 worker 访问地址):

https://esim-api.xxx.workers.dev

📜 许可协议 / License

本项目基于 MIT License 开源。您可以自由使用、修改和分发,但请保留原作者信息。如果您觉得好用,请帮忙点个 ⭐ Star!

About

基于 Number-preservation 6.3 增强的 eSIM/实体卡保号看板,支持 Telegram Bot 交互、环境变量配置、自动部署和一键续期。

Topics

Resources

Stars

Watchers

Forks

Packages

 
 
 

Contributors