本文将详细介绍如何使用C#结合Selenium和OpenCV破解网易易盾滑动验证码。通过模拟人工滑动行为,我们可以实现自动化操作。
环境准备
安装依赖
确保你已经安装了以下软件和库:
Visual Studio:用于C#开发。
NuGet包管理器:用于安装Selenium和OpenCV库。
ChromeDriver:用于控制Chrome浏览器。
使用NuGet来管理依赖,可以在你的项目中添加以下包:
bash
Install-Package Selenium.WebDriver
Install-Package OpenCvSharp4
Install-Package OpenCvSharp4.runtime.win
此外,还需要下载并配置OpenCV库,并将相关的动态链接库(如opencv_world440.dll)放置在合适的路径下。
项目结构
确保你的项目结构如下:
.
├── Program.cs
└── OpenCVUtils.cs
初始化WebDriver并获取验证码图片
Program.cs
csharp
using System;
using System.Drawing;
using System.IO;
using System.Net;
using OpenCvSharp;
using OpenCvSharp.Extensions;
using OpenQA.Selenium;
using OpenQA.Selenium.Chrome;
using OpenQA.Selenium.Interactions;
namespace EasyDunCaptchaBreaker
{
class Program
{
static void Main(string[] args)
{
IWebDriver driver = new ChromeDriver();
driver.Navigate().GoToUrl("https://dun.163.com/trial/jigsaw");
try
{
// 获取滑块和背景图片
IWebElement bgImageElement = driver.FindElement(By.CssSelector("css_selector_for_bg_image"));
IWebElement sliderImageElement = driver.FindElement(By.CssSelector("css_selector_for_slider_image"));
// 下载图片
string bgUrl = bgImageElement.GetAttribute("src");
string sliderUrl = sliderImageElement.GetAttribute("src");
DownloadImage(bgUrl, "bgImage.png");
DownloadImage(sliderUrl, "sliderImage.png");
// 计算滑动距离
double distance = OpenCVUtils.GetDistance("bgImage.png", "sliderImage.png");
// 模拟滑动
IWebElement slider = driver.FindElement(By.CssSelector("css_selector_for_slider"));
MoveSlider(driver, slider, (int)distance);
}
catch (Exception e)
{
Console.WriteLine(e.Message);
}
finally
{
driver.Quit();
}
}
static void DownloadImage(string url, string filePath)
{
using (WebClient client = new WebClient())
{
client.DownloadFile(new Uri(url), filePath);
}
}
static void MoveSlider(IWebDriver driver, IWebElement slider, int distance)
{
Actions actions = new Actions(driver);
actions.ClickAndHold(slider).Perform();
Random rand = new Random();
int moveX = 0;
int moveY = 0;
while (moveX < distance)
{
int x = rand.Next(5, 10);
actions.MoveByOffset(x, moveY).Perform();
moveX += x;
System.Threading.Thread.Sleep(rand.Next(100));
}
actions.Release().Perform();
}
}
}
使用OpenCV计算滑动距离
OpenCVUtils.cs
csharp
using OpenCvSharp;
namespace EasyDunCaptchaBreaker
{
class OpenCVUtils
{
public static double GetDistance(string bgImagePath, string sliderImagePath)
{
Mat bgMat = Cv2.ImRead(bgImagePath, ImreadModes.Grayscale);
Mat sliderMat = Cv2.ImRead(sliderImagePath, ImreadModes.Grayscale);
Mat result = new Mat();
Cv2.MatchTemplate(bgMat, sliderMat, result, TemplateMatchModes.CCoeffNormed);
Cv2.MinMaxLoc(result, out _, out double maxVal, out _, out Point maxLoc);
return maxLoc.X;
}
}
}
更多内容联系q1436423940