自动识别点触验证码

  1. 目标
    本节的目标是使用 C# 语言通过程序自动识别并通过点触验证码。

  2. 准备工作
    我们将使用 C# 的 Selenium 库和 Chrome 浏览器。请确保已经安装好了 Selenium WebDriver 和 Chrome 浏览器,并配置好了 ChromeDriver。相关的安装和配置可以参考 Selenium 官方文档。

  3. 了解点触验证码
    点触验证码是一种需要用户点击图像中特定文字或图案的验证方式。此类验证码的识别难度较大,因此我们将借助第三方验证码识别平台(如超级鹰)来实现自动化。

  4. 识别思路
    直接通过图像识别技术来识别点触验证码难度较大,尤其是复杂的文字和图像。我们将利用超级鹰提供的服务,通过提交验证码图片获取识别结果,然后模拟点击识别出的坐标位置。

  5. 注册账号
    首先需要注册一个超级鹰账号并申请一个软件 ID。可以在超级鹰官网进行注册。注册完成后,在开发者中心添加一个软件 ID,并充值一些题分。

  6. 获取 API
    超级鹰提供了适用于 C# 的 API。以下是 C# 的 API 实现代码:

csharp

using System;
using System.Collections.Generic;
using System.IO;
using System.Net.Http;
using System.Security.Cryptography;
using System.Text;
using System.Threading.Tasks;
using Newtonsoft.Json;

public class Chaojiying
{
private string username;
private string password;
private string softId;

public Chaojiying(string username, string password, string softId)
{
    this.username = username;
    this.password = GetMd5Hash(password);
    this.softId = softId;
}

private string GetMd5Hash(string input)
{
    using (var md5 = MD5.Create())
    {
        var data = md5.ComputeHash(Encoding.UTF8.GetBytes(input));
        var sb = new StringBuilder();
        for (int i = 0; i < data.Length; i++)
        {
            sb.Append(data[i].ToString("x2"));
        }
        return sb.ToString();
    }
}

public async Task<Dictionary<string, object>> PostPic(byte[] img, int codeType)
{
    using (var client = new HttpClient())
    {
        using (var content = new MultipartFormDataContent())
        {
            content.Add(new StringContent(username), "user");
            content.Add(new StringContent(password), "pass2");
            content.Add(new StringContent(softId), "softid");
            content.Add(new StringContent(codeType.ToString()), "codetype");
            content.Add(new ByteArrayContent(img), "userfile", "captcha.jpg");

            var response = await client.PostAsync("http://upload.chaojiying.net/Upload/Processing.php", content);
            var responseString = await response.Content.ReadAsStringAsync();
            return JsonConvert.DeserializeObject<Dictionary<string, object>>(responseString);
        }
    }
}

public async Task<Dictionary<string, object>> ReportError(string imgId)
{
    using (var client = new HttpClient())
    {
        var content = new MultipartFormDataContent
        {
            { new StringContent(username), "user" },
            { new StringContent(password), "pass2" },
            { new StringContent(softId), "softid" },
            { new StringContent(imgId), "id" }
        };

        var response = await client.PostAsync("http://upload.chaojiying.net/Upload/ReportError.php", content);
        var responseString = await response.Content.ReadAsStringAsync();
        return JsonConvert.DeserializeObject<Dictionary<string, object>>(responseString);
    }
}

}
7. 初始化
首先,我们初始化一些变量和对象,如 WebDriver 和 Chaojiying 对象:

csharp

using OpenQA.Selenium;
using OpenQA.Selenium.Chrome;
using System;
using System.Drawing;
using System.IO;
using System.Threading.Tasks;

public class CrackTouClick
{
private static readonly string Email = "your_email@example.com";
private static readonly string Password = "your_password";
private static readonly string ChaojiyingUsername = "your_username";
private static readonly string ChaojiyingPassword = "your_password";
private static readonly string ChaojiyingSoftId = "your_soft_id";
private static readonly int ChaojiyingKind = 9102;

private IWebDriver driver;
private Chaojiying chaojiying;

public CrackTouClick()
{
    var options = new ChromeOptions();
    options.AddArgument("--headless");
    driver = new ChromeDriver(options);
    chaojiying = new Chaojiying(ChaojiyingUsername, ChaojiyingPassword, ChaojiyingSoftId);
}

public void Open()
{
    driver.Navigate().GoToUrl("http://admin.touclick.com/login.html");
    var emailField = driver.FindElement(By.Id("email"));
    var passwordField = driver.FindElement(By.Id("password"));
    emailField.SendKeys(Email);
    passwordField.SendKeys(Password);
}

public IWebElement GetTouClickButton()
{
    return driver.FindElement(By.ClassName("touclick-hod-wrap"));
}

public IWebElement GetTouClickElement()
{
    return driver.FindElement(By.ClassName("touclick-pub-content"));
}

public Rectangle GetPosition()
{
    var element = GetTouClickElement();
    var location = element.Location;
    var size = element.Size;
    return new Rectangle(location.X, location.Y, size.Width, size.Height);
}

public async Task<byte[]> GetScreenshot()
{
    var screenshot = ((ITakesScreenshot)driver).GetScreenshot();
    return screenshot.AsByteArray;
}

public async Task<Bitmap> GetTouClickImage()
{
    var screenshotBytes = await GetScreenshot();
    using (var ms = new MemoryStream(screenshotBytes))
    {
        var screenshot = new Bitmap(ms);
        var position = GetPosition();
        return screenshot.Clone(position, screenshot.PixelFormat);
    }
}

public async Task<Dictionary<string, object>> RecognizeCaptcha()
{
    var image = await GetTouClickImage();
    using (var ms = new MemoryStream())
    {
        image.Save(ms, System.Drawing.Imaging.ImageFormat.Png);
        return await chaojiying.PostPic(ms.ToArray(), ChaojiyingKind);
    }
}

}
8. 识别验证码
调用 Chaojiying 对象的 PostPic 方法提交图片进行识别,并获取识别结果。代码如下:

csharp

public async Task PerformTouClick()
{
Open();
GetTouClickButton().Click();
await Task.Delay(2000); // 等待验证码加载 更多内容联系1436423940

var result = await RecognizeCaptcha();
Console.WriteLine(result);

if (result.TryGetValue("pic_str", out var picStr) && picStr is string coordinates)
{
    var locations = GetPoints(coordinates);
    TouchClickWords(locations);
}

}

public List GetPoints(string coordinates)
{
var points = new List();
var groups = coordinates.Split('|');

foreach (var group in groups)
{
    var parts = group.Split(',');
    points.Add(new Point(int.Parse(parts[0]), int.Parse(parts[1])));
}

return points;

}

public void TouchClickWords(List locations)
{
var element = GetTouClickElement();
foreach (var location in locations)
{
new OpenQA.Selenium.Interactions.Actions(driver)
.MoveToElement(element, location.X, location.Y)
.Click()
.Perform();
Task.Delay(1000).Wait();
}
}

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