影刀RPA滑块验证与验证码处理:反爬虫突破实战
·
影刀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. 
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)

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暴力破解密码

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 |
如果本文对你有帮助,欢迎点赞、收藏、转发!有任何问题可以在评论区留言,我会一一解答。
更多推荐




所有评论(0)