图鉴验证打码平台之图鉴的使用步骤附带源码,模拟人工拖动源码

Python3.8

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

验证码(CAPTCHA)作为网络安全的重要组成部分,广泛应用于反爬虫、人机验证等场景。然而,传统的验证码识别服务往往成本较高,尤其是在高并发或复杂验证码(如点选、旋转、轨迹等)场景下,识别费用可能成为业务负担。
在这里插入图片描述

​​1. 验证码识别的技术演进​​
早期的验证码识别主要依赖OCR(光学字符识别),但随着验证码复杂度的提升(如滑块、拼图、汉字干扰等),传统OCR的准确率大幅下降。近年来,深度学习(如CNN、Transformer)的引入显著提升了识别精度,尤其是针对以下类型:
在这里插入图片描述

​​常规字符验证码​​(数字/字母组合)
​​滑块验证码​​(坐标匹配)
​​点选验证码​​(多目标定位)
​​旋转/拼图验证码​​(空间变换建模)
​​无感学习验证码​​(动态自适应识别)
​​2. 成本优化的关键因素​​
验证码识别的成本主要由​​算法效率、计算资源、数据标注质量​​决定。我们通过以下方式降低成本:

​​模型轻量化​​:采用高效神经网络结构(如MobileNet、EfficientNet),减少计算开销。
​​分布式推理​​:动态调度GPU/CPU资源,提高并发处理能力。
​​数据增强与自训练​​:利用合成数据减少人工标注成本,提升模型泛化能力。
​​3. 行业价格对比与性价比分析​​
验证码类型 我们的价格 行业平均价格 技术优势
常规字符 0.2~2厘/次 ≥4厘/次 高精度OCR+抗干扰
滑块坐标 1分/次 ≥1分/次 亚像素级匹配
点选验证码 1~2.5分/次 ≥2分/次 多目标检测优化
旋转/拼图 1.6分/次 无竞品支持 空间变换建模独家方案
​​4. 如何选择合适的验证码识别方案?​​
​​低复杂度验证码(如4位数字)​​:推荐常规识别(0.2厘/次),适合高频调用。
​​交互式验证码(如滑块、点选)​​:采用专用模型,平衡速度与精度。
​​高安全性场景(如金融/政务)​​:建议结合无感学习+动态对抗训练,降低被破解风险。
​​5. 免费测试与接入建议​​
​​10次免费测试​​,开发者可通过API快速验证效果。对于长期需求,推荐采用​​流量包套餐​​(最低0.2厘/次),进一步优化成本。

复制修改账号密码 和类型即可
在这里插入图片描述

注册网址:http://www.ttshitu.com/
免费测试

========== 配置 ==========



import base64
import json
import time
import requests

# ========== 配置 ==========
API_URL = "http://api.ttshitu.com"  # 图鉴官方 API 地址(也支持 https)

def predict_base64(
    username: str,
    password: str,
    typeid: int,
    image_path: str,
    imageback_path: str = None,
    timeout: int = 60,
    retries: int = 3
) -> dict:
    """
    调用图鉴(ttshitu.com)API 进行验证码识别,支持单图/双图模式。

    参数说明:
        username (str): 图鉴账号
        password (str): 图鉴密码
        typeid (int): 识别类型编号(如 3=数英混合,1033=拖动拼图等)
        image_path (str): 主图片路径(必填)
        imageback_path (str, optional): 背景图路径(仅部分类型需要,如缺口、拼图)
        timeout (int): HTTP 请求超时时间(秒),官方建议 ≥60
        retries (int): 识别失败时的重试次数(针对“人工不足”等临时错误)

    返回值:
        dict: 成功时返回 {"result": "识别结果", "id": "任务ID"}
              失败时返回 {"error": "错误信息"}

    常见 typeid 示例:
        - 3    : 数英混合(默认)
        - 18   : 双图缺口识别(需 image + imageback)
        - 33   : 单图缺口识别(仅 image)
        - 1033 : 拖动拼图(上图=image,下图=imageback)
        - 29   : 旋转角度识别
        - 21   : 3~5个坐标点选
    """
    try:
        # 读取主图并转为 Base64
        with open(image_path, "rb") as f:
            b64_image = base64.b64encode(f.read()).decode("utf-8")

        # 构造请求数据
        payload = {
            "username": username,
            "password": password,
            "typeid": str(typeid),  # API 要求字符串格式
            "image": b64_image,
            "softid": "9eee6e0de1ae413d9745ce2350bb0703"  # 添加软件标识
        }

        # 如果需要背景图(如拼图、双图缺口),一并上传
        if imageback_path:
            with open(imageback_path, "rb") as fb:
                b64_imageback = base64.b64encode(fb.read()).decode("utf-8")
            payload["imageback"] = b64_imageback

        # 重试机制
        for attempt in range(retries):
            try:
                resp = requests.post(
                    f"{API_URL}/predict",
                    json=payload,
                    timeout=timeout
                )
                resp.raise_for_status()  # 检查 HTTP 状态码
                result = resp.json()

                if result.get("success"):
                    # 成功:返回 data 字段(含 result 和 id)
                    return result["data"]
                else:
                    error_msg = result.get("message", "未知错误")
                    print(f"[图鉴] 识别失败 (尝试 {attempt + 1}/{retries}): {error_msg}")

                    # 针对可重试的临时错误,等待后重试
                    if any(keyword in error_msg for keyword in ["人工不足", "超时", "timeout", "请延长超时时间"]):
                        time.sleep(2)
                        continue
                    else:
                        return {"error": error_msg}

            except requests.exceptions.RequestException as e:
                print(f"[网络异常] 尝试 {attempt + 1}/{retries}: {e}")
                if attempt == retries - 1:
                    return {"error": f"网络请求失败: {e}"}
                time.sleep(2)

        return {"error": "达到最大重试次数,仍未能成功识别"}

    except FileNotFoundError as e:
        return {"error": f"图片文件未找到: {e.filename}"}
    except Exception as e:
        return {"error": f"内部错误: {str(e)}"}


