调用ipinfo接口查询Office365审计数据IP信息触发Error 429如何解决
问题解答
Error 429 错误规避方案
- 先做IP去重:先把所有待查询的IP从数据库取出后做去重处理,同一个IP仅查询1次,查询结果缓存复用,大幅减少不必要的请求次数,这是降低请求量性价比最高的方案。
- 调整请求间隔并增加退避重试机制:ipinfo免费未认证接口的速率限制为每分钟最多50次请求,你当前固定6秒间隔的逻辑存在触发限制的可能,建议:
- 统一将sleep逻辑放在IP查询调用之后,避免你现有代码中sleep仅在特定分支生效的逻辑漏洞
- 增加错误捕获逻辑,当捕获到429状态码时,采用指数退避策略延长等待时间(例如首次等待10秒、第二次等待20秒,最多重试3次)后再重新发起请求
- 携带API密钥发起请求:注册ipinfo免费账号获取官方API密钥,请求时在请求头中携带密钥,可获得更高的请求速率配额
- 改用批量查询接口:ipinfo官方提供批量IP查询接口,可一次提交最多100个IP进行查询,大幅减少请求总次数,从根源降低触发限流的概率
urllib.request 库适用性说明
urllib.request 可以完成基础的接口请求任务,但不属于该场景的最优选择:
- 该库处理请求头、状态码判断、超时配置等逻辑的代码复杂度较高,容易出现遗漏
- 更推荐使用
requests库,配置请求头、捕获状态码、携带参数的逻辑更简洁易维护,能减少你自己写代码出错的概率
现有代码优化建议
- 不要手动拼接JSON字符串:你当前手动拼接JSON的逻辑容错性极低,若返回字段中存在双引号等特殊字符会直接导致JSON格式错误,直接调用
json.dumps(data)即可生成标准格式的JSON字符串 - 简化数据库查询结果的处理逻辑:无需遍历元组每个元素判断归属,直接用元组解包即可:
id, creationdate, userids, operations, client_ip, ipdata = items,代码更简洁不易出错 - 不要使用
dict作为变量名:dict是Python内置关键字,用作变量名会覆盖原有功能,可能引发不可预期的错误
内容的提问来源于stack exchange,提问作者Tech Marc
相关产品推荐
相关产品推荐

