影刀RPA滑块验证与验证码处理:反爬虫突破实战

作者:林焱 | 日期:2026-06-09 | 关键词:影刀RPA验证码识别、滑块验证、OCR验证码、反爬虫、自动化登录


摘要

RPA在自动化网页操作时,最大的拦路虎就是各种验证码。本文将系统讲解影刀RPA应对各类验证码的完整方案:滑块验证码(滑动拼图、旋转图片)、图文验证码(OCR识别)、短信验证码(自动读取)、其行为验证码(如极验、网易易盾),以及验证码失败后的重试策略。

阅读收益:

  • 掌握5类验证码的识别与处理方法
  • 学会用影刀RPA模拟人类滑动轨迹(绕过检测)
  • 获得3个完整的验证码处理实战案例
  • 理解反爬虫机制的底层原理与应对策略

在这里插入图片描述

一、验证码的分类与应对策略

1.1 常见验证码类型

验证码类型 出现频率 破解难度 推荐方案
图文验证码(4-6位字母数字) ⭐⭐⭐⭐⭐ OCR识别(90%+准确率)
滑块验证码(拼图/滑动) ⭐⭐⭐⭐ ⭐⭐⭐ 模拟滑动 + 轨迹算法
短信验证码 ⭐⭐⭐ 自动读取短信(Android)或邮件
其行为验证码(如极验) ⭐⭐⭐ ⭐⭐⭐⭐ 第三方打码平台
图片验证码(选图中文字) ⭐⭐ ⭐⭐ 第三方打码平台 or AI识别

1.2 应对策略总览

策略1:避开验证码(最优)
  → 使用Cookie登录(Session持久化)
  → 使用API接口(如果有)
  → 使用已登录的浏览器配置(用户数据目录)

策略2:自动识别验证码(次优)
  → 图文验证码 → OCR识别
  → 滑块验证码 → 模拟人类滑动
  → 短信验证码 → 自动读取

策略3:第三方打码平台(保底)
  → 打码平台:2captcha、超级鹰、若快等
  → 人工打码:平台将验证码发给真人识别
  → 准确率:95%+,但需付费(约0.5-2元/1000张)

策略4:人工介入(兜底)
  → RPA无法识别时,发送通知给人工
  → 人工识别后,输入结果
  → RPA继续后续流程

二、图文验证码自动识别

2.1 图文验证码的识别流程