def report_error(task_id: str) -> bool:
    """
    上报识别错误(用于返还积分或优化模型)
    """
    try:
        resp = requests.post(
            f"{API_URL}/reporterror.json",
            json={"id": task_id},
            timeout=10
        )
        result = resp.json()
        return result.get("success", False)
    except Exception:
        return False


# ========================
# 使用示例(请替换为你的账号密码)
# ========================
if __name__ == "__main__":
    USERNAME = "这里修改账号"
    PASSWORD = "这里修改密码"

    # 示例1:普通数英混合验证码(单图)
    r1 = predict_base64(
        username=USERNAME,
        password=PASSWORD,
        typeid=3,
        image_path=r"C:\Users\Administrator\Desktop\hk\b.png"
    )
    print("【结果1】数英混合:", r1)

    # # 示例2:拖动拼图验证码(双图:上图 + 下图)
    # r2 = predict_base64(
    #     username=USERNAME,
    #     password=PASSWORD,
    #     typeid=1099,
    #     image_path="C:/Users/Administrator/Desktop/top.jpg",
    #     imageback_path="C:/Users/Administrator/Desktop/bottom.jpg"
    # )
    # print("【结果2】拖动拼图:", r2)


模拟人工拖动源码:

import random
import pyautogui

def simulateMoveADistance(xPixel, otherPixel):
    '''
    模拟人类拖动鼠标一段距离(主要用于滑块验证码等场景),
    通过加速度变化和回弹效果使轨迹更自然,避免被反爬机制识别为自动化操作。

    参数说明:
    - xPixel: 鼠标在 X 轴上需要移动的主像素距离(理想目标值)
    - otherPixel: 额外的随机补偿像素,用于增加轨迹不确定性(防检测)
    '''

    # 在原始目标距离基础上增加一个固定偏移(20像素)和随机补偿,使总移动距离略大于预期
    xPixel += 20 + otherPixel

    # 初始速度 v0 = 0(从静止开始加速)
    v0 = 0

    # 定义可能的加速度值(单位:像素/秒²),模拟人手启动时的力度变化
    a_list = [3, 4, 5]

    # 时间步长(每次移动的时间间隔,单位:秒),控制运动节奏
    t = 0.2

    # 已移动的累计距离(初始为0)
    s = 0

    # 存储“前半段”每一步移动的像素增量(正向移动)
    front = []

    # “回弹”阶段的微调像素列表(负值表示向左微移),模拟人手松开前的轻微回调
    back = [-1, -1, -2, -3, -2, -3, -2, -2, -3, -1]

    # 将整个移动过程分为两段:前3/5为加速+匀速,后2/5为减速
    mid = xPixel * 3 / 5

    # 模拟物理运动:使用匀变速直线运动公式 s = v0*t + 0.5*a*t^2
    while s < xPixel:
        # 前半程:施加正向加速度(加速或维持高速)
        if s < mid:
            a = a_list[random.randint(0, 2)]  # 随机选择一个加速度
        # 后半程:施加负向加速度(减速)
        else:
            a = -a_list[random.randint(0, 2)]  # 随机选择一个减速度(负值)

        # 当前初速度为上一时刻的末速度 v0
        v = v0

        # 计算本时间步内移动的距离(位移)
        stack = v * t + 0.5 * a * t ** 2
        stack = round(stack)  # 四舍五入为整数像素

        # 累加到总位移
        s += stack

        # 更新末速度,作为下一次的初速度
        v0 = v + a * t

        # 记录这一步的移动量(可能为正或负)
        front.append(stack)

    # ===== 开始执行鼠标操作 =====

    # 设置全局操作暂停时间(此处先设为2秒无实际作用,会被下一行覆盖)
    pyautogui.PAUSE = 2

    # 重置全局暂停时间为 0.2 秒(影响后续所有 pyautogui 操作之间的默认延迟)
    pyautogui.PAUSE = 0.2

    # 按下鼠标左键(开始拖动,例如拖动滑块)
    pyautogui.mouse
    

您可能感兴趣的与本文相关的镜像

Python3.8

Python3.8

Conda
Python

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值