CAPSOLVER
博客
使用Ruby和Selenium解决验证码

使用Selenium和Ruby解决CAPTCHA

Logo of CapSolver

Ethan Collins

Pattern Recognition Specialist

29-Aug-2024

验证码,全称“全自动区分计算机和人类的公开图灵测试”,旨在保护网站免受自动化机器人的攻击。虽然它们在保障在线平台安全方面发挥着至关重要的作用,但在使用Selenium等工具自动化任务时,它们却可能成为一个巨大的障碍。如果您正在使用Ruby版本的Selenium,并且需要解决验证码问题,本指南将提供一种逐步处理它们的高效方法。

什么是Selenium和Ruby?

在深入探讨如何解决验证码之前,务必了解您将要使用的工具:Selenium和Ruby。

  • Selenium是一个功能强大的开源工具,用于自动化Web浏览器。它允许开发人员使用各种编程语言编写脚本,以模拟用户与网页的交互,使其成为测试和网络抓取的热门选择。
  • Ruby是一种动态的面向对象编程语言,以其简洁性和生产力而闻名。它经常用于Web开发,并且当与Selenium结合使用时,它提供了一个强大的框架来自动化浏览器任务。

了解验证码及其类型

在深入研究解决方案之前,了解您可能遇到的不同类型的验证码非常重要:

  • 图片转文字验证码: 这些验证码要求用户输入扭曲图像中显示的字符。您可以在这里找到一些常见案例here
  • 基于图像的验证码: 用户需要选择符合给定条件的图像(例如,选择所有带有交通灯的图像)。大多数来自reCAPTCHA
  • reCAPTCHA: 谷歌的高级验证码系统,通常需要识别图像中的物体,或者只需单击一个复选框即可证明你不是机器人。

领取顶级验证码解决方案的奖励代码CapSolverWEBS。兑换后,每次充值将获得额外5%的奖励,无限次使用

Selenium Ruby可以解决验证码吗?

开发人员中最常见的问题之一是,Selenium与Ruby是否可以解决验证码。简短的答案是:不能直接解决。Selenium本身没有内置功能来解决验证码,因为验证码的设计初衷就是区分人类用户和机器人。
但是,有多种方法可以在Selenium Ruby中处理验证码:

  1. 人工干预: 在某些情况下,开发人员会在自动化过程中手动解决验证码。但是,这会破坏完全自动化的目的。
  2. 第三方验证码求解器: 最有效的方法是集成像CapSolver这样的第三方服务,这些服务专门使用高级算法和人工智力来解决验证码。
  3. 解决简单的验证码: 对于非常基本的文本验证码,开发人员可能会编写自定义脚本以识别模式,但这是一种有限且通常不可靠的方法。

虽然Selenium Ruby本身无法解决验证码,但是有了合适的工具和服务,完全有可能自动化绕过验证码的过程,我们将在本指南中探讨这一点。

在Ruby中设置Selenium

准备工作

  • 谷歌浏览器: 安装最新版本的Chrome浏览器,因为我们将使用代码与Chrome交互。
  • Ruby: 确保您的计算机上已安装Ruby。
  • Selenium-webdriver: Selenium自动化工具的Ruby库。
  • CapSolver: 官方CapSolver文档将帮助您解决验证码。

在计算机上安装Ruby后,您可以通过运行命令gem install selenium-webdriver来安装Selenium WebDriver库。检查您的Chrome版本,并根据该版本下载相应的chromedriver.exe驱动程序。您可以在以下位置找到下载链接:

  • 下载链接1: 提供最新稳定版、测试版、开发版和Canary版本的驱动程序。
  • 下载链接2: 提供从113版开始的所有驱动程序。
  • 下载链接3: 提供113版之前的驱动程序。

分析目标网站

我们将使用网站https://recaptcha-demo.appspot.com/recaptcha-v2-checkbox.php作为示例,使用Ruby Selenium解决reCAPTCHA。

在开始之前,我们需要了解HTML表单提交的基础知识。通过观察此页面并打开开发者工具,我们可以手动解决reCAPTCHA,然后单击提交按钮。此操作将发送POST请求,提交三个字段:ex-aex-bg-recaptcha-response,如下所示:

这三个字段对应于初始HTML源代码中表单下的两个输入元素和一个文本区域元素,如下所示:

使用Ruby Selenium自动化流程

我们如何使用Ruby Selenium自动化整个过程?步骤如下:

  1. Ruby驱动Selenium访问目标网站。
  2. Ruby调用CapSolver API来解决reCAPTCHA并获取令牌。
  3. 将文本区域元素的CSS样式从display: none更改为display: block,使其可以与Selenium交互。
  4. 模拟将CapSolver返回的令牌输入到文本区域元素中。
  5. 模拟单击提交按钮以提交表单并完成验证。

使用Ruby Selenium访问目标网站

确保您在下面的代码中将driver_path替换为您计算机上chromedriver的实际路径。

ruby 复制代码
require 'selenium-webdriver'

# 初始化Chrome浏览器选项并访问目标网站
driver_path = "path/to/chromedriver.exe"
options = Selenium::WebDriver::Chrome::Options.new
service = Selenium::WebDriver::Service.chrome(path: driver_path)
driver = Selenium::WebDriver.for :chrome, options: options, service: service
url = "https://recaptcha-demo.appspot.com/recaptcha-v2-checkbox.php"
driver.navigate.to url

获取令牌

要使用CapSolver API,我们需要提供websiteKey,这可以通过在页面源代码中搜索关键字data-sitekey来找到:

现在,让我们编写Ruby代码来使用CapSolver API自动解决reCAPTCHA:

ruby 复制代码
require 'net/http'
require 'json'
require 'time'

def cap_solver(api_key, public_key, page_url)
  payload = {
    "clientKey" => api_key,
    "task" => {
      "type" => 'ReCaptchaV2TaskProxyLess',
      "websiteKey" => public_key,
      "websiteURL" => page_url,
    }
  }

  # 发送任务创建请求
  uri = URI("https://api.capsolver.com/createTask")
  res = Net::HTTP.post(uri, payload.to_json, { "Content-Type" => "application/json" })
  resp = JSON.parse(res.body)
  task_id = resp["taskId"]

  unless task_id
    puts "Failed to create task: #{res.body}"
    return
  end

  puts "Got taskId: #{task_id}"

  # 循环等待获取任务结果
  loop do
    sleep(1)
    payload = { "clientKey" => api_key, "taskId" => task_id }
    uri = URI("https://api.capsolver.com/getTaskResult")
    res = Net::HTTP.post(uri, payload.to_json, { "Content-Type" => "application/json" })
    resp = JSON.parse(res.body)
    status = resp["status"]
    if status == "ready"
      token = resp.dig("solution", "gRecaptchaResponse")
      puts "Solve succeed, token: #{token}"
      return token
    elsif status == "processing"
      puts "Solve in progress..."
    elsif status == "failed"
      puts "Solve failed! response: #{res.body}"
      return
    end
  end
end

在Selenium中使用令牌

接下来,我们需要将令牌输入网页,自动单击提交,并完成整个过程。让我们组合所有代码;完整的代码如下(请务必将cap_solver_api_key替换为您自己的密钥,您可以在CapSolver仪表盘中找到):

ruby 复制代码
require 'selenium-webdriver'
require 'net/http'
require 'json'
require 'time'

def cap_solver(api_key, website_key, page_url)
  payload = {
    "clientKey" => api_key,
    "task" => {
      "type" => 'ReCaptchaV2TaskProxyLess',
      "websiteKey" => website_key,
      "websiteURL" => page_url,
    }
  }

  # 发送任务创建请求
  uri = URI("https://api.capsolver.com/createTask")
  res = Net::HTTP.post(uri, payload.to_json, { "Content-Type" => "application/json" })
  resp = JSON.parse(res.body)
  task_id = resp["taskId"]

  unless task_id
    puts "Failed to create task: #{res.body}"
    return
  end

  puts "Got taskId: #{task_id}"

  # 循环等待获取任务结果
  loop do
    sleep(1)
    payload = { "clientKey" => api_key, "taskId" => task_id }
    uri = URI("https://api.capsolver.com/getTaskResult")
    res = Net::HTTP.post(uri, payload.to_json, { "Content-Type" => "application/json" })
    resp = JSON.parse(res.body)
    status = resp["status"]
    if status == "ready"
      token = resp.dig("solution", "gRecaptchaResponse")
      puts "Solve succeed, token: #{token}"
      return token
    elsif status == "processing"
      puts "Solve in progress..."
    elsif status == "failed"
      puts "Solve failed! response: #{res.body}"
      return
    end
  end
end

# 初始化Chrome浏览器选项并访问目标网站
driver_path = "path/to/chromedriver.exe"
options = Selenium::WebDriver::Chrome::Options.new
service = Selenium::WebDriver::Service.chrome(path: driver_path)
driver = Selenium::WebDriver.for :chrome, options: options, service: service
url = "https://recaptcha-demo.appspot.com/recaptcha-v2-checkbox.php"
driver.navigate.to url

# 调用CapSolver API来解决ReCaptcha
cap_solver_api_key = 'YOUR_API_KEY'
website_key = '6LfW6wATAAAAAHLqO2pb8bDBahxlMxNdo9g947u9'
token = cap_solver(cap_solver_api_key, website_key, url)
if token.nil? || token.empty?
  puts "Failed to solve captcha, Press any key to exit."
  STDIN.gets
  driver.quit
  return
end

# 更改文本区域的display样式属性为block以使其可见
driver.execute_script("document.getElementById('g-recaptcha-response').style.display = 'block';")
# 模拟将令牌输入到文本区域
textarea = driver.find_element(id: 'g-recaptcha-response')
textarea.send_keys(token)
# 模拟点击并提交表单
submit_btn = driver.find_element(css: "button[type='submit']")
submit_btn.click

puts "Press any key to exit."
STDIN.gets
driver.quit

运行上述代码,您将看到recaptcha已成功解决。

更多信息

CapSolver使用基于AI的自动Web解锁技术,帮助您在几秒钟内解决验证码。它不仅可以解决reCAPTCHA,还可以解决Cloudflare Turnstile等更多问题。CapSolver还提供多种语言的SDK以及浏览器扩展程序。您可以参考CapSolver文档了解更多信息。

合规声明: 本博客提供的信息仅供参考。CapSolver 致力于遵守所有适用的法律和法规。严禁以非法、欺诈或滥用活动使用 CapSolver 网络,任何此类行为将受到调查。我们的验证码解决方案在确保 100% 合规的同时,帮助解决公共数据爬取过程中的验证码难题。我们鼓励负责任地使用我们的服务。如需更多信息,请访问我们的服务条款和隐私政策。

更多