C#使用Playwright过京东滑块验证

滑块验证 - 亲测 (京东)    在日常的 Web,或者 App 登录,有各式各样的验证机制,其中滑块验证,是最常见之一。 滑块验证主要分为两类,非拼图式的滑块和拼图式(缺口拼接)滑块。 在拼图式滑块中,主要有两 阅读详情
Playwright是微软最新推出的一款Web自动化工具,个人感觉相比Selenium要更好用一些,不用去管chromedriver和浏览器版本对应的问题了,当然还有很多强大的地方可以去我之前写过的一篇文章简单进行了解。

在网上也看了很多过滑块验证的例子,一直没有找到C#版的Playwright过滑块的案例,其它语言的修改拿来用全都不行因此干脆自己写了一个。京东滑块验证亲测可过,理论这个逻辑所有类似滑块验证都可以过(自行测试),牵扯到滑动轨迹逻辑有时候可能要很多次才能过(只是简单的实现了随机滑动轨迹没有写的很复杂可自行修改完善)

1.实现思路
分别拿到大图和小图
两张图进行灰度处理降低颜色偏差,然后在大图中找小图的位置从而得到缺口的位置
模拟人工进行滑动滑块直到验证通过
2.代码实现
过滑块逻辑

    using var playwright = await Playwright.CreateAsync();

    await using var browser = await playwright.Chromium.LaunchAsync(new BrowserTypeLaunchOptions
    {
        Headless = false,
        Args = new[] { "--disable-blink-features=AutomationControlled" },
    });

    await using var context = await browser.NewContextAsync(new BrowserNewContextOptions()
    {
        //1920*1080窗口大小启动
        ViewportSize = new ViewportSize()
        {
            Height = 1080,
            Width = 1920
        }
    });

    var page = await context.NewPageAsync();
    //打开网页
    await page.GotoAsync("https://passport.jd.com/new/login.aspx");
    //切换到账户登录
    await page.ClickAsync("//*[contains(text(),'账户登录')]");
    //输入账号
    await page.FillAsync("//input[contains(@placeholder,'邮箱/账号名/登录手机')]", "username");
    //输入密码
    await page.FillAsync("//input[contains(@placeholder,'密码')]", "password");
    //点击登录
    await page.ClickAsync("//a[@id='loginsubmit']");
    //等待出滑块验证
    await page.WaitForSelectorAsync("//div[@class='JDJRV-bigimg']");
    //获取滑块按钮的尺寸
    var slidebtn = await page.Locator("//div[@class='JDJRV-slide-inner JDJRV-slide-btn']").BoundingBoxAsync();
    if (slidebtn == null)
        throw new Exception("没有找到滑块按钮!");
    int slidey = (int)(slidebtn.Y + slidebtn.Height / 2);
    //滑块验证没有通过一直重试
    while (await page.QuerySelectorAsync("//div[@class='JDJRV-slide-center']") != null)
    {
        //获取大图及尺寸
        var bigImgObj = page.Locator("//div[@class='JDJRV-bigimg']/img");
        var bigImgSize = await page.EvaluateAsync<dynamic>(@"()=>{
            var obj=$('div[class=JDJRV-bigimg]')
       return {width:$(obj).width(),height:$(obj).height()}
      }");
        var bigImgBase64 = bigImgObj.GetAttributeAsync("src").Result;
        var smallImgObj = page.Locator("//div[@class='JDJRV-smallimg']/img");

        //获取缺口应填充小图及尺寸
        var smallImgSize = await page.EvaluateAsync<dynamic>(@"()=>{
        var obj=$('div[class=JDJRV-smallimg]')
       return {width:$(obj).width(),height:$(obj).height()}
      }");
        var smallImgBase64 = smallImgObj.GetAttributeAsync("src").Result;
        if (string.IsNullOrWhiteSpace(bigImgBase64) || string.IsNullOrWhiteSpace(smallImgBase64))
        {
            throw new Exception("滑块图片未找到!");
        }
        //大小图分别转换为Bitmap
        var bigImg = Helper.Base64ToImage(bigImgBase64, new System.Drawing.Size((int)bigImgSize.width, (int)bigImgSize.height));
        var smallImg = Helper.Base64ToImage(smallImgBase64, new System.Drawing.Size((int)smallImgSize.width, (int)smallImgSize.height));

        //计算缺口的位置
        var point = Helper.FindSliderNotch(bigImg, smallImg);
        //移动到滑块按钮位置并按下
        await page.Mouse.MoveAsync(slidebtn.X + slidebtn.Width / 2, slidey);
        await page.Mouse.DownAsync();
        //模仿人工滑动
        Random random = new Random();
        //已滑动长度
        int offset = 0;
        const int minOffset = 10;
        const int maxOffset = 30;
        //当滑动的距离小于缺口的x坐标一直向前滑动
        while (point.X > offset)
        {
            //随机滑动长度
            offset += random.Next(minOffset, maxOffset);
            float moveX = slidebtn.X + offset;
            //滑动(因为我们一开始是从滑块中间按下拖动的 所以这里移动的时候x要加上滑块按钮长度的一半)
            await page.Mouse.MoveAsync(moveX + slidebtn.Width / 2, slidey, new MouseMoveOptions { Steps = 10 });
            //随机等待一段时间
            await page.WaitForTimeoutAsync(offset * minOffset);

        }
        //上面循环最终会滑动超过一点距离 这里精准往后退回来(模拟人工)
        await page.Mouse.MoveAsync(slidebtn.X + point.X + slidebtn.Width / 2, slidey, new MouseMoveOptions { Steps = 10 });
        //松开滑块按钮
        await page.Mouse.UpAsync();
    }
    Console.ReadKey();
    Console.WriteLine("执行完毕!");

辅助方法
查找缺口位置用到了OpenCvSharp 需要安装以下包


        /// <summary>
        /// 查找滑块缺口位置
        /// 实现原理:
        /// 两张图进行灰度处理降低颜色偏差,然后大图中找小图的位置
        /// </summary>
        /// <param name="big">背景图</param>
        /// <param name="small">缺口图</param>
        /// <returns></returns>
        public static OpenCvSharp.Point FindSliderNotch(Bitmap big, Bitmap small)
        {
            var bigImg = BitmapConverter.ToMat(big);//Cv2.ImRead(big);
            var smallImg = BitmapConverter.ToMat(small); //Cv2.ImRead(small);
            var big_edge = new Mat();
            Cv2.Canny(bigImg, big_edge, 50, 150);

            var small_edge = new Mat();
            Cv2.Canny(smallImg, small_edge, 50, 150);
            var bigPic = new Mat();
            Cv2.CvtColor(big_edge, bigPic, ColorConversionCodes.GRAY2BGR);
            var smallPic = new Mat();
            Cv2.CvtColor(small_edge, smallPic, ColorConversionCodes.GRAY2BGR);
            var res = new Mat();
            Cv2.MatchTemplate(bigPic, smallPic, res, TemplateMatchModes.CCoeffNormed);

            double minval, maxval;
            OpenCvSharp.Point minloc, maxloc;
            Cv2.MinMaxLoc(res, out minval, out maxval, out minloc, out maxloc);
            #region 绘制最佳匹配矩形并展示匹配效果
            //Rect r = new Rect(new OpenCvSharp.Point(maxloc.X, maxloc.Y), new OpenCvSharp.Size(smallImg.Width, smallImg.Height));
            //Console.WriteLine(maxloc.X);
            ////Draw a rectangle of the matching area
            //Cv2.Rectangle(bigImg, r, Scalar.LimeGreen, 2);

            ////Fill in the res Mat so you don't find the same area again in the MinMaxLoc
            //Rect outRect;
            //Cv2.FloodFill(res, maxloc, new Scalar(0), out outRect, new Scalar(0.1), new Scalar(1.0));
            //Cv2.ImShow("Matches", bigImg);
            //Cv2.WaitKey(); 
            #endregion
            return maxloc;

        }


        /// <summary>
        /// Base64转Bitmap
        /// </summary>
        /// <param name="dataURL"></param>
        /// <param name="size"></param>
        /// <returns></returns>
        public static Bitmap Base64ToImage(string dataURL, System.Drawing.Size size)
        {
            try
            {
                dataURL = dataURL.Replace("data:image/png;base64,", "").Replace("data:image/jgp;base64,", "").Replace("data:image/jpg;base64,", "").Replace("data:image/jpeg;base64,", "");//将base64头部信息替换
                byte[] bytes = Convert.FromBase64String(dataURL);
                MemoryStream memStream = new MemoryStream(bytes);
                Image mImage = Image.FromStream(memStream);
                Bitmap bp = new Bitmap(mImage, size);
                return bp;
            }
            catch (Exception)
            {
                throw;
            }
        }
3.运行测试

类似的blog:

https://pyqt5.blog.youkuaiyun.com/article/details/130161844

京东滑块登录 京东滑块分析 阅读详情

相关推荐

Playwright 解决京东滑块:自动化挑战大揭秘

如何处理JD的滑块登录?(若只想查看京东滑块,请直接滑到最下面)平时所使用的自动化登录工具:Selenium,虽然很好,但是在做京东滑块验证的时候,还是会出现被检测的情况,以至于无法通过校验。于是,我发现了另外一款自动化工具:playwright,也是非常的好用。接下来,就来见证它的强大吧!这就直接copy过来了:Playwright 是一个用于自动化浏览器操作的开源工具,由 Microsoft 开发和维护。

xiao_a_lian的博客 2833

c#中使用Playwright的方法

Playwright 是一个由 Microsoft 开发的 Node.js 库,它提供了一种快速、可靠、和简单的方法来自动化浏览器和测试 Web 应用程序。这个例子使用了 Playwright 的 Chromium 实现来打开一个页面,读取它的标题并打印到控制台上。方法来创建 Playwright 实例,然后使用它来创建 Chromium 浏览器实例并启动它。上面的代码创建了一个 Chromium 浏览器实例,之后可以执行自动化操作。在 PlaywrightSharp 中,可以使用浏览器实例来打开页面。

polsnet的专栏 4818

21爬虫实战:利用playwright操控已登录淘宝的浏览器自动采集Python商品数据

本文详细介绍了如何利用Playwright自动化工具,通过连接已手动登录淘宝的浏览器实例,绕过复杂的登录验证,实现Python商品数据的稳定采集。该方法利用真实浏览器环境与Cookie,有效规避反爬机制,并提供了从环境配置、脚本编写到实战技巧的完整指南,适合需要长期采集电商数据的开发者。

weixin_28834765的博客 447

京东h5滑块

京东滑块验证

qq_44657571的博客 3350

Selenium浏览器指纹伪装:绕过navigator.webdriver检测

浏览器指纹是现代反爬系统识别自动化行为的核心依据,其本质是通过JavaScript运行时环境特征(如navigator.webdriver、window.chrome、Canvas渲染差异等)构建唯一性标识。原理上,这些特征源于Chromium内核对WebDriver协议的原生暴露与渲染层行为偏差。技术价值在于将自动化脚本从‘显性机器人’转化为‘隐性真实用户’,显著提升请求通过率与会话稳定性。典型应用场景包括电商比价、舆情监控、自动化测试等需长期稳定访问目标网站的工程实践。本文聚焦Python之Seleni

weixin_31099291的博客 380

C#:用Playwright实现截长图

用Playwright实现截长图

我想我是海 冬天的大海 心情随风轻摆 2100

2022年最新京东滑块验证码破解思路(算法过验)

2022年最新京东滑块验证码破解思路(算法过验) 京东登陆滑块的代码已经很久没有修改了,滑动逻辑为jq代码,且未加密。综合难度不高。下面讲一下实现思路;实现语言主要是nodejs+python; nodejs的优势的直接运行从浏览器拷出来的代码,python也可以实现,不过要使用v8插件,python主要用opencv识别暗块的位置。登陆部分逻辑可以使用http,或者selenuim模拟登陆,我是使用selenuim,因为这样比较简单 post一下,很明显d 参数就是轨迹加密函数 代码定位 getCoo

qq_28060007的博客 1万+

京东滑块验证

某东滑块验证

qq_44657571的博客 4万+

最新出炉 -Web自动化测试之playwright:概述

目录目录Web自动化测试之playwright:概述playwright特性安装命令行工具脚本录制打开网页截图同步和异步API浏览器浏览器上下文多页面断言playwright Robot Framework库常见报错Node版本问题安装msedge报错playwright特性。

qq_48811377的博客 2万+

抛弃 Selenium!微软力推的 Playwright 才是未来:一行代码搞定滑块验证码(Python版)

版本地狱:Chrome 浏览器自动升级了,ChromeDriver 没更新,脚本直接报错。玄学报错,明明元素就在那,它非说不在。龟速运行:启动慢,执行慢,多开几个窗口内存爆炸。手动 Sleep:为了等页面加载,不得不写满屏的。大人,时代变了。微软开源的Playwright,不仅原生支持所有现代浏览器,而且速度比 Selenium 快 3-5 倍,自带“自动等待”机制,最重要的是——它不需要安装 Driver!Selenium 就像是诺基亚,它曾开创了时代,功不可没。

BUG猿的博客 125

Python如何解决“京东滑块验证码”(5)

这里需要注意的是,拿到滑块的缺口距离之后,代码中不要立刻去实现拖到滑块按钮,否则会触发平台检测封控。也就是说,先模拟鼠标左键的点击操作,然后按住滑块不要松开进行拖到,最后再将鼠标左键松开。需要注意的是,解决京东滑块验证的方法,笔者这里使用的是pyppeteer,如果你已安装该库,请忽略该步骤,没有安装的同学,使用如下方法安装即可,计算偏移值的具体方法这里就不详述了,方法和快手滑块的类似,在验证码系列的上一篇有单独介绍过。针对验证码的解决办法,笔者在本专栏之前有单独介绍过,感兴趣的同学可往前翻阅。

Python进阶专栏《爬虫实战进阶》,《Pyppeteer从入门到精通》原创作者 3593

网络爬虫-jd滑块验证码

网络爬虫-jd滑块验证码-附带轨迹算法

qq_39802740的博客 4063

京东滑块算法源码-易语言

京东滑块算法源码

京东滑块js逆向

通过接口获取两张验证码图片 ——> 在内存里面处理图片 ——> 通过opencv计算出缺口的距离 ——> 模拟封装滑块的轨迹参数 ——> 逆向加密轨迹的参数 ——> 加密并请求验证接口。注意:晃动的轨迹x是要从0开始的,可以通过扩大F2的大小,压缩页面的大小。关于滑块轨迹的模拟,这个网上的代码挺多的,我直接参考翻译了一个python的版本出来。通过接口返回值可以判断出第二个接口是获取图片的接口,第三个接口是验证滑块的接口。图片接口的bg是背景图,patch是滑块都是base64编码的。

qq_59970317的博客 5045

滑块验证通过selenium爬取京东代码

滑块验证,通过selenium,爬取京东代码

Vivado IP核与License许可全解析:从免费到收费,从评估到部署

本文全面解析Vivado IP核与License许可机制,从免费到收费IP核的选型指南到License的申请与部署策略。详细介绍了Xilinx官方IP核的优势与局限,第三方IP核的风险与应对,以及实战中的资源优化技巧和版本兼容性问题,帮助开发者高效利用Vivado工具链。

weixin_29169505的博客 366

京东最新滑块验证-selenium

滑动距离,一开始使用cv2搞了一整天一次也没通过,最后改用深度学习模型,自测通过率超过80%,废话不多说直接看成果。

Thing_big的博客 2617

电源管理芯片PMIC

(Power Management Integrated Circuits,简称:将电源电压转换为电子设备各部分所需的适当电压水平,包括升压(Boost)、降压(Buck)和升降压(Buck-Boost)转换。:控制和限制流向电子设备各部分的电流,以保护组件免受过电流损害。:管理多个电源轨,为不同的部分提供稳定的电能控制。电源轨指电路板上传输电力的线路。电源监控:提供过电压、欠电压、过电流、过热和短路保护,以防止电子设备损坏。:通过高效的电源转换技术,减少能量损耗,提高能源利用效率。

qq_42786033的博客 1万+

C#常用类库-详解Playwright

在C#自动化测试、网页数据爬取、前端UI自动化场景中,传统工具(如Selenium)存在稳定性差、配置繁琐、对现代前端框架支持不足等痛点。而Playwright作为微软推出的开源自动化工具,以“跨浏览器、无侵入、高稳定”为核心优势,完美适配Chrome、Firefox、Edge等主流浏览器,支持无头模式与可视化调试,既能高效完成UI自动化测试,也能优雅解决复杂网页爬取需求,成为C#开发者必备的自动化类库。

Amon的专栏 2316

数据字典实战:如何用Excel快速搭建你的第一个数据字典(附模板下载)

本文针对中小团队在软件开发中面临的术语不一致问题,提供了一套使用Excel快速搭建数据字典的实战指南。文章详细讲解了核心字段设计、填充示例、高阶技巧及团队协作维护流程,旨在通过这一轻量级工具统一团队共识、提升开发效率,并附有实用模板下载。

weixin_29303701的博客 380

基于STM32L4XX 、HAL库的TMP144YFFR数字温度传感器驱动应用C语言程序设计

define TMP144_ADDRESS 0x00 // 默认为全局地址,用于单器件或MDA命令。#define TMP144_CMD_READ_TEMP 0x00 // 读取温度寄存器命令。if (temp_raw & 0x800) { // 判断第11位(符号位)

PP_Cottage的博客 91

【Python爬虫】自动化实战—某东:滑块验证码(2024.8.7最新发布,包干货,包详细)

本文章主要针对于逆向实战—京东:滑块验证码(自动化登录),全自动化逻辑处理,更能符合用户的实际需求,方便用户采集特定商品数据时需要登录验证问题。

2201_75422674的博客 3620

8、鼠疫流行过程的计算机建模介绍

本博文介绍了一种基于概率细胞自动机和蒙特卡罗方法的计算机模型,用于模拟由大沙鼠传播的鼠疫流行过程。结合GIS和遥感技术,该模型能够分析鼠疫在不同聚居地类型和季节变化下的传播特征,揭示了群落密度、分布及流行接触率对鼠疫传播的影响。研究还验证了模型与自然流行过程的一致性,并探讨了鼠疫在宿主数量低谷时的持续机制。模型为鼠疫防控和流行病研究提供了定量分析工具。

x2y3z4a5b的博客 104
上一篇: MCP初入门
下一篇: 使用Cursor遇到的问题(一):cursor使用conda虚拟环境
令羽飞飞
博客等级 码龄14年 42粉丝 166原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值