破解验证码的实用技巧:使用 R 和 RSelenium 实现

在现代网页应用中,图形验证码是一种常见的防护措施,但这也给自动化测试带来了挑战。本文将介绍两种有效的方法来处理验证码:获取验证码图片链接和使用 RSelenium 进行截屏和裁剪。

方法一:获取验证码图片地址并下载
我们可以尝试获取验证码的图片链接并下载它。以下是 R 语言的实现代码:

r

library(RSelenium)

启动 RSelenium

rD <- rsDriver(browser = "firefox", port = 4445L, verbose = FALSE)
remDr <- rD[["client"]]

打开登录页面

remDr$navigate("http://example.com/login")
更多内容访问ttocr.com或联系1436423940

获取验证码图片链接

captcha_src <- remDr$findElement(using = "css selector", value = "#captchaImage")$getElementAttribute("src")
img_url <- paste0(captcha_src, ".png") # 拼接下载地址
file_name <- paste0("img/login/", sample(1:100000, 1), ".png") # 随机文件名

下载验证码图片

download.file(img_url, destfile = file_name, mode = "wb")
cat("验证码图片保存成功:", file_name, "\n")

关闭浏览器

remDr$close()
rD$server$stop()
方法二:使用 RSelenium 截屏并裁剪验证码
如果获取链接不可靠,我们可以通过截屏获取验证码。以下是 R 语言的实现代码:

r

library(RSelenium)
library(magick)

启动 RSelenium

rD <- rsDriver(browser = "firefox", port = 4445L, verbose = FALSE)
remDr <- rD[["client"]]

打开登录页面

remDr$navigate("http://example.com/login")

截取整个页面

screenshot <- remDr$screenshot(display = TRUE)

定位验证码元素

captcha_element <- remDr$findElement(using = "css selector", value = "#captchaImage")
location <- captcha_element$getElementLocation()
size <- captcha_element$getElementSize()

裁剪验证码

img <- image_read(screenshot)
captcha_img <- image_crop(img, geometry_area(size$width, size$height, location$x, location$y))
captcha_file_name <- paste0("img/login/", sample(1:100000, 1), "_captcha.png")
image_write(captcha_img, path = captcha_file_name)

cat("验证码裁剪并保存成功:", captcha_file_name, "\n")

关闭浏览器

remDr$close()
rD$server$stop()
输入验证码并登录
最后,我们可以使用 tesseract 识别验证码内容,并将其输入到登录框中。以下是示例代码:

r

library(RSelenium)
library(magick)
library(tesseract)

启动 RSelenium

rD <- rsDriver(browser = "firefox", port = 4445L, verbose = FALSE)
remDr <- rD[["client"]]

打开登录页面

remDr$navigate("http://example.com/login")

输入用户名和密码

remDr$findElement(using = "css selector", value = "#username")$sendKeys("your_username")
remDr$findElement(using = "css selector", value = "#password")$sendKeys("your_password")

识别验证码并输入

captcha_file_path <- "img/login/your_captcha_file.png" # 替换为实际文件路径
captcha_text <- tesseract::ocr(captcha_file_path)
remDr$findElement(using = "css selector", value = "#captchaInput")$sendKeys(trimws(captcha_text))

提交登录

remDr$findElement(using = "css selector", value = "#loginButton")$click()

检查登录状态

if (grepl("欢迎", remDr$getPageSource())) {
cat("登录成功!\n")
} else {
cat("登录失败,验证码可能输入错误。\n")
}

关闭浏览器

remDr$close()
rD$server$stop()

posted @   ttocr、com  阅读(25)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· C#/.NET/.NET Core技术前沿周刊 | 第 29 期(2025年3.1-3.9)
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
点击右上角即可分享
微信分享提示