首页 > 其他分享 >使用 Nim 语言处理登录图片验证码的自动化方法

使用 Nim 语言处理登录图片验证码的自动化方法

时间:2024-11-14 10:45:44浏览次数:1  
标签:截图 裁剪 登录 Nim cstring driver 验证码 let

在自动化测试中,处理验证码通常是一个难题,尤其是在登录流程中。验证码图像每次刷新时都会发生变化,因此需要一种方式来自动化识别这些验证码。常见的处理方法有两种:

获取验证码图片 URL 并下载:抓取验证码的 URL 地址来直接下载图片。然而,由于验证码每次都会刷新,直接访问 URL 获取的验证码图像可能与页面上显示的不一致,因此不总是有效。

截图并裁剪验证码区域:通过截图获取整个页面的内容,然后定位验证码区域,裁剪并识别验证码图像内容。使用 OCR(光学字符识别)技术来提取验证码文本。

以下是使用 Nim 语言处理验证码的详细实现步骤。

解决方案
方法一:获取验证码图片 URL 并下载
nim
更多内容访问ttocr.com或联系1436423940
import httpclient, os, strutils, random

获取验证码图片 URL

proc getCaptchaUrl(driver: cstring): cstring =
let element = driver.findElementById("imgvercodeLogin")
let captchaUrl = element.getAttribute("src")
return captchaUrl & ".png"

下载验证码图片

proc saveImage(imgUrl: cstring, fileName: cstring, filePath: cstring) =
if not fileExists(filePath):
mkdir(filePath)

let filePathWithName = filePath & "/" & fileName & ".png"
let client = HttpClient()
client.download(imgUrl, filePathWithName)
echo "验证码图片保存成功:", filePathWithName
在这个实现中,我们首先从网页中获取验证码的 URL 地址,并拼接 .png 后缀。然后使用 HttpClient 下载图片并保存到指定路径。

方法二:截图并裁剪验证码区域
nim

import os, random, time, strutils
import nimx # 假设 nimx 是图像处理库,用于截图和裁剪图片

截图并裁剪验证码区域

proc cropCaptchaImage(driver: cstring, savePath: cstring, captchaElementId: cstring): cstring =
let screenshotName = &"screenshot_" & $random(100000, 999999) & ".png"
let screenshotPath = savePath & "/" & screenshotName

driver.takeScreenshot(screenshotPath) # 获取整个页面的截图

let captchaElement = driver.findElementById(captchaElementId)
let (captchaX, captchaY) = captchaElement.getLocation()
let (captchaWidth, captchaHeight) = captchaElement.getSize()

计算裁剪区域的坐标

let captchaRight = captchaX + captchaWidth
let captchaBottom = captchaY + captchaHeight

打开截图文件并裁剪验证码区域

let img = loadImage(screenshotPath)
let captchaImg = cropImage(img, captchaX, captchaY, captchaRight, captchaBottom)
let croppedImagePath = savePath & "/" & screenshotName & "_captcha.png"
saveImage(croppedImagePath, captchaImg) # 保存裁剪后的验证码图像

return croppedImagePath
在这段代码中,我们首先获取页面的完整截图,然后通过定位验证码元素,裁剪出验证码图像。最后,将裁剪后的验证码图像保存到本地。

获取并识别验证码
nim

import nimx, random
import ocr # 假设 ocr 是 Nim 中的 OCR 库

识别验证码中的文本

proc recognizeCaptchaText(imagePath: cstring): cstring =
let img = loadImage(imagePath)
let text = ocr.recognizeText(img) # 使用 OCR 库识别图像中的文本
echo "识别到的验证码:", text
return text
这里,我们使用了一个假设的 ocr 库,通过加载图像并使用 OCR 技术识别其中的文本,返回验证码内容。

自动填写验证码
nim

import os, time

自动截图、裁剪、识别并填写验证码

proc solveCaptchaAndLogin(driver: cstring, savePath: cstring, captchaElementId: cstring, captchaInputId: cstring) =
let captchaImagePath = cropCaptchaImage(driver, savePath, captchaElementId) # 截图并裁剪验证码
let captchaText = recognizeCaptchaText(captchaImagePath) # 识别验证码

let captchaInput = driver.findElementById(captchaInputId)
captchaInput.sendKeys(captchaText) # 将识别到的验证码输入到表单中
time.sleep(2) # 等待验证码输入完成
此函数通过调用之前的 cropCaptchaImage 和 recognizeCaptchaText 函数获取验证码图像,并识别其中的文本。然后,将识别到的验证码输入到相应的输入框中。

登录流程
nim

import time

启动浏览器并打开登录页面

let driver = startWebDriver("chrome")
driver.get("http://www.cncaq.com/")

填写用户名和密码

driver.findElementById("loginNameText").sendKeys("188XXXXXXXX")
driver.findElementById("passwordText").sendKeys("111111")
time.sleep(2)

处理验证码并进行登录

solveCaptchaAndLogin(driver, "img/login/", "imgvercodeLogin", "verfieldUserText")
driver.findElementByXpath("//*[@id='loginForm']/div[6]/button").click() # 点击登录按钮

检查是否登录成功

var userName = driver.findElementByXpath("//*[@id='userWrap']/div/p").getText()
let expectedUserName = "用户1"

while userName != expectedUserName do
solveCaptchaAndLogin(driver, "img/login/", "imgvercodeLogin", "verfieldUserText")
driver.findElementByXpath("//[@id='loginForm']/div[6]/button").click() # 点击登录按钮
userName = driver.findElementByXpath("//
[@id='userWrap']/div/p").getText()
end

echo "登录成功"

标签:截图,裁剪,登录,Nim,cstring,driver,验证码,let
From: https://www.cnblogs.com/ocr12/p/18545549

相关文章

  • LeetCode 3341. Find Minimum Time to Reach Last Room I
    原题链接在这里:https://leetcode.com/problems/find-minimum-time-to-reach-last-room-i/description/题目:Thereisadungeonwith nxm roomsarrangedasagrid.Youaregivena2Darray moveTime ofsize nxm,where moveTime[i][j] representsthe minimum ......
  • 【Unity第一人称射击游戏 (FPS) 动画框架】FPS Animation Framework ,提供了 武器动画
    FPSAnimationFramework是一款为Unity提供的专门用于第一人称射击游戏(FPS)的动画框架插件。它旨在帮助开发者快速实现FPS游戏中的角色控制、武器操作、动作与动画等核心功能。通过该框架,开发者可以轻松创建高质量、流畅的动画效果,提高玩家的沉浸感与游戏的打击感......
  • 【Unity怪物角色资源包】Fantasy Monsters Animated [Megapack] 丰富的怪物模型,快速充
    FantasyMonstersAnimated[Megapack]是一款为Unity开发的怪物角色资源包,包含了大量动画怪物模型,特别适合RPG、幻想冒险和动作游戏。该资源包不仅提供了种类丰富的怪物模型,还包括多种动画,帮助开发者快速创建复杂且生动的敌人角色。此资源包非常适合想要打造魔幻或中......
  • 使用 Turing 破解滑块验证码
    滑块验证码是互联网中常见的一种防机器人机制,它要求用户通过拖动滑块来将其与背景图像对齐,从而验证用户的身份。本文将演示如何使用Turing编程语言模拟破解滑块验证码。滑块验证码原理滑块验证码通常由两部分组成:背景图像:展示了一个不完整的图像。滑块图像:包含了缺失的部......
  • App中第三方登录和分享模块的实现
    @目录1流程2设计与实现3优化本文目的:“实现一套易于使用、维护的第三方登录和分享模块”我们开发App有时为了吸引用户,会引入三方的授权登录降低用户的注册和登录操作,同时会根据业务需求引入三方的分享服务。目前可用的第三方授权登录和分享有很多,国内比较常用的有微信、QQ、......
  • 通过微信测试公众号实现扫码登录
    目录通过微信测试公众号实现扫码登录一:效果展示:二:功能实现1:流程分析:2:准备工作:1:申请微信测试公众号2:内网穿透3:代码实现:通过微信测试公众号实现扫码登录一:效果展示:我们在扫描完二维码之后会自动跳转到公众号中,然后可以看到:二:功能实现1:流程分析:具体的流程就是......
  • 通过爬虫方式获取小红书授权登录的cookie的代码
    1、代码里的normal_sign.js代码是某书签名算法xs,xt的实现-CSDN博客里的;2、CookieUtil工具代码见抖音最新bd-ticket-guard-client-data逆向方法(2024年11月)-CSDN博客里的CookieUtil.py;importjsonimporttimeimportzlibfromurllib.parseimporturlparseimportexecj......
  • 实战:Mailivery 模拟登录
    问题情景混淆群内的小伙伴遇到这么个问题,Mailivery这个网站登录后,明明提交的表单(邮箱和密码也正确)、请求头等等都没问题,为啥一直重定向到登录页面呢?唉,该出手时就出手啊,我也看看咋回事吧!url:https://app.mailivery.io/login登录参数分析显而易见,需要:邮箱(有邮箱校验)、密码......
  • 华为路由器/交换机配置Console口AAA认证以及Telnet登录
    一、Console口登录 Console口是路由器/交换机的本地管理接口,通常用于设备初始配置和管理。本文将介绍console登录的两种配置方式1、密码模式配置成这种模式后Console登录只需要输入密码。配置方法一[Huawei]user-interfaceconsole0 [Huawei-ui-console0]authentica......
  • Python模块之manim (动画模块)
    模块作用简介:Python模块之manim(动画模块)官方英文帮助:https://docs.python.org/3/library/官方简体中文帮助:https://docs.python.org/zh-cn/3/library/manim官方:https://docs.manim.community/en/stable/installation.html必要操作:>>>frommanimimport*......