[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"project-81185":3},{"id":4,"name":5,"fullName":6,"owner":7,"repo":5,"description":8,"homepage":9,"htmlUrl":10,"language":11,"languages":10,"totalLinesOfCode":10,"stars":12,"forks":13,"watchers":14,"openIssues":15,"contributorsCount":16,"subscribersCount":16,"size":16,"stars1d":15,"stars7d":17,"stars30d":18,"stars90d":16,"forks30d":16,"starsTrendScore":14,"compositeScore":19,"rankGlobal":10,"rankLanguage":10,"license":20,"archived":21,"fork":21,"defaultBranch":22,"hasWiki":23,"hasPages":21,"topics":24,"createdAt":10,"pushedAt":10,"updatedAt":25,"readmeContent":26,"aiSummary":27,"trendingCount":16,"starSnapshotCount":16,"syncStatus":15,"lastSyncTime":28,"discoverSource":29},81185,"SMSBazaar","FoundZiGu\u002FSMSBazaar","FoundZiGu","OPENAI(ChatGPT) 短信接码价格和库存对比看板","https:\u002F\u002Fsms.fur.li\u002F",null,"JavaScript",242,36,27,2,0,28,215,4.7,"MIT License",false,"main",true,[],"2026-06-12 02:04:11","# SMSBazaar\n\nSMSBazaar 是一个用于对比 `OPENAI(ChatGPT)` 短信接码价格和库存的单页面看板。\n\n项目通过服务端定时拉取多家短信平台 API，把不同平台的国家、价格、库存统一归一化，然后在前端按国家维度展示最低价、总库存、在线平台数和各平台明细。\n\n在线访问：[https:\u002F\u002Fsms.fur.li\u002F](https:\u002F\u002Fsms.fur.li\u002F)\n\n## 功能特性\n\n- 固定对比 `OPENAI(ChatGPT)` 服务的接码价格和库存。\n- 已接入 7 家短信平台：Hero SMS、SMSBower、5sim、NexSMS、GrizzlySMS、SMS Verification Number、SMSPool。\n- 国家统一使用 ISO2 做主键，解决各平台国家 ID 不一致的问题。\n- 国家名称显示为中文名，后面带英文名。\n- 价格默认显示人民币，同时显示美元换算价。\n- 支持按国家、平台、状态和价格\u002F库存排序筛选。\n- 支持展开国家查看各平台明细，平台多档价格默认折叠。\n- 支持三种业务模式：先手机号注册 OAuth、后手机号绑定 OAuth、目前推荐国家。\n- 后端默认每 1 分钟自动刷新一次快照。\n- 保留管理员手动刷新接口，公网默认需要管理员密钥。\n- 前端支持跟随系统、亮色、暗色主题。\n\n## 技术架构\n\n- 前端：React SPA + Vite。\n- 后端：Express API + 静态文件托管。\n- 存储：SQLite，保存最近快照、刷新状态、汇率缓存和服务配置。\n- 部署：构建后一个 Node.js 进程即可同时提供 API 和前端页面。\n\n## 环境要求\n\n- Node.js 20 或更新版本。\n- npm。\n- 至少配置你需要启用的平台 API key。\n\n## 本地开发\n\n```bash\nnpm install\ncp .env.example .env\nnpm run dev\n```\n\n本地开发时：\n\n- 前端地址：`http:\u002F\u002Flocalhost:5173`\n- 后端地址：`http:\u002F\u002Flocalhost:8787`\n- Vite 会把 `\u002Fapi` 请求代理到后端。\n\n## 生产构建\n\n```bash\nnpm install\nnpm run build\nnpm start\n```\n\n默认生产服务监听 `PORT=8787`，并托管 `dist\u002Fclient` 下的前端构建产物。\n\n## 环境变量\n\n在服务器上复制 `.env.example` 为 `.env`，然后填写真实 API key。\n\n```env\nPORT=8787\nREFRESH_INTERVAL_MS=60000\nREFRESH_COOLDOWN_MS=30000\nDATABASE_PATH=.\u002Fdata\u002Fapp.sqlite\nEXCHANGE_RATE_URL=https:\u002F\u002Fapi.frankfurter.app\u002Flatest?from=USD\nRECOMMENDED_COUNTRY_PATHS_FILE=.\u002Fdata\u002Frecommended-country-paths.txt\nOPENAI_SUPPORTED_COUNTRIES_FILE=.\u002Fdata\u002Fopenai-supported-api-countries.txt\nADMIN_REFRESH_TOKEN=\nEXPOSE_PROVIDER_ERRORS=false\n```\n\n平台 API key：\n\n```env\nHERO_SMS_API_KEY=\nSMSBOWER_API_KEY=\nFIVESIM_API_KEY=\nNEXSMS_API_KEY=\nGRIZZLYSMS_API_KEY=\nSMS_VERIFICATION_API_KEY=\nSMSPOOL_API_KEY=\n```\n\n平台服务码也可以通过环境变量覆盖：\n\n```env\nHERO_SMS_SERVICE_CODE=dr\nSMSBOWER_SERVICE_CODE=dr\nFIVESIM_SERVICE_CODE=openai\nNEXSMS_SERVICE_CODE=dr\nGRIZZLYSMS_SERVICE_CODE=dr\nSMS_VERIFICATION_SERVICE_CODE=dr\nSMSPOOL_SERVICE_CODE=671\nSMSPOOL_NATIVE_SERVICE_NAME=OpenAI \u002F ChatGPT\nSMSPOOL_REFRESH_INTERVAL_MS=180000\nSMSPOOL_STOCK_MODE=country\nSMSPOOL_STOCK_BATCH_SIZE=20\nSMSPOOL_INCLUDE_POOL_NAMES=false\n```\n\nSMSPool 使用官方原生 API：`\u002Frequest\u002Fpricing` 获取价格档位，`\u002Fsms\u002Fstock` 获取库存。`SMSPOOL_SERVICE_CODE=671` 对应 `OpenAI \u002F ChatGPT`；如果你的环境里仍保留旧的 `dr`，程序会通过 `SMSPOOL_NATIVE_SERVICE_NAME` 自动解析原生服务 ID。\n\n`SMSPOOL_STOCK_MODE=country` 表示每个国家查一次总库存，更适合 1 分钟定时刷新；如果改成 `pool`，会按价格池查询更细的档位库存，但请求量更高，可能触发 SMSPool 限流。\n\n`SMSPOOL_REFRESH_INTERVAL_MS=180000` 表示 SMSPool 单独每 3 分钟刷新一次，其它平台仍按全局 `REFRESH_INTERVAL_MS=60000` 刷新。这样可以保留页面 1 分钟更新，同时避开 SMSPool 的 120 秒限流窗口。\n\n`SMSPOOL_STOCK_BATCH_SIZE=20` 表示每次 SMSPool 真实刷新只查询 20 个国家的库存，其他国家沿用上一次成功库存；价格仍然全量刷新。这可以避免一次性查询 155 个国家库存导致 `429`。\n\n## 推荐国家配置\n\n目前推荐国家从 `data\u002Frecommended-country-paths.txt` 读取。\n\n每一行格式：\n\n```txt\nISO2 PATH\n```\n\n`PATH` 含义：\n\n- `0`：推荐走先手机号注册 OAuth。\n- `1`：推荐走后手机号绑定 OAuth。\n\n示例：\n\n```txt\nGB 1\nPH 0\n```\n\n前端只显示业务文案，不展示原始 `0\u002F1`，也不暴露服务器上的配置文件路径。\n\n## OpenAI 支持国家\n\n先手机号注册 OAuth 模式会读取 `data\u002Fopenai-supported-api-countries.txt`。\n\n该文件一行一个 ISO2 国家或地区代码，用于排除 OpenAI 官方不支持的国家和地区。\n\n## API\n\n```http\nGET \u002Fapi\u002Fmeta\nGET \u002Fapi\u002Fcompare?mode=register|bind|recommended&country=US&provider=smsbower&status=in_stock&sort=price_asc\nPOST \u002Fapi\u002Frefresh\n```\n\n`POST \u002Fapi\u002Frefresh` 需要管理员密钥，二选一传入：\n\n```http\nx-admin-refresh-token: your-token\nAuthorization: Bearer your-token\n```\n\n如果 `ADMIN_REFRESH_TOKEN` 为空，手动刷新接口会返回 `503 admin_refresh_not_configured`。\n\n## VPS 部署建议\n\n推荐部署方式：\n\n- 使用 `pm2` 或 `systemd` 守护 Node.js 进程。\n- 使用 Nginx 反向代理到 `127.0.0.1:8787`。\n- 开启 HTTPS。\n- `.env` 不要提交到仓库。\n- SQLite 数据库建议放在持久化目录，例如 `\u002Fvar\u002Flib\u002Fsmsbazaar\u002Fapp.sqlite`。\n- 公网部署保持 `EXPOSE_PROVIDER_ERRORS=false`，避免暴露上游平台的详细错误。\n- 设置强随机 `ADMIN_REFRESH_TOKEN`。\n\nPM2 示例：\n\n```bash\nnpm install\nnpm run build\npm2 start src\u002Fserver.js --name smsbazaar\npm2 save\n```\n\nNginx 反向代理示例：\n\n```nginx\nserver {\n  listen 80;\n  server_name example.com;\n\n  location \u002F {\n    proxy_pass http:\u002F\u002F127.0.0.1:8787;\n    proxy_http_version 1.1;\n    proxy_set_header Host $host;\n    proxy_set_header X-Real-IP $remote_addr;\n    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;\n    proxy_set_header X-Forwarded-Proto $scheme;\n  }\n}\n```\n\n## 开源注意事项\n\n- `.env`、SQLite 数据库、构建产物、日志文件和 `node_modules` 已被 `.gitignore` 忽略。\n- `data\u002F*.txt` 是公开配置模板，会进入仓库。\n- 生产依赖可用 `npm audit --omit=dev` 检查。\n\n## 友情链接\n\n- [LINUX DO - 新的理想型社区](https:\u002F\u002Flinux.do\u002F)\n\n## License\n\nMIT\n","SMSBazaar 是一个用于对比 OPENAI (ChatGPT) 短信接码价格和库存的单页面看板。该项目通过服务端定时拉取多家短信平台 API，将不同平台的国家、价格、库存信息统一归一化，并在前端按国家维度展示最低价、总库存、在线平台数及各平台明细。它支持固定对比 ChatGPT 服务的接码价格和库存，接入了包括 Hero SMS、5sim 在内的7家短信平台，使用 ISO2 标准化国家标识，提供多语言显示及多种货币单位转换功能。此外，还支持按国家、平台、状态等条件进行筛选排序。适合需要频繁购买或比较短信验证码服务价格与库存情况的企业和个人开发者使用。","2026-06-11 04:03:50","CREATED_QUERY"]