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

server/2024/11/14 20:44:01/

效果如下:

 实现流程:

一、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识别接口识别,返回识别结果

 核心代码如下:

java">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组件

python"># 执行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})

四、自动登录

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

 python完整代码:

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


http://www.ppmy.cn/server/29856.html

相关文章

Unity SteamVR入门

概述 VR项目现在在当前已经是非常热门的技术&#xff0c;可以给玩家身临其境的感觉&#xff0c;接下来让我们学习这部分的内容吧&#xff01; SteamVR Input SteamVR绑定流程&#xff0c;在Windows窗口的点击SteamVR-input&#xff0c;图1&#xff0c;在这里可以选择你需要绑定…

C语言练习百题之计算字符串中子串出现的次数

程序分析 计算字符串中子串出现的次数&#xff0c;一种直观的方法是遍历整个字符串&#xff0c;在每个位置检查子串是否匹配。另一种方法是利用字符串匹配算法来优化搜索过程&#xff0c;减少时间复杂度。 方法一&#xff1a;暴力法 解题思路&#xff1a; 在主串中依次遍历…

Mybatis基础

1. Myabtis参数的获取 在Mybatis中获取参数是非常常见的操作&#xff0c;无论是增删改查哪种操作&#xff0c;基本都会传入参数。 1.1 获取单个参数 单个参数&#xff1a;mybatis不会做特殊处理&#xff0c; #{参数名/任意名}&#xff1a;取出参数值 1.2 获取多个参数 多个…

python 学习: 矩阵运算

摘要: 本贴通过例子描述 python 的矩阵运算. 1. 一般乘法 (mm 与 matmul) 代码: input_mat1 torch.tensor([[1, 2, 3, 4],[1, 2, 2, 3]])input_mat2 torch.tensor([[1, 2, 3, 3],[2, 1, 2, 3],[3, 1, 2, 2],[2, 3, 2, 3]])print("input_mat1: ", input_mat1)prin…

SpringDI方式及Redis应用场景的分享

1、为什么Spring和IDEA 都不推荐使用 Autowired 注解 大家在使用IDEA开发的时候有没有注意到过一个提示&#xff0c;在字段上使用Spring的依赖注入注解Autowired后会出现如下警告Field injection is not recommended (字段注入是不被推荐的)&#xff1b;但是使用Resource却不会…

Spring Boot可以同时处理多少请求?

Spring Boot本身对并发请求的处理能力没有明确的限制。Spring Boot的并发处理能力通常受到以下因素影响&#xff1a; 服务器硬件&#xff1a;包括CPU核心数、内存大小等。JVM配置&#xff1a;堆内存、永久代或元空间大小等。Web服务器&#xff1a;Spring Boot 默认使用嵌入式的…

XML:基础

一、语法 基本结构&#xff1a; 实例一&#xff1a; <?xml version"1.0" encoding"ISO-8859-1"?> <note data"2008/08/08"> <to>George</to> <from>John</from> <heading>Reminder</heading&…

【Linux 系统】多线程(线程控制、线程互斥与同步、互斥量与条件变量)-- 详解

一、线程概念 线程是进程的一个执行分支&#xff0c;是在进程内部运行的一个执行流。下面将从是什么、为什么、怎么办三个角度来解释线程。 1、什么是线程 上面是一张用户级页表&#xff0c;我们都知道可执行程序在磁盘中无非就是代码或数据&#xff0c;更准确点表述&#xff0…