六安市网站建设_网站建设公司_图标设计_seo优化
2026/1/7 13:11:33 网站建设 项目流程

一、简介

上面就是真实识别验证码,点击、通过的动态图。实际测试通过率99.9%。达到了一个非常完美的效果。

二、实战代码

下面是使用Python写的一个模拟点击,识别通过验证码的代码,使用了DrissionPage。点击速度大家可以自行调整,测试。也可以在下面代码基础上进行修改,与自己的业务相结合,大幅减少大家自己研究时间和开发量。

import re import time import json import base64 import random import requests from PIL import Image from io import BytesIO from DrissionPage import Chromium from DrissionPage import ChromiumPage from DrissionPage import ChromiumOptions from DrissionPage.common import Actions 验证码识别接口 可以根据自己网络情况选择不同接口 http://bq1gpmr8.xiaomy.net(电信) http://220.167.181.200:9009(移动、电信、联通) 想了解更多验证码识别,请访问:http://220.167.181.200:9009/tool/verifyCodeHomePage2/?_=1767748280984 # 用户的key key = 'qaXZNkpHniKPxw4ZYJj0' #base64编码转PIL def base64_PIL(base64_str): image = base64.b64decode(re.sub(r'data:image/.+?;base64,', '', base64_str)) image = BytesIO(image) image = Image.open(image) return image #PIL图片保存为base64编码 def PIL_base64(img, coding='utf-8'): img_format = img.format if img_format == None: img_format = 'JPEG' format_str = 'JPEG' if 'png' == img_format.lower(): format_str = 'PNG' if 'gif' == img_format.lower(): format_str = 'gif' if img.mode == "P": img = img.convert('RGB') if img.mode == "RGBA": format_str = 'PNG' img_format = 'PNG' output_buffer = BytesIO() # img.save(output_buffer, format=format_str) img.save(output_buffer, quality=100, format=format_str) byte_data = output_buffer.getvalue() base64_str = 'data:image/' + img_format.lower() + ';base64,' + base64.b64encode(byte_data).decode(coding) return base64_str # 接口识别 def shibie(img1, img2): # 图片转base64 img1_base64 = PIL_base64(img1) # 背景点击区大图 img2_base64 = PIL_base64(img2) # 点击顺序小图 # 验证码识别接口 url = "http://220.167.181.200:9009/openapi/verify_code_identify/" data = { # 用户的key "key": key, # 验证码类型 "verify_idf_id": "85", # 背景点击区大图 "img1": img1_base64, # 点击顺序小图 "img2": img2_base64, } header = {"Content-Type": "application/json"} # 发送请求调用接口 response = requests.post(url=url, json=data, headers=header) # 判断是否正确请求 if response.json()['code'] == 200: print(response.json()) return eval(response.json()['data']['res_str']) else: print('参数错误,请前往得塔云了解详情:http://bq1gpmr8.xiaomy.net/tool/verifyCodeHomePage2/?_=1714093687434') print('错误参数:', response.json()) return None # 记录是否验证通过 is_pass = None # 统计正确数量 t_num = 0 # 统计错误数量 f_num = 0 while 1: try: page = Chromium(9225).latest_tab # 访问目标网站 page.get('https://etax.zhejiang.chinatax.gov.cn:8443/') # 点击登录按钮 btn = page.ele('xpath://span[@class="loginBtn"]') btn.click() # 执行点击操作 # 填写信用代码 input = page.ele('xpath://input[@placeholder="统一社会信用代码/纳税人识别号"]') input.clear() # 清空原有内容(可选) input.input("91370800726217022E") # 填写手机号码 input = page.ele('xpath://input[@placeholder="居民身份证号码/手机号码/用户名"]') input.clear() # 清空原有内容(可选) input.input("13694853495") # 填写手机号码 input = page.ele('xpath://input[@placeholder="个人用户密码"]') input.clear() # 清空原有内容(可选) input.input("dyahohdfohwekjd") # 点击登录按钮 btn = page.ele('xpath://button[@class="el-button loginCls el-button--primary"]') btn.click() # 执行点击操作 # 等待验证码图片出现 # 判断是哪种验证码 # 单图特征:id="tpass-captcha-slider-concat-img-div" # 旋转特征:id="tpass-captcha-slider-bg-img",id="tpass-captcha-slider-move-img" # 中文特征:id="tpass-captcha-tip-img" for j in range(10000): if is_pass == None: pass elif is_pass == True: # 点击按钮 btn = page.ele('xpath://button[@class="el-button loginCls el-button--primary"]') btn.click() # 执行点击操作 elif is_pass == False: pass for i in range(10): time.sleep(1) html_str = page.html # 判断是哪种验证码 if 'id="tpass-captcha-slider-concat-img-div"' in html_str: print('滑动拼图') break elif 'id="tpass-captcha-tip-img"' in html_str: print('中文验证') # 获取图片 img_tag = page.ele('xpath://img[@id="tpass-captcha-slider-bg-img"]') # 获取图片base64 img1_base64 = img_tag.attr('src') # base64转PIL img1 = base64_PIL(img1_base64) # 获取图片 img_tag = page.ele('xpath://img[@id="tpass-captcha-tip-img"]') # 获取图片base64 img2_base64 = img_tag.attr('src') # base64转PIL img2 = base64_PIL(img2_base64) # 识别 point_list = shibie(img1, img2) print('point_list', point_list) # 计算缩放比例 zoom = 300 / img1.width actions = Actions(page) # 点击验证码 div = page.ele('xpath://div[@id="bg-img-click-mask"]') for point in point_list: actions.move_to(div, offset_x=point[0] * zoom, offset_y=point[1] * zoom, duration=.1).click() # 点击确定 btn = page.ele('xpath://div[@class="click-confirm-btn"]') btn.click() # 执行点击操作 for k in range(10): # 判断是否通过验证 id="tpass-captcha-tips" div_msg = page.ele('xpath://div[@id="tpass-captcha-tips"]') print('验证信息:', div_msg.text) if '验证失败' in div_msg.text: # 记录验证没有通过 is_pass = False f_num += 1 break elif '验证成功' in div_msg.text: # 记录验证通过 is_pass = True t_num += 1 break else: # 记录验证通过 is_pass = None time.sleep(0.5) print('正确数量:{},错误数量:{},总数量:{},正确率:{}。'.format(t_num, f_num, t_num + f_num, t_num/(t_num + f_num))) break elif 'id="tpass-captcha-slider-move-img"' in html_str: print('旋转验证') break else: continue time.sleep(2) except: pass

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询