完整流程:
1. [截图] 截取验证码图片区域
2. [图像预处理] 二值化、去噪、分割字符
3. [OCR识别] 使用OCR引擎识别字符
4. [结果校验] 根据规则校验识别结果(如4位数字/字母)
5. [填入验证码] 将识别结果填入输入框
6. ![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/45f630d10e3045738a1e8a8e0b8aeb30.png#pic_center)

7. [提交验证] 点击"登录"或"验证"按钮
8. [验证结果] 检测是否验证成功
   → 成功:继续后续流程
   → 失败:重新截取验证码 → 重新识别(最多重试5次)

2.2 实战案例:登录页面的图文验证码识别

目标网站: 某政府服务平台登录页(有图文验证码)

步骤1:截取验证码图片

[找图] 模板图片:验证码区域模板.png
  输出变量:{{captcha_x}}, {{captcha_y}}, {{captcha_w}}, {{captcha_h}}

[截图] 
  区域:x={{captcha_x}}, y={{captcha_y}}, w={{captcha_w}}, h={{captcha_h}}
  保存路径:C:\rpa\captcha\captcha_{{timestamp}}.png
  输出变量:{{captcha_image_path}}

步骤2:调用Python进行OCR识别

店群矩阵自动化突破运营极限!

[运行Python脚本]
脚本代码:
  import pytesseract
  from PIL import Image
  import cv2
  import numpy as np
  import re
  
  def preprocess_captcha(image_path):
      """
      验证码图像预处理(提高OCR准确率)
      """
      # 1. 读取图像
      img = cv2.imread(image_path)
      
      # 2. 转为灰度图
      gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
      
      # 3. 二值化(黑白化)
      # 自适应阈值(对付背景复杂的验证码)
      binary = cv2.adaptiveThreshold(
          gray, 
          255, 
          cv2.ADAPTIVE_THRESH_GAUSSIAN_C, 
          cv2.THRESH_BINARY_INV, 
          31, 
          2
      )
      
      # 4. 去噪(去除小的噪点)
      kernel = np.ones((2, 2), np.uint8)
      cleaned = cv2.morphologyEx(binary, cv2.MORPH_OPEN, kernel)
      
      # 5. 保存预处理后的图像
      output_path = image_path.replace(".png", "_processed.png")
      cv2.imwrite(output_path, cleaned)
      
      return output_path
  
  def recognize_captcha(image_path):
      """
      识别验证码
      """
      # 预处理
      processed_path = preprocess_captcha(image_path)
      
      # OCR识别
      img = Image.open(processed_path)
      
      # 配置Tesseract(只识别字母和数字)
      config = "--psm 7 -c tessedit_char_whitelist=0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"
      
      result = pytesseract.image_to_string(img, config=config)
      
      # 后处理:去除空格、换行符,只保留字母和数字
      result_clean = re.sub(r"[^A-Za-z0-9]", "", result)
      
      return result_clean
  
  # 主程序
  captcha_image = "{{captcha_image_path}}"
  captcha_text = recognize_captcha(captcha_image)
  
  print(f"验证码识别结果:{captcha_text}")
  print(captcha_text)  # 输出给影刀RPA捕获
  
输出变量:{{captcha_text}}

[获取Python输出]
  上一个Python脚本的输出 → 保存到变量 {{captcha_result}}

步骤3:填入验证码并提交

[输入文本] 选择器:"//input[@id='captcha']" 文本:{{captcha_result}}
[点击元素] 选择器:"//button[@id='login_btn']"

[等待元素出现] 选择器:"//div[@id='login_success']" 超时:5秒
[条件判断]
  IF 元素出现:
    [记录日志] "登录成功!"
  ELSE:
    [获取文本] 选择器:"//div[@class='error-msg']" → 保存到 {{error_msg}}
    [记录日志] "登录失败:{{error_msg}},重新尝试..."
    [返回] 重新执行"步骤1"(最多重试5次)

2.3 提高OCR准确率的高级技巧

在这里插入图片描述

技巧1:训练专用字体(准确率可达98%+)
  1. 收集该网站的100张验证码样本
  2. 人工标注(告诉OCR每个验证码的正确答案)
  3. 使用Tesseract训练工具,训练专用模型
  4. 在RPA中加载专用模型(替换默认模型)

技巧2:分割字符后单独识别(对付连体字验证码)
  1. 使用投影法(垂直投影)分割字符
  2. 对每个字符单独OCR识别
  3. 拼接结果

技巧3:多模型投票(提高鲁棒性)
  1. 同时使用Tesseract、Commercial OCR SDK、百度OCR API
  2. 对同一个验证码,取3个结果的"众数"(哪个结果出现次数多,就用哪个)
  3. 如3个结果都不同 → 标记为"识别失败",转人工

技巧4:使用深度学习模型(如CRNN)
  1. 收集5000+张验证码样本,人工标注
  2. 训练CRNN(卷积循环神经网络)模型
  3. 准确率可达99%+
  4. 需要GPU训练(成本较高)

三、滑块验证码处理

3.1 滑块验证码的原理

原理:
  1. 网页展示一张"拼图缺口"图片
  2. 用户需要拖动滑块,将拼图放到缺口位置
  3. 后台验证:
     a. 滑动轨迹是否像人类?(速度曲线、加速度、是否有抖动)
     b. 拼图位置是否准确?
     c. 浏览器指纹是否异常?(同一设备频繁操作?)

破解难点:
  1. 需要计算拼图的正确位置(图像匹配)
  2. 需要模拟人类的滑动轨迹(不能匀速!)
  3. 需要处理"行为检测"(如极验会检测鼠标移动轨迹)

3.2 实战案例:滑块验证码自动滑动

步骤1:计算滑块需要滑动的距离

[截图] 截取"拼图缺口"图片 → 保存为 gap.png
[截图] 截取"完整背景"图片 → 保存为 bg.png

[运行Python脚本]
脚本代码:
  import cv2
  import numpy as np
  
  def calculate_slide_distance(gap_image_path, bg_image_path):
      """
      计算滑块需要滑动的距离(像素)
      """
      # 1. 读取图片
      gap = cv2.imread(gap_image_path)
      bg = cv2.imread(bg_image_path)
      
      # 2. 转灰度
      gap_gray = cv2.cvtColor(gap, cv2.COLOR_BGR2GRAY)
      bg_gray = cv2.cvtColor(bg, cv2.COLOR_BGR2GRAY)
      
      # 3. 使用模板匹配,找到缺口位置
      result = cv2.matchTemplate(bg_gray, gap_gray, cv2.TM_CCOEFF_NORMED)
      min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(result)
      
      # 4. 缺口的x坐标 = max_loc[0]
      gap_x = max_loc[0]
      
      # 5. 滑块初始位置(通常滑块在最左边)
      slider_x = 10  # 假设滑块初始x坐标为10
      
      # 6. 需要滑动的距离
      distance = gap_x - slider_x
      
      return distance
  
  distance = calculate_slide_distance("gap.png", "bg.png")
  print(f"需要滑动的距离:{distance} 像素")
  print(distance)  # 输出给影刀RPA
  
输出变量:{{slide_distance}}

步骤2:生成"人类化"的滑动轨迹

在这里插入图片描述

[运行Python脚本]
脚本代码:
  import random
  import math
  
  def generate_human_trajectory(distance):
      """
      生成人类的滑动轨迹
      返回:轨迹列表,每个元素为 (x偏移, y偏移, 时间偏移)
      """
      trajectory = []
      current_x = 0
      current_time = 0
      
      # 人类滑动特点:
      # 1. 开始慢,中间快,结束慢(加速度曲线)
      # 2. 有微小的上下抖动(y轴偏移 ±3像素)
      # 3. 有时间随机性(不是固定时间间隔)
      
      while current_x < distance:
          # 剩余距离
          remaining = distance - current_x
          
          # 根据剩余距离,决定这一步滑动多少
          if remaining > distance * 0.7:
              # 开始阶段:慢
              step = random.uniform(2, 5)
          elif remaining > distance * 0.3:
              # 中间阶段:快
              step = random.uniform(8, 15)
          else:
              # 结束阶段:慢(精准定位)
              step = random.uniform(1, 3)
          
          current_x += step
          
          # y轴抖动
          y_offset = random.uniform(-3, 3)
          
          # 时间偏移(每步间隔 10-30 毫秒)
          time_offset = random.uniform(10, 30)
          current_time += time_offset
          
          trajectory.append({
              "x": round(current_x, 2),
              "y": round(y_offset, 2),
              "time": round(current_time, 2)
          })
      
      return trajectory
  
  trajectory = generate_human_trajectory({{slide_distance}})
  
  # 将轨迹转换为JSON字符串,传给影刀RPA
  import json
  print(json.dumps(trajectory))
  
输出变量:{{trajectory_json}}

[解析JSON]
  JSON字符串:{{trajectory_json}}
  输出:{{trajectory_list}}  (轨迹列表)

步骤3:按照轨迹模拟滑动

[循环] 对 {{trajectory_list}} 中的每个轨迹点:
  1. [鼠标移动到位置]
        x = 轨迹点["x"]
        y = 轨迹点["y"]
        [鼠标按下] 左键  (在第一个轨迹点前按下)
  
  2. [鼠标拖动到位置]
        x = 轨迹点["x"]
        y = 轨迹点["y"]
  
  3. [等待] 轨迹点["time"] 毫秒

[鼠标释放] 左键  (滑动完成)

3.3 滑块验证码的高级对抗技巧

技巧1:使用"物理鼠标"(而非软件模拟)
  → 某些高级验证码会检测"鼠标事件"是否由软件触发
  → 解决方案:使用单片机 + 步进电机,物理移动鼠标(成本较高,但绕过率100%)

技巧2:使用浏览器指纹伪装
  → 如Cloudflare Bot Management会检测:
     - Canvas指纹
     - WebGL指纹
     - 字体指纹
     - 音频指纹
  → 解决方案:使用指纹浏览器(如AdsPower、Multilogin)

技巧3:使用"打码平台"的人工辅助
  → 对于极验、网易易盾等高级验证码
  → 可以调用打码平台的"人工打码"API
  → 平台将验证码发给真人,真人在浏览器中完成验证
  → RPA获取验证成功的Cookie,继续后续操作

四、短信验证码自动读取

4.1 短信验证码的获取方式

方式1:Android手机 + ADB(推荐)
  1. RPA运行在电脑上
  2. Android手机通过USB连接电脑
  3. 使用ADB命令读取手机短信数据库
  4. 解析出最新的验证码短信

方式2:邮件转发(如运营商支持)
  1. 在手机上设置"短信转发到邮件"
  2. RPA自动读取邮件(使用影刀RPA的邮件自动化功能)
  3. 从邮件正文中提取验证码

方式3:短信转发App(如Tasker、IFTTT)
![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/474f504b66da459684548ecd248d4459.png#pic_center)

  1. 在手机上安装短信转发App
  2. 设置规则:收到短信 → 调用Webhook(发送到RPA服务器)
  3. RPA启动HTTP服务,接收短信内容

方式4:使用短信接码平台(不推荐,合规风险)
  1. 使用第三方接码平台(如Twilio、阿里云短信服务)
  2. 申请一个虚拟手机号
  3. 接收短信 → 读取验证码
  ⚠️ 注意:某些网站禁止使用虚拟手机号注册!

4.2 实战案例:通过ADB读取Android手机短信

前提条件:

  • Android手机已开启"开发者选项"和"USB调试"
  • 电脑已安装ADB工具
  • 手机已通过USB连接电脑,并授权USB调试

步骤1:使用ADB读取最新短信

[执行系统命令]
  命令:adb devices
  输出变量:{{adb_devices_output}}
  
[条件判断]
  IF {{adb_devices_output}} 包含 "device":
    [记录日志] "手机已连接"
  ELSE:
    [记录日志] "手机未连接,请检查USB调试是否开启"
    [停止流程]

[执行系统命令]
  命令:adb shell content query --uri content://sms/inbox --projection body,date,address --sort "date DESC" --limit 1
  输出变量:{{latest_sms}}
  
[解析短信内容]
  # 返回格式示例:
  # Row: 0 body=您的验证码是:123456,5分钟内有效。, date=1717900000000, address=1069800000000
  
  [正则表达式提取]
    文本:{{latest_sms}}
    正则表达式:body=(.*?),
    提取结果 → 保存到变量 {{sms_body}}
  
  [正则表达式提取]
    文本:{{sms_body}}
    正则表达式:验证码[是为::]{0,2}(\d{4,6})
    提取结果 → 保存到变量 {{sms_code}}
  
[记录日志] "成功提取短信验证码:{{sms_code}}"

步骤2:将验证码填入网页

[输入文本] 选择器:"//input[@id='sms_code']" 文本:{{sms_code}}
[点击元素] 选择器:"//button[@id='verify_btn']"

五、第三方打码平台集成

5.1 打码平台的选择

在这里插入图片描述

平台名称 支持类型 价格 准确率 API文档
2captcha 图文、滑块、reCAPTCHA $0.5/1000张 95%+ 完善
超级鹰 图文、滑块、汉字点选 ¥0.5/1000张 90%+ 完善
若快打码 图文、滑块 ¥0.3/1000张 85%+ 一般
极验(官方) 极验验证码(官方提供的测试KEY) 免费(测试) - 完善

5.2 实战案例:调用2captcha API识别图文验证码

步骤1:上传验证码图片到2captcha

[HTTP请求]
  方法:POST
  URL:http://2captcha.com/in.php
  请求体(form-data):
    key = {{your_api_key}}
    method = base64
    body = (验证码图片的base64编码)
  
  输出变量:{{upload_response}}

[解析JSON]
  JSON字符串:{{upload_response}}
  提取字段:"request" → 保存到变量 {{captcha_task_id}}
  # 返回格式:{"status":1, "request":"73411311114"}

步骤2:轮询获取识别结果

[循环] 最多轮询20次(每次间隔3秒):
  1. [HTTP请求]
       方法:GET
       URL:http://2captcha.com/res.php?key={{your_api_key}}&action=get&id={{captcha_task_id}}
       输出变量:{{poll_response}}
  
  2. [条件判断]
        IF {{poll_response}} 包含 "CAPCHA_NOT_READY":
          [等待] 3秒
          继续循环
        ELIF {{poll_response}} 包含 "OK|":
          [字符串替换]
             文本:{{poll_response}}
             查找:"OK|"
             替换:""
             结果 → 保存到变量 {{captcha_text}}
          [记录日志] "打码平台识别成功:{{captcha_text}}"
          跳出循环
        ELSE:
          [记录日志] "打码平台返回错误:{{poll_response}}"
          [停止流程]

步骤3:填入识别结果

[输入文本] 选择器:"//input[@id='captcha']" 文本:{{captcha_text}}
[点击元素] 选择器:"//button[@id='submit_btn']"

在这里插入图片描述

六、验证码处理的重试与人工介入机制

6.1 重试策略设计

temu店群自动化报活动案例

重试策略:
  1. 图文验证码:
     → 识别失败 → 立即重试(重新截取验证码图片)
     → 最多重试5次
     → 仍失败 → 转人工

  2. 滑块验证码:
     → 滑动失败 → 等待30秒(防止被封IP)
     → 重新计算滑动距离 + 生成新轨迹
     → 最多重试3次
     → 仍失败 → 转打码平台 or 人工

  3. 短信验证码:
     → 未收到短信 → 等待60秒
     → 重新请求发送验证码
     → 最多重试3次
     → 仍失败 → 检查手机号是否正确 or 转人工

6.2 人工介入机制

人工介入触发条件:
  1. 自动识别连续失败3次
  2. 打码平台返回错误(如:余额不足、服务器错误)
  3. 遇到未知类型的验证码(RPA无法处理)

人工介入实现方式:
  方式1:弹窗提示(RPA运行在本机)
    [显示弹窗]
       标题:"需要人工协助"
       内容:"验证码识别失败,请手动输入验证码:"
       输入框 → 保存到变量 {{manual_captcha}}
  
  方式2:发送企业微信/钉钉通知(RPA运行在服务器)
    [发送企业微信消息]
       接收人:{{operator}}
       内容:"⚠️ 验证码识别失败,请访问 http://rpa-agent.example.com/captcha 手动处理"
  
  方式3:暂停流程,等待人工操作后继续
    [等待文件出现]
       文件路径:C:\rpa\human_input\captcha_result.txt
       超时:300秒(5分钟)
    
    [读取文件] 文件路径:C:\rpa\human_input\captcha_result.txt
       输出变量:{{manual_captcha}}
    
    [删除文件] 文件路径:C:\rpa\human_input\captcha_result.txt

七、反爬虫机制的全面应对

7.1 常见反爬虫机制与应对

在这里插入图片描述

反爬虫机制 检测原理 应对方案
User-Agent检测 检查请求头中的User-Agent是否常见 使用真实浏览器的User-Agent(随机轮换)
IP频率限制 同一IP短时间内请求过多 使用代理IP池(如蘑菇代理、快代理)
Cookie/Session验证 检查是否已登录 使用Cookie持久化(保存登录态)
Referer检测 检查请求是否来自合法页面 设置正确的Referer请求头
JavaScript混淆 关键逻辑用JS混淆,无法直接计算 使用影刀RPA的"执行JavaScript"指令
Canvas指纹 检测浏览器Canvas渲染是否一致 使用指纹浏览器(如AdsPower)
鼠标行为分析 检测鼠标移动轨迹是否像人类 使用本文第三章的"人类化轨迹生成"
设备指纹 综合检测浏览器指纹(屏幕分辨率、时区、字体等) 使用指纹浏览器,每个RPA实例使用不同的指纹

7.2 实战案例:使用代理IP池绕过IP限制

[步骤1:从代理IP池获取IP]
[HTTP请求]
  方法:GET
  URL:http://proxy-pool.example.com/get
  输出变量:{{proxy_response}}

[解析JSON]
  JSON字符串:{{proxy_response}}
  提取字段:"proxy" → 保存到变量 {{proxy_ip}}:{{proxy_port}}

[步骤2:配置影刀RPA使用代理]
[打开网页(带代理)]
  URL:https://target-website.com
  代理设置:
    HTTP代理:{{proxy_ip}}:{{proxy_port}}
    HTTPS代理:{{proxy_ip}}:{{proxy_port}}

[步骤3:检测IP是否被封]
[执行JavaScript]
  脚本:return document.body.innerHTML
  输出变量:{{page_content}}

[条件判断]
  IF {{page_content}} 包含 "访问频率过高":
    [记录日志] "IP已被封禁,切换新IP"
    [返回] 重新执行"步骤1"
  ELSE:
    [记录日志] "IP正常,继续操作"]

八、总结与延伸学习

8.1 本文知识要点

知识点 掌握标准 相关文章
图文验证码OCR识别 能独立完成登录页面的验证码识别 本文
滑块验证码轨迹生成 能生成"人类化"的滑动轨迹 本文
短信验证码自动读取 能通过ADB读取Android手机短信 本文
打码平台API调用 能调用2captcha API识别验证码 本文
反爬虫机制应对 能配置代理IP池绕过IP封禁 本文

8.2 验证码处理的伦理与合规

⚠️ 重要提醒:

1. 遵守网站的服务条款(ToS)
   → 某些网站明确禁止自动化操作
   → 违反ToS可能导致账号被封

2. 不要用于恶意攻击
   → 不要使用RPA进行DDOS攻击
   → 不要使用RPA暴力破解密码

![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/31c08a1ace1c49a4b7e588323d570df1.png#pic_center)

3. 保护用户隐私
   → 不要截取包含用户个人信息的页面
   → 验证码识别日志要妥善保存(不要泄露)

4. 合规使用打码平台
   → 某些打码平台可能涉及黑灰产
   → 选择正规、合法的打码平台

8.3 下期预告

第47篇:《影刀RPA微信自动化:个人号、公众号、企业微信全攻略》
将深入讲解RPA在微信生态中的自动化应用:个人微信号自动回复、公众号文章自动采集、企业微信自动发送消息等实用场景。


附录

附录A:验证码处理检查清单

实施前检查:
□ 网站是否允许自动化操作?(检查ToS)
□ 验证码类型是否已明确?(图文/滑块/短信/其他)
□ 是否有测试账号?(不要对生产账号测试)
□ 打码平台API Key是否已获取?

实施中检查:
□ 识别失败后是否有重试机制?
□ 是否记录了详细的识别日志?(便于后续优化)
□ 是否设置了合理的请求间隔?(不要给目标网站造成压力)
□ 代理IP池是否正常工作?

实施后检查:
□ 识别准确率是否达到预期?(如<80%,需要优化)
□ 是否有验证码失败导致流程中断的情况?
□ 打码平台费用是否在预算范围内?

附录B:常用工具与库

工具/库 用途 安装方式
Tesseract OCR 图文验证码识别 apt install tesseract-ocr (Linux) or 下载安装包 (Windows)
pytesseract Python调用Tesseract pip install pytesseract
OpenCV (cv2) 图像预处理、模板匹配 pip install opencv-python
Pillow (PIL) 图像读取与处理 pip install Pillow
ADB (Android Debug Bridge) 读取Android手机短信 随Android SDK安装
2captcha-python 调用2captcha API pip install 2captcha-python
selenium (备选) 浏览器自动化(如验证码在iframe中) pip install selenium

如果本文对你有帮助,欢迎点赞、收藏、转发!有任何问题可以在评论区留言,我会一一解答。
在这里插入图片描述

Logo

免费领 150 小时云算力,进群参与显卡、AI PC 幸运抽奖

更多推荐