我在运营 RaySMS。本文由 AI 辅助编写,示例行为已按公开源码和离线测试核对。这里讨论一个不需要账户或 API Key 的只读命令行工具:用 Python 标准库读取服务、国家与报价,不购买号码,不触发或批量发送短信。
接入 OpenAI/ChatGPT/Codex、Google 或 Telegram 等服务前,先检查目录数据是一个独立步骤;出现报价并不保证目标平台接受号码或一定收到验证码。本文只关注如何让查询结果和失败状态足够明确。
1. 金额保留整数,展示时再转换
接口的 price_micros 以百万分之一美元表示金额。示例保留原整数,用 Decimal 生成六位小数字符串:
from decimal import Decimal
micros = 1000001
price_usd = format(Decimal(micros) / Decimal(1000000), ".6f")
# "1.000001";这是测试数值,不是实时报价
不要先转成浮点数,也不要在排序前四舍五入到两位。很小的报价可能显示成零,随后失去比较价值。工具同时输出整数 price_micros 和字符串 price_usd,按整数排序。
输入校验也有细节:Python 的 bool 是 int 的子类,因此代码用 type(micros) is int,并拒绝负数、字符串和浮点报价。字段类型变化时明确报错,比悄悄转换更容易排查。
2. 一次报价查询并不只有一个请求
在仓库目录运行,需 Python 3.10 或更新版本,无第三方依赖:
python raysms_catalog.py --list services --lang zh-CN --limit 20
python raysms_catalog.py --service tg --format json --limit 10 --timeout 15
第二条先读服务和国家目录,再读报价,共三个 GET;无效国家编号会在报价请求前被拒绝。--limit 只限制输出行数,不减少接口返回的数据;设为零表示输出全部已返回的行,不会发起翻页请求。
--timeout 15 用于每次网络请求,不是整个程序十五秒内必然结束的承诺。工具保留默认 TLS 证书校验,并限制单个响应为 2 MiB,还会检查 JSON 结构,防止把错误页面当成空库存。
3. 遇到 429,先停下来
示例收到 HTTP 429 会显示 Retry-After(如果服务端提供),退出且不自动重试。网络或 TLS 失败也返回简短错误,不打印原始响应体或内部诊断内容。
如果将来接入定时任务,应遵守服务端等待提示,设置有限重试次数并减少查询频率;这属于调用方需要增加的策略,当前 CLI 没有实现自动退避。查询失败也不能据此推断“某国家没有库存”。正常空结果与请求失败必须分别处理。
4. 先运行八项离线测试
python -m unittest -v
测试替换网络调用,覆盖公开 GET 不带凭据、拒绝未知路径、微美元精度、错误金额类型、429 不重试、无效 JSON 或结构、诊断信息隐藏,以及无效国家提前停止。本轮八项均通过,但这些测试不代表实时库存或平台接受率测试。
可以从 GitHub 完整源码与测试 复现,也可以用 Postman 公开只读集合 查看请求。更完整的字段说明见 RaySMS Python 接入指南。公开查询阶段无需放入任何密钥,后续涉及付费操作时,应另行设计授权与金额核验。
Top comments (0)