Python中如何实现基于多个打码平台的验证码识别服务?

最近要搞一个验证码打码的服务,要提供接口,主要功能有打码, 返回打码,成功率, 重试,发生错误,都有什么错误,有的图片可以自己识别,自己识别不了再转给打码平台

但是没什么思路,有没有人能提供或探讨下想法
Python中如何实现基于多个打码平台的验证码识别服务?

17 回复

你思路都不已经说的清清楚楚了么,还要什么思路


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()

这个实现的关键点:

  1. 抽象基类定义统一接口,方便扩展新平台
  2. 每个平台独立实现,互不干扰
  3. 提供两种调用策略:并行竞速和顺序降级
  4. 统一的结果格式,包含平台信息和耗时统计
  5. 线程池管理并发请求

扩展新平台只需继承BaseCaptchaPlatform并实现recognize方法。

总结:用策略模式封装不同平台,结合线程池实现高效调度。

犯法大佬,破坏计算机系统

就是无从下手😔不知道该怎么写 我是小白

这种想法是不是就是. 我想创业了, 就是差一个程序员

这种打码平台有几个,可以看下别人怎么做的

最近正好缺靠谱的打码平台 推荐下

打码兔,若快,联众都用过,也自己做过,你可以去那几个打码平台看看,不知道倒闭没有,前几年用过,现在不知道倒闭没,都是提供 api 或者 http 接口的。
之前测算过 4 位字母数字码,针对单个网站的算法这几个整体正确率都是 60-85%正确率这个区间,毕竟是适配所有 4 位数字字母码,要求不能太高了,再就是高峰打码时段 /或者是高并发的情况下,响应时间略长,几秒到几十秒不等,平时还是挺快的。自建的针对单独网站算法的,普通的 4 位码,基本学习几万组图,就可以了,正确率远高于通用型的 4 位码,而且是毫秒级出结果。
要区分不同的码型选择,不能所有种类混在一起。
再就是有个问题,如果是用人工智能识别打码,总会出个结果的,识别不出来什么的不存在的,只会是错的,除非你设定参数,符合某种算法结果的作为识别不了的。

用过云打码,还可以

其实我比较疑惑的地方是,怎么同时把一个验证码同时发给多个平台呢

还有就是 接口得怎么写才能方便别人调用呢

打码都是人工识别的,机器识别率达不到要求的,别想了。既然是人工的,那就简单了,平台无非就是一个下单一个接单。

看起来是要做一个接口服务,一方面提供自行识别验证码的服务,一方面作为中转,将请求代理到各个打码平台。对于自己识别,大原理上就是接收图片,然后调用模型识别。对于转发,就是统一一下接口输入的参数和格式,把各个打码平台需要的参数适配一下,转发请求。
这个服务算是响应比较慢的了,建议使用异步的框架,里面还要转发请求,那么自带 server 和 client 的 aiohttp 比较合适了。识别的话,接触不多,之前用 tesseract 效果并不好,图片规律且有一定样本的话 tenseflow 调包训练一下效果就不错。

大佬说的很有道理,但我在一些小的地方思路不清楚,比如怎么同步转发给多个平台,还有就是打码出错异常重试的实现也不太清楚😔

若快 我用过, 还不错, 价格也不贵

多平台同步,不就是爬虫的并发请求嘛,开几个协程或线程同时调用各个打码平台的 api 就可以。打码出错处理看你怎么个策略了,多个平台的结果不一样时怎么取值等,这就是业务逻辑了。

顶一下帖子,跪求意见

回到顶部