SMSBazaar 是一个用于对比 OPENAI(ChatGPT) 短信接码价格和库存的单页面看板。
项目通过服务端定时拉取多家短信平台 API,把不同平台的国家、价格、库存统一归一化,然后在前端按国家维度展示最低价、总库存、在线平台数和各平台明细。
在线访问:https://sms.fur.li/
- 固定对比
OPENAI(ChatGPT)服务的接码价格和库存。 - 已接入 7 家短信平台:Hero SMS、SMSBower、5sim、NexSMS、GrizzlySMS、SMS Verification Number、SMSPool。
- 国家统一使用 ISO2 做主键,解决各平台国家 ID 不一致的问题。
- 国家名称显示为中文名,后面带英文名。
- 价格默认显示人民币,同时显示美元换算价。
- 支持按国家、平台、状态和价格/库存排序筛选。
- 支持展开国家查看各平台明细,平台多档价格默认折叠。
- 支持三种业务模式:先手机号注册 OAuth、后手机号绑定 OAuth、目前推荐国家。
- 后端默认每 1 分钟自动刷新一次快照。
- 保留管理员手动刷新接口,公网默认需要管理员密钥。
- 前端支持跟随系统、亮色、暗色主题。
- 前端:React SPA + Vite。
- 后端:Express API + 静态文件托管。
- 存储:SQLite,保存最近快照、刷新状态、汇率缓存和服务配置。
- 部署:构建后一个 Node.js 进程即可同时提供 API 和前端页面。
- Node.js 20 或更新版本。
- npm。
- 至少配置你需要启用的平台 API key。
npm install
cp .env.example .env
npm run dev本地开发时:
- 前端地址:
http://localhost:5173 - 后端地址:
http://localhost:8787 - Vite 会把
/api请求代理到后端。
npm install
npm run build
npm start默认生产服务监听 PORT=8787,并托管 dist/client 下的前端构建产物。
在服务器上复制 .env.example 为 .env,然后填写真实 API key。
PORT=8787
REFRESH_INTERVAL_MS=60000
REFRESH_COOLDOWN_MS=30000
DATABASE_PATH=./data/app.sqlite
EXCHANGE_RATE_URL=https://api.frankfurter.app/latest?from=USD
RECOMMENDED_COUNTRY_PATHS_FILE=./data/recommended-country-paths.txt
OPENAI_SUPPORTED_COUNTRIES_FILE=./data/openai-supported-api-countries.txt
ADMIN_REFRESH_TOKEN=
EXPOSE_PROVIDER_ERRORS=false平台 API key:
HERO_SMS_API_KEY=
SMSBOWER_API_KEY=
FIVESIM_API_KEY=
NEXSMS_API_KEY=
GRIZZLYSMS_API_KEY=
SMS_VERIFICATION_API_KEY=
SMSPOOL_API_KEY=平台服务码也可以通过环境变量覆盖:
HERO_SMS_SERVICE_CODE=dr
SMSBOWER_SERVICE_CODE=dr
FIVESIM_SERVICE_CODE=openai
NEXSMS_SERVICE_CODE=dr
GRIZZLYSMS_SERVICE_CODE=dr
SMS_VERIFICATION_SERVICE_CODE=dr
SMSPOOL_SERVICE_CODE=dr目前推荐国家从 data/recommended-country-paths.txt 读取。
每一行格式:
ISO2 PATHPATH 含义:
0:推荐走先手机号注册 OAuth。1:推荐走后手机号绑定 OAuth。
示例:
GB 1
PH 0前端只显示业务文案,不展示原始 0/1,也不暴露服务器上的配置文件路径。
先手机号注册 OAuth 模式会读取 data/openai-supported-api-countries.txt。
该文件一行一个 ISO2 国家或地区代码,用于排除 OpenAI 官方不支持的国家和地区。
GET /api/meta
GET /api/compare?mode=register|bind|recommended&country=US&provider=smsbower&status=in_stock&sort=price_asc
POST /api/refreshPOST /api/refresh 需要管理员密钥,二选一传入:
x-admin-refresh-token: your-token
Authorization: Bearer your-token如果 ADMIN_REFRESH_TOKEN 为空,手动刷新接口会返回 503 admin_refresh_not_configured。
推荐部署方式:
- 使用
pm2或systemd守护 Node.js 进程。 - 使用 Nginx 反向代理到
127.0.0.1:8787。 - 开启 HTTPS。
.env不要提交到仓库。- SQLite 数据库建议放在持久化目录,例如
/var/lib/smsbazaar/app.sqlite。 - 公网部署保持
EXPOSE_PROVIDER_ERRORS=false,避免暴露上游平台的详细错误。 - 设置强随机
ADMIN_REFRESH_TOKEN。
PM2 示例:
npm install
npm run build
pm2 start src/server.js --name smsbazaar
pm2 saveNginx 反向代理示例:
server {
listen 80;
server_name example.com;
location / {
proxy_pass http://127.0.0.1:8787;
proxy_http_version 1.1;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}.env、SQLite 数据库、构建产物、日志文件和node_modules已被.gitignore忽略。data/*.txt是公开配置模板,会进入仓库。- 生产依赖可用
npm audit --omit=dev检查。
MIT