MihoyoBBSTools项目中的验证码识别问题分析与解决方案
背景介绍
MihoyoBBSTools是一个用于米哈游社区自动签到的开源工具,在实现自动化功能时需要处理各种验证码识别问题。近期项目中出现了关于验证码识别接口失效的问题,特别是针对极验(GeeTest)验证码的识别方案。
验证码识别接口问题
项目原本使用的是人人打码(rrocr)的验证码识别服务,但该服务已经停止运营。开发者尝试了以下解决方案:
- 对原有代码进行了优化,增加了超时(timeout)参数设置,避免因网络问题导致的长时间等待:
def game_captcha(gt: str, challenge: str):
rep = http.post(
url= "http://api.rrocr.com/api/recognize.html",
data={
"appkey": "你的key",
"gt": gt,
"challenge": challenge,
"referer": "https://bbs-api.miyoushe.com/apihub/app/api/signIn"
}, timeout=180).json()
return rep["data"]["validate"]
- 由于人人打码服务关闭,开发者转向了其他验证码识别平台,如套套图像打码(ttocr),实现了新的验证码识别逻辑。
验证码识别实现方案
对于新的验证码识别服务,开发者采用了轮询机制来获取识别结果,主要实现思路如下:
- 首先提交验证码识别请求,获取任务ID
- 然后定期查询识别结果,直到获取有效结果或超时
- 设置了最大等待时间和轮询间隔,优化了用户体验
核心代码逻辑:
max_wait_time = 60 # 最大等待时间
interval = 5 # 轮询间隔时间
start_time = time.time()
while time.time() - start_time < max_wait_time:
try:
rep2 = http.post(
url="http://api.ttocr.com/api/results",
data={
"appkey": "",
"resultid": str(rep["resultid"]),
},
timeout=(60, 60)
).json()
if rep2.get("status") == 2:
print("等待识别结果...")
time.sleep(interval)
else:
return rep2["data"]["validate"]
except Exception as e:
print(f"请求发生错误: {e}")
return None
常见问题与解决方案
-
验证码识别失败:可能是由于接口不稳定或配置错误导致。解决方案包括:
- 检查API密钥是否正确
- 确认接口URL是否有效
- 验证请求参数是否完整
-
NoneType错误:当验证码识别服务返回空值时会出现。可以通过添加错误处理逻辑来避免程序崩溃:
if data is None:
print("验证码识别服务返回空值")
return None
- 超时问题:网络不稳定可能导致请求超时。建议:
- 适当增加超时时间
- 添加重试机制
- 记录错误日志便于排查
最佳实践建议
- 对于验证码识别服务,建议使用可靠的商业API,虽然可能需要付费,但稳定性更高
- 实现备用识别方案,当主服务不可用时自动切换到备用方案
- 添加详细的日志记录,便于问题排查
- 对于开源项目,建议将API密钥等敏感信息通过配置文件管理,而不是硬编码在代码中
- 定期检查依赖服务的状态,及时更新接口实现
总结
验证码识别是自动化工具中的关键环节,随着第三方服务的变动,开发者需要不断调整实现方案。通过合理的错误处理、超时设置和备用方案,可以大大提高工具的稳定性和可靠性。对于MihoyoBBSTools项目,建议持续关注验证码识别服务的变化,及时更新代码实现。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考



