自动接码跑通很容易,要跑得稳却需要一套错误处理策略。本教程在自动取号与轮询的基础上,讲清怎么处理“没到码、超时、限流、重复下单”这四类常见情况。

前提:已读过5 分钟快速接入,能完成取号→收码→取消的最小流程。
一、先分清两类“失败”
- 业务失败:请求成功,但结果不理想(如超时未到码、号被拒)。应该换号重试,而不是重复请求同一个号。
- 传输/服务失败:网络抖动、HTTP 429/5xx。应该退避后重试同一个请求。
两类处理方式完全不同,切勿一律“无脑重试”。
二、轮询取码:设好节奏与超时
取号后不要马上高频轮询。建议固定间隔 + 总超时:
interval = 3s # 每 3 秒查一次
max_wait = 120s # 最多等 2 分钟
while elapsed < max_wait:
order = GET /api/sms/orders/{id}
if order.status == "received": return order.latestCode
if order.status in ("canceled", "expired"): break
sleep(interval)
# 超时未到码 -> 取消并换号
要点:2–3 分钟仍无码就判定失败,换号比干等高效得多。
三、未到码:自动取消换号
靠谱平台未到码不扣费,所以超时后直接取消、重新取号:
curl -X POST https://api.simsmsbox.com/api/sms/orders/19/cancel \
-H "X-API-Key: psk_xxxxxxxx"
取消成功后,重新走一遍取号流程。建议给单个任务设一个 换号上限(如最多 3 次),避免无限刷号浪费时间。
四、限流与 5xx:指数退避重试
遇到 429 Too Many Requests 或 5xx,对同一请求做指数退避:
delays = [1s, 2s, 4s, 8s] # 最多重试 4 次
for d in delays:
resp = request()
if resp.ok: break
if resp.status in (429, 500, 502, 503, 504):
sleep(d + random_jitter()) # 加随机抖动,避免同时重试
else:
break # 4xx 业务错误不重试
注意:4xx(除 429)多为参数/鉴权错误,重试无意义,应直接报错修正。
五、幂等:避免重复下单
下单(取号)接口重试时,如果上一次其实已成功但响应丢了,盲目重试会重复扣费。处理方式:
- 给每次下单带上自己的业务流水号,服务端/你本地做去重;
- 重试前先查一次“最近订单”,确认上一笔是否已生成;
- 只对**查询类(GET)**接口放心重试,**写入类(POST)**要配去重。
六、一个完整的循环骨架
for attempt in 1..MAX_NUMBER_SWITCH: # 换号上限
order = purchase() # 带幂等键 + 退避重试
code = poll(order.id, interval=3s, max_wait=120s)
if code: return code # 成功
cancel(order.id) # 未到码:取消换号
return FAIL # 达到换号上限,上报告警
小结
稳定的自动接码 = 区分两类失败 + 合理轮询节奏 + 未到码换号 + 指数退避 + 幂等去重。把这几件事写进你的接入代码,配合真实 SIM 号源,就能把批量接码的成功率和成本同时控住。下一步可看自定义取码 URL 与模板化返回。