python+Pyppeteer+SpringBoot验证码自动识别登录(文末附源码)

本文主要是介绍python+Pyppeteer+SpringBoot验证码自动识别登录(文末附源码),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

效果如下:

 实现流程:

一、Pyppeteer打开网址

import asyncio
from pyppeteer import launch
import pdb
import random# 启动 Pyppeteer
browser = await launch({'headless': False})
page = await browser.newPage()# 打开登录页面
await page.goto('http://localhost:8080/login.html')

二、调用后台springboot接口,springboot调用验证码ocr识别接口识别,返回识别结果

 核心代码如下:

public static String getImgWord(String body) {// 【1】请求地址 支持http 和 https 及 WEBSOCKETString host = "https://imgurlocr.market.alicloudapi.com";// 【2】后缀String path = "/urlimages";// 【3】开通服务后 买家中心-查看AppCode,有100次免费String appcode = "xxxxx";// 【4】请求参数,详见文档描述String urlSend = host + path; // 【5】拼接请求链接try {URL url = new URL(urlSend);HttpURLConnection httpURLCon = (HttpURLConnection) url.openConnection();httpURLCon.setRequestMethod("POST");httpURLCon.setRequestProperty("Authorization", "APPCODE " + appcode);// 格式StringBuilder postData = new StringBuilder(body);byte[] postDataBytes = postData.toString().getBytes("UTF-8");httpURLCon.setDoOutput(true);OutputStream out = httpURLCon.getOutputStream();out.write(postDataBytes);out.close();int httpCode = httpURLCon.getResponseCode();if (httpCode == 200) {String json = read(httpURLCon.getInputStream());System.out.println("正常请求计费(其他均不计费)");System.out.println("获取返回的json:");System.out.print(json);return json.substring(json.indexOf("words\":\"")).replace("words\":\"", "").replace("\"}]}", "");} else {Map<String, List<String>> map = httpURLCon.getHeaderFields();String error = map.get("X-Ca-Error-Message").get(0);if (httpCode == 400 && error.equals("Invalid AppCode")) {System.out.println("AppCode错误 ");} else if (httpCode == 400 && error.equals("Invalid Url")) {System.out.println("请求的 Method、Path 或者环境错误");} else if (httpCode == 400 && error.equals("Invalid Param Location")) {System.out.println("参数错误");} else if (httpCode == 403 && error.equals("Unauthorized")) {System.out.println("服务未被授权(或URL和Path不正确)");} else if (httpCode == 403 && error.equals("Quota Exhausted")) {System.out.println("套餐包次数用完 ");} else if (httpCode == 403 && error.equals("Api Market Subscription quota exhausted")) {System.out.println("套餐包次数用完,请续购套餐");} else {System.out.println(httpCode);System.out.println("参数名错误 或 其他错误");System.out.println(error);}return error;}} catch (MalformedURLException e) {System.out.println("URL格式错误");return e.getMessage();} catch (UnknownHostException e) {System.out.println("URL地址错误");return e.getMessage();} catch (Exception e) {// 打开注释查看详细报错异常信息// e.printStackTrace();return e.getMessage();}}/** 读取返回结果*/private static String read(InputStream is) throws IOException {StringBuffer sb = new StringBuffer();BufferedReader br = new BufferedReader(new InputStreamReader(is));String line = null;while ((line = br.readLine()) != null) {line = new String(line.getBytes(), "utf-8");sb.append(line);}br.close();return sb.toString();}

三、将验证码识别结果自动填充到input组件

# 执行JavaScript函数并传递参数,等待结果
response_text = await page.evaluate(postFunction, data)
print(response_text)input_verify_code = await page.xpath("//input[@name='verifyCode']")
await input_verify_code[0].type(response_text, {'delay': random.randint(100, 151) - 50})input_username = await page.xpath("//input[@name='username']")
await input_username[0].type('admin', {'delay': random.randint(100, 151) - 50})input_password = await page.xpath("//input[@name='password']")
await input_password[0].type('123456', {'delay': random.randint(100, 151) - 50})

四、自动登录

# 自动点击"立即登录"按钮
button = await page.xpath('//button[@type="submit"]')# 如果找到了button,则执行回车操作
if button:await button[0].press('Enter')

 python完整代码:

import asyncio
from pyppeteer import launch
import pdb
import randomasync def main():# 启动 Pyppeteerbrowser = await launch({'headless': False})page = await browser.newPage()# 打开登录页面await page.goto('http://localhost:8080/login.html')# 等待await asyncio.sleep(5)# 获取验证码图片组件img = await page.xpath("//*[@id='vCode']")# 获取img的srcsrc = await (await img[0].getProperty('src')).jsonValue()# 定义ajax post请求函数postFunction = """(data) => {// 这里使用fetch API发起POST请求return fetch('http://localhost:8080/getImgWord', {method: 'POST',headers: {'Content-Type': 'application/json',},body: JSON.stringify(data)}).then(response => response.text())}"""# 传递参数给JavaScript函数data = {'img': src}# 执行JavaScript函数并传递参数,等待结果response_text = await page.evaluate(postFunction, data)print(response_text)input_verify_code = await page.xpath("//input[@name='verifyCode']")await input_verify_code[0].type(response_text, {'delay': random.randint(100, 151) - 50})input_username = await page.xpath("//input[@name='username']")await input_username[0].type('admin', {'delay': random.randint(100, 151) - 50})input_password = await page.xpath("//input[@name='password']")await input_password[0].type('123456', {'delay': random.randint(100, 151) - 50})# 自动点击"立即登录"按钮button = await page.xpath('//button[@type="submit"]')# 如果找到了button,则执行回车操作if button:await button[0].press('Enter')# 关闭浏览器# await browser.close()    # 运行爬虫
asyncio.get_event_loop().run_until_complete(main())

完整资源包:

https://download.csdn.net/download/svygh123/89254844

这篇关于python+Pyppeteer+SpringBoot验证码自动识别登录(文末附源码)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/955946

相关文章

Python 字典 (Dictionary)使用详解

《Python字典(Dictionary)使用详解》字典是python中最重要,最常用的数据结构之一,它提供了高效的键值对存储和查找能力,:本文主要介绍Python字典(Dictionary)... 目录字典1.基本特性2.创建字典3.访问元素4.修改字典5.删除元素6.字典遍历7.字典的高级特性默认字典

Java堆转储文件之1.6G大文件处理完整指南

《Java堆转储文件之1.6G大文件处理完整指南》堆转储文件是优化、分析内存消耗的重要工具,:本文主要介绍Java堆转储文件之1.6G大文件处理的相关资料,文中通过代码介绍的非常详细,需要的朋友可... 目录前言文件为什么这么大?如何处理这个文件?分析文件内容(推荐)删除文件(如果不需要)查看错误来源如何避

SpringBoot整合Dubbo+ZK注册失败的坑及解决

《SpringBoot整合Dubbo+ZK注册失败的坑及解决》使用Dubbo框架时,需在公共pom添加依赖,启动类加@EnableDubbo,实现类用@DubboService替代@Service,配... 目录1.先看下公共的pom(maven创建的pom工程)2.启动类上加@EnableDubbo3.实

Python自动化批量重命名与整理文件系统

《Python自动化批量重命名与整理文件系统》这篇文章主要为大家详细介绍了如何使用Python实现一个强大的文件批量重命名与整理工具,帮助开发者自动化这一繁琐过程,有需要的小伙伴可以了解下... 目录简介环境准备项目功能概述代码详细解析1. 导入必要的库2. 配置参数设置3. 创建日志系统4. 安全文件名处

SpringBoot整合(ES)ElasticSearch7.8实践

《SpringBoot整合(ES)ElasticSearch7.8实践》本文详细介绍了SpringBoot整合ElasticSearch7.8的教程,涵盖依赖添加、客户端初始化、索引创建与获取、批量插... 目录SpringBoot整合ElasticSearch7.8添加依赖初始化创建SpringBoot项

JAVA覆盖和重写的区别及说明

《JAVA覆盖和重写的区别及说明》非静态方法的覆盖即重写,具有多态性;静态方法无法被覆盖,但可被重写(仅通过类名调用),二者区别在于绑定时机与引用类型关联性... 目录Java覆盖和重写的区别经常听到两种话认真读完上面两份代码JAVA覆盖和重写的区别经常听到两种话1.覆盖=重写。2.静态方法可andro

使用Python构建一个高效的日志处理系统

《使用Python构建一个高效的日志处理系统》这篇文章主要为大家详细讲解了如何使用Python开发一个专业的日志分析工具,能够自动化处理、分析和可视化各类日志文件,大幅提升运维效率,需要的可以了解下... 目录环境准备工具功能概述完整代码实现代码深度解析1. 类设计与初始化2. 日志解析核心逻辑3. 文件处

SpringBoot中六种批量更新Mysql的方式效率对比分析

《SpringBoot中六种批量更新Mysql的方式效率对比分析》文章比较了MySQL大数据量批量更新的多种方法,指出REPLACEINTO和ONDUPLICATEKEY效率最高但存在数据风险,MyB... 目录效率比较测试结构数据库初始化测试数据批量修改方案第一种 for第二种 case when第三种

python生成随机唯一id的几种实现方法

《python生成随机唯一id的几种实现方法》在Python中生成随机唯一ID有多种方法,根据不同的需求场景可以选择最适合的方案,文中通过示例代码介绍的非常详细,需要的朋友们下面随着小编来一起学习学习... 目录方法 1:使用 UUID 模块(推荐)方法 2:使用 Secrets 模块(安全敏感场景)方法

Java docx4j高效处理Word文档的实战指南

《Javadocx4j高效处理Word文档的实战指南》对于需要在Java应用程序中生成、修改或处理Word文档的开发者来说,docx4j是一个强大而专业的选择,下面我们就来看看docx4j的具体使用... 目录引言一、环境准备与基础配置1.1 Maven依赖配置1.2 初始化测试类二、增强版文档操作示例2.