Python中如何实现基于多个打码平台的验证码识别服务?
最近要搞一个验证码打码的服务,要提供接口,主要功能有打码, 返回打码,成功率, 重试,发生错误,都有什么错误,有的图片可以自己识别,自己识别不了再转给打码平台
但是没什么思路,有没有人能提供或探讨下想法
Python中如何实现基于多个打码平台的验证码识别服务?
你思路都不已经说的清清楚楚了么,还要什么思路
import abc
import requests
from typing import Optional, Dict, List
from dataclasses import dataclass
from concurrent.futures import ThreadPoolExecutor, as_completed
import time
@dataclass
class CaptchaResult:
"""验证码识别结果数据类"""
success: bool
code: Optional[str] = None
platform: Optional[str] = None
error_msg: Optional[str] = None
cost_time: Optional[float] = None
class BaseCaptchaPlatform(abc.ABC):
"""验证码平台基类"""
def __init__(self, api_key: str):
self.api_key = api_key
self.base_url = self.get_base_url()
@abc.abstractmethod
def get_base_url(self) -> str:
"""获取平台API基础URL"""
pass
@abc.abstractmethod
def recognize(self, image_data: bytes, **kwargs) -> CaptchaResult:
"""识别验证码核心方法"""
pass
def _make_request(self, url: str, data: Dict, files: Dict = None) -> Dict:
"""统一请求处理"""
try:
response = requests.post(url, data=data, files=files, timeout=30)
response.raise_for_status()
return response.json()
except Exception as e:
raise Exception(f"请求失败: {str(e)}")
class RuoKuaiPlatform(BaseCaptchaPlatform):
"""若快平台实现"""
def get_base_url(self) -> str:
return "http://api.ruokuai.com"
def recognize(self, image_data: bytes, **kwargs) -> CaptchaResult:
start_time = time.time()
try:
url = f"{self.base_url}/create.json"
data = {
'username': kwargs.get('username', ''),
'password': kwargs.get('password', ''),
'typeid': kwargs.get('typeid', 3040), # 4位字母数字
'softid': kwargs.get('softid', ''),
'softkey': kwargs.get('softkey', '')
}
files = {'image': ('captcha.jpg', image_data)}
result = self._make_request(url, data, files)
return CaptchaResult(
success=True,
code=result.get('Result'),
platform='ruokuai',
cost_time=time.time() - start_time
)
except Exception as e:
return CaptchaResult(
success=False,
platform='ruokuai',
error_msg=str(e),
cost_time=time.time() - start_time
)
class ChaoJiYingPlatform(BaseCaptchaPlatform):
"""超级鹰平台实现"""
def get_base_url(self) -> str:
return "http://upload.chaojiying.net"
def recognize(self, image_data: bytes, **kwargs) -> CaptchaResult:
start_time = time.time()
try:
url = f"{self.base_url}/Upload/Processing.php"
data = {
'user': kwargs.get('username', ''),
'pass': kwargs.get('password', ''),
'softid': kwargs.get('softid', ''),
'codetype': kwargs.get('codetype', 1004) # 4位英文数字
}
files = {'userfile': ('captcha.jpg', image_data)}
result = self._make_request(url, data, files)
return CaptchaResult(
success=True,
code=result.get('pic_str'),
platform='chaojiying',
cost_time=time.time() - start_time
)
except Exception as e:
return CaptchaResult(
success=False,
platform='chaojiying',
error_msg=str(e),
cost_time=time.time() - start_time
)
class CaptchaService:
"""多平台验证码识别服务"""
def __init__(self, platforms: List[BaseCaptchaPlatform]):
self.platforms = platforms
self.executor = ThreadPoolExecutor(max_workers=len(platforms))
def recognize_parallel(self, image_data: bytes, **kwargs) -> CaptchaResult:
"""并行调用所有平台,返回最快成功结果"""
futures = {
self.executor.submit(platform.recognize, image_data, **kwargs): platform
for platform in self.platforms
}
successful_results = []
for future in as_completed(futures):
result = future.result()
if result.success:
successful_results.append(result)
# 取消其他未完成的任务
for f in futures:
if not f.done():
f.cancel()
return successful_results[0]
# 所有平台都失败时返回第一个错误
for future in futures:
if future.done():
return future.result()
return CaptchaResult(success=False, error_msg="所有平台识别失败")
def recognize_fallback(self, image_data: bytes, **kwargs) -> CaptchaResult:
"""顺序调用平台,失败时自动切换"""
for platform in self.platforms:
result = platform.recognize(image_data, **kwargs)
if result.success:
return result
return CaptchaResult(success=False, error_msg="所有平台识别失败")
# 使用示例
def main():
# 初始化平台(实际使用时需要配置正确的API密钥)
ruokuai = RuoKuaiPlatform(api_key="your_ruokuai_key")
chaojiying = ChaoJiYingPlatform(api_key="your_chaojiying_key")
# 创建多平台服务
service = CaptchaService(platforms=[ruokuai, chaojiying])
# 读取验证码图片
with open("captcha.jpg", "rb") as f:
image_data = f.read()
# 并行识别(获取最快结果)
result = service.recognize_parallel(
image_data,
username="your_username",
password="your_password",
typeid=3040
)
if result.success:
print(f"识别成功: {result.code} (来自: {result.platform}, 耗时: {result.cost_time:.2f}s)")
else:
print(f"识别失败: {result.error_msg}")
if __name__ == "__main__":
main()
这个实现的关键点:
- 抽象基类定义统一接口,方便扩展新平台
- 每个平台独立实现,互不干扰
- 提供两种调用策略:并行竞速和顺序降级
- 统一的结果格式,包含平台信息和耗时统计
- 线程池管理并发请求
扩展新平台只需继承BaseCaptchaPlatform并实现recognize方法。
总结:用策略模式封装不同平台,结合线程池实现高效调度。
犯法大佬,破坏计算机系统
就是无从下手😔不知道该怎么写 我是小白
这种想法是不是就是. 我想创业了, 就是差一个程序员
这种打码平台有几个,可以看下别人怎么做的
最近正好缺靠谱的打码平台 推荐下
打码兔,若快,联众都用过,也自己做过,你可以去那几个打码平台看看,不知道倒闭没有,前几年用过,现在不知道倒闭没,都是提供 api 或者 http 接口的。
之前测算过 4 位字母数字码,针对单个网站的算法这几个整体正确率都是 60-85%正确率这个区间,毕竟是适配所有 4 位数字字母码,要求不能太高了,再就是高峰打码时段 /或者是高并发的情况下,响应时间略长,几秒到几十秒不等,平时还是挺快的。自建的针对单独网站算法的,普通的 4 位码,基本学习几万组图,就可以了,正确率远高于通用型的 4 位码,而且是毫秒级出结果。
要区分不同的码型选择,不能所有种类混在一起。
再就是有个问题,如果是用人工智能识别打码,总会出个结果的,识别不出来什么的不存在的,只会是错的,除非你设定参数,符合某种算法结果的作为识别不了的。
其实我比较疑惑的地方是,怎么同时把一个验证码同时发给多个平台呢
还有就是 接口得怎么写才能方便别人调用呢
打码都是人工识别的,机器识别率达不到要求的,别想了。既然是人工的,那就简单了,平台无非就是一个下单一个接单。
看起来是要做一个接口服务,一方面提供自行识别验证码的服务,一方面作为中转,将请求代理到各个打码平台。对于自己识别,大原理上就是接收图片,然后调用模型识别。对于转发,就是统一一下接口输入的参数和格式,把各个打码平台需要的参数适配一下,转发请求。
这个服务算是响应比较慢的了,建议使用异步的框架,里面还要转发请求,那么自带 server 和 client 的 aiohttp 比较合适了。识别的话,接触不多,之前用 tesseract 效果并不好,图片规律且有一定样本的话 tenseflow 调包训练一下效果就不错。
大佬说的很有道理,但我在一些小的地方思路不清楚,比如怎么同步转发给多个平台,还有就是打码出错异常重试的实现也不太清楚😔
若快 我用过, 还不错, 价格也不贵
多平台同步,不就是爬虫的并发请求嘛,开几个协程或线程同时调用各个打码平台的 api 就可以。打码出错处理看你怎么个策略了,多个平台的结果不一样时怎么取值等,这就是业务逻辑了。
顶一下帖子,跪求意见


