c#使用selenium过滑动验证码

本文介绍了如何在C#中利用Selenium处理.NET Core 3.1项目的滑动验证码问题,通过引入相关包并进行代码引用,结合反爬策略,实现验证码的自动化滑动验证。

滑动验证码如下:

 

1、vs引入以下三个包(.net core 3.1):

2、c#引用:

private void SeleniumVertifyCode(Uri uri)
        {
var options = new OpenQA.Selenium.Chrome.ChromeOptions();
            //不显示浏览器UI窗口
            options.AddArgument("-headless");
            //设置浏览器大小避免无头模式下元素越界异常
            options.AddArgument("--window-size=1920,1050");
            //减少headless模式下日志
            options.AddArgument("log-level=3");
            using IWebDriver driver = new OpenQA.Selenium.Chrome.ChromeDriver(options);
            //先设置uri
            driver.Navigate().GoToUrl(uri);
            var cookie = driver.Manage().Cookies;
            //再添加cookie
            cookie.AddCookie(new Cookie("name", "value", ".com", "/", null));
            //再次访问验证码uri
            driver.Navigate().GoToUrl(uri);
            //反爬:设置windows.navigate.webdrive的值为undefine
            driver.ExecuteJavaScript("Object.defineProperty(navigator, 'webdriver', {get: () => undefined})");
//查看网页源码
//var source = driver.PageSource;
            //找到滑块元素
            var slide = driver.FindElement(By.CssSelector("#nc_1_n1z"));
            var verifyContainer = driver.FindElement(By.CssSelector(".nc-lang-cnt"));
            var width = verifyContainer.Size.Width;
            var action = new Actions(driver);
            //点击并按住滑块元素
            action.ClickAndHold(slide).Perform();
            Random random = new Random();
            int offset = 0;
            //模仿人工滑动
            const int minOffset = 10;
            const int maxOffset = 30;
            while (width > offset)
            {
                offset += random.Next(minOffset, maxOffset);
                action.MoveByOffset(offset, 0).Perform();
                var code = driver.FindElement(By.CssSelector(".nc-lang-cnt")).Text;
                if (code.Contains("验证通过"))
                {
                    break;
                }
                System.Threading.Thread.Sleep(offset * minOffset);
            }
            //点击验证按钮
            action.Click(driver.FindElement(By.CssSelector("#verify"))).Perform();
            //退出webdriver
            driver.Quit();
        }

 

反爬参考:https://blog.youkuaiyun.com/weixin_44500833/article/details/105263822

### C#实现滑动验证码解决方案 在C#环境中处理滑动验证码主要依赖于自动化测试工具如Selenium以及机器学习模型来识别并模拟人类行为完成验证过程。对于基于浏览器操作的任务,Selenium是一个强大的库,它允许编写脚本来控制Web浏览器执行一系列动作。 为了应对滑动验证码挑战,在C#中通常会结合图像处理技术和深度学习算法来进行破解尝试。具体来说: - 使用`OpenCV`或其他图像处理技术定位页面上的滑块位置和目标图案。 - 利用预训练好的卷积神经网络(CNN),比如YOLOv5,对截屏后的图片进行分析,提取出背景图与缺口的位置信息[^4]。 - 计算两者之间的距离差值作为移动轨迹参数传递给Selenium WebDriver实例去驱动鼠标拖拽动作。 下面给出一段简化版的概念证明代码片段展示如何利用这些组件构建一个基本框架: ```csharp using OpenQA.Selenium; using OpenQA.Selenium.Chrome; using System.Drawing; // 初始化ChromeDriver var options = new ChromeOptions(); options.AddArgument("--headless"); // 无头模式运行 IWebDriver driver = new ChromeDriver(options); try { string url = "http://example.com/login"; // 替换成实际含有滑动验证码的网页链接 driver.Navigate().GoToUrl(url); // 定位到滑块元素 IWebElement sliderElement = driver.FindElement(By.ClassName("geetest_slider_button")); Point startPoint = sliderElement.Location; Bitmap screenshot = ((ITakesScreenshot)driver).GetScreenshot().AsBitmap(); // 假设这里已经有了获取偏移量offsetX的方法 int offsetX = CalculateOffset(screenshot); Actions action = new Actions(driver); action.MoveToElement(sliderElement, startX: startPoint.X, startY: startPoint.Y) .ClickAndHold() .MoveByOffset(offsetX, 0) .Release() .Build() .Perform(); } finally{ driver.Quit(); } /// <summary> /// 这里应该放置具体的计算逻辑,返回相对于起点横向需要平移多少像素才能使滑块到达正确终点 /// </summary> private static int CalculateOffset(Bitmap image){ throw new NotImplementedException("此函数应由开发者自行实现"); } ``` 这段代码展示了怎样启动一个无界面版本的Google Chrome浏览器加载指定URL地址,并找到页面内的滑块控件准备实施后续交互操作。注意这里的`CalculateOffset()`方法只是一个占位符,实际应用时应当替换为能够准确测量两幅图形间差异的具体实现方式。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值