要实现验证码自动识别与填写,需分步骤结合图像识别(OCR)和自动化操作技术。以下是详细方案(以 Web 页面为例,App 逻辑类似,需替换自动化工具):
一、核心思路
-
获取验证码图片:从页面中定位并截取验证码区域。
-
OCR 识别验证码:通过图像识别技术提取验证码字符。
-
自动填写验证码:将识别结果输入到验证码输入框,完成后续操作(如点击"登录/注册")。
二、步骤拆解与代码实现
🔹 步骤 1:获取验证码图片(Web 场景)
假设目标是 Web 页面,需用Selenium定位验证码图片并下载:
python
from selenium import webdriver
import requests
# 1. 启动浏览器并打开目标页面
driver = webdriver.Chrome() # 需提前安装 ChromeDriver
driver.get("https://目标网站.com/login") # 替换为实际 URL
# 2. 定位验证码图片元素(需根据页面结构修改 XPath/CSS 选择器)
captcha_img = driver.find_element_by_xpath("//img[contains(@src, 'captcha')]")
img_url = captcha_img.get_attribute("src") # 获取图片的网络地址
# 3. 下载验证码图片到本地
response = requests.get(img_url)
with open("captcha.png", "wb") as f:
f.write(response.content)
driver.quit() # 关闭浏览器(后续识别完再启动也可)
🔹 步骤 2:OCR 识别验证码
需根据验证码复杂度选择技术方案:
方案 A:简单验证码(无干扰、清晰)→ Tesseract-OCR
Tesseract 是开源 OCR 引擎,适合简单场景。需安装 pytesseract 和 Tesseract 引擎(https://github.com/tesseract-ocr/tesseract)。
python
import cv2
import pytesseract
# 1. 读取验证码图片
img = cv2.imread("captcha.png")
# 2. 图像预处理(提升识别率,可选步骤)
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # 转灰度
thresh = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY_INV + cv2.THRESH_OTSU)[1] # 二值化
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (3, 3)) # 形态学去噪
clean = cv2.morphologyEx(thresh, cv2.MORPH_CLOSE, kernel)
# 3. 识别文字(配置参数优化:单字符模式、引擎模式)
text = pytesseract.image_to_string(clean, lang="eng", config="--psm 8 --oem 3")
captcha = text.strip() # 清理空格/换行
print(f"识别结果:{captcha}")
方案 B:复杂验证码(含干扰线、扭曲、彩色)→ 第三方 OCR API
若 Tesseract 识别率低,推荐用百度/腾讯/阿里云文字识别 API(需注册获取密钥,适合付费或高精度需求)。以百度 AI 开放平台为例:
-
注册百度 AI,创建应用,获取 API Key 和 Secret Key。
-
调用通用文字识别 API(示例代码):
python
import requests
import base64
def get_baidu_access_token():
"""获取百度 OCR 的 Access Token"""
url = "https://aip.baidubce.com/oauth/2.0/token"
params = {
"grant_type": "client_credentials",
"client_id": "你的API_Key",
"client_secret": "你的Secret_Key"
}
res = requests.get(url, params=params)
return res.json().get("access_token")
def ocr_captcha_with_baidu(image_path):
"""调用百度 OCR 识别验证码"""
access_token = get_baidu_access_token()
with open(image_path, "rb") as f:
img_base64 = base64.b64encode(f.read()).decode()
url = f"https://aip.baidubce.com/rest/2.0/ocr/v1/general_basic?access_token={access_token}"
headers = {"Content-Type": "application/x-www-form-urlencoded"}
data = {"image": img_base64}
res = requests.post(url, headers=headers, data=data)
if "words_result" in res.json():
return "".join([item["words"] for item in res.json()["words_result"]])
return ""
captcha = ocr_captcha_with_baidu("captcha.png")
print(f"百度 OCR 识别结果:{captcha}")
🔹 步骤 3:自动填写验证码
识别出验证码后,用自动化工具(如 Selenium)填充到输入框:
python
from selenium import webdriver
driver = webdriver.Chrome()
driver.get("https://目标网站.com/login") # 重新打开页面(或复用之前会话)
# 定位验证码输入框并填写
captcha_input = driver.find_element_by_xpath("//input[@placeholder='请输入手机验证码']")
captcha_input.send_keys(captcha) # 填入识别结果
# (可选)后续操作:点击"登录/注册"
login_btn = driver.find_element_by_xpath("//button[text()='登录/注册']")
login_btn.click()
driver.quit()
三、进阶注意事项
-
验证码时效性:多数验证码有过期时间(如 60 秒),需优化流程速度(减少截图、网络请求耗时)。
-
反爬对抗:部分网站会检测 Selenium 等自动化工具(如识别 WebDriver 特征),需做反反爬:
• 隐藏 WebDriver 标识:options.add_argument("--disable-blink-features=AutomationControlled")
• 模拟人工操作延迟:time.sleep(1) 模拟思考时间。
- 复杂验证码处理:若为滑动、点选、行为验证码,需用专用自动化工具(如 Selenium 模拟拖拽、Appium 模拟手势)或打码平台(如超级鹰、若快)。
四、总结流程
定位截图验证码 → OCR 识别字符 → 自动化填写 → 完成登录/注册
根据验证码复杂度和使用场景,灵活选择 OCR 方案(开源 Tesseract 或付费 API),并结合自动化工具实现全流程自动化~