基于win32实现TB登陆滑动验证

news2024/11/26 2:54:05

这里写目录标题

    • 滑动验证触发条件:
    • 失败条件:
    • 解决方法:
    • 清除cooKie
  • 滑动验证
    • 方式一:win32 api获取窗口句柄,选择固定位置 成功率高
    • 方式二: 原自动化滑动,成功率中
  • 案例

先谈理论,淘宝 taobao.com 的所有登陆系统,都是基于sso来实现的,基本大同小异

在这里插入图片描述

滑动验证触发条件:

  1. 此账户多次异常失败
  2. 该账户在多种ip环境下登陆
  3. 被系统检测到自动化

失败条件:

  1. 失败一次后,继续使用当前cookies
  2. 滑动速度太慢
  3. 网络太忙 ( 滑动成功,但是存在无效cookie)

解决方法:

每次登陆前,必须保证,当前异常cookie,每次登陆前清除一次即可

清除cooKie

由于playwright清理当前cookies不干净,所以采用浏览器强制清除cookies
在这里插入图片描述

def clear_cookie(handle: int, point, point2, point3, point4):
	
    win32gui.SetForegroundWindow(handle)
    win32gui.ShowWindow(handle, 3)  # 窗口最大化
    # left, top, right, bottom = win32gui.GetWindowRect(handle)
    # width = right - left
    # height = bottom - top
    # # # 计算指定检查点的坐标
    # x = left + int(point[0] * width)
    # y = top + int(point[1] * height)
    x = point[0]
    y = point[1]
    win32api.SetCursorPos(point)
    win32api.mouse_event(win32con.MOUSEEVENTF_LEFTDOWN, x, y, 0, 0)  # 鼠标左键按下
    win32api.mouse_event(win32con.MOUSEEVENTF_LEFTUP, x, y, 0, 0)  # 鼠标左键抬起
    x = point2[0]
    y = point2[1]
    win32api.SetCursorPos(point2)
    win32api.mouse_event(win32con.MOUSEEVENTF_LEFTDOWN, x, y, 0, 0)  # 鼠标左键按下
    win32api.mouse_event(win32con.MOUSEEVENTF_LEFTUP, x, y, 0, 0)  # 鼠标左键抬起
    x = point3[0]
    y = point3[1]
    win32api.SetCursorPos(point3)
    time.sleep(0.1)
    for i in range(15):
        win32api.mouse_event(win32con.MOUSEEVENTF_LEFTDOWN, x, y, 0, 0)  # 鼠标左键按下
        win32api.mouse_event(win32con.MOUSEEVENTF_LEFTUP, x, y, 0, 0)  # 鼠标左键抬起
    x = point4[0]
    y = point4[1]
    win32api.SetCursorPos(point4)
    win32api.mouse_event(win32con.MOUSEEVENTF_LEFTDOWN, x, y, 0, 0)  # 鼠标左键按下
    win32api.mouse_event(win32con.MOUSEEVENTF_LEFTUP, x, y, 0, 0)  # 鼠标左键抬起
    time.sleep(0.1)
    win32api.keybd_event(0x0D, 0, 0, 0)
    win32api.keybd_event(0x0D, 0, win32con.KEYEVENTF_KEYUP, 0)

def findTitle(window_title):
    '''
    查找指定标题窗口句柄
    @param window_title: 标题名
    @return: 窗口句柄
    '''
    hWndList = []
    # 函数功能:该函数枚举所有屏幕上的顶层窗口,办法是先将句柄传给每一个窗口,然后再传送给应用程序定义的回调函数。
    win32gui.EnumWindows(lambda hWnd, param: param.append(hWnd), hWndList)
    for hwnd in hWndList:
        # 函数功能:该函数获得指定窗口所属的类的类名。
        # clsname = win32gui.GetClassName(hwnd)
        # 函数功能:该函数将指定窗口的标题条文本(如果存在)拷贝到一个缓存区内
        title = win32gui.GetWindowText(hwnd)
        if (window_title in title):
            return title, hwnd
    return ()



def del_cookies(self, window_title):
      logger.info("清空cookies中")
      try:
          self.context.clear_cookies()
          hwnd = findTitle(window_title)
          if global_config.active == "prod":
              clear_cookie(hwnd[1], (144, 53), (192, 173), (624, 558), (900, 549))  # 生产
          else:
              clear_cookie(hwnd[1], (3032, 51), (3128, 174), (3736, 548), (4006, 554))
      except Exception as e:
          logger.error(f"清除cookie异常, {str(e)}")

滑动验证

方式一:win32 api获取窗口句柄,选择固定位置 成功率高

需要提前录制当前桌面的鼠标轨迹

def move(handle: int, point: tuple[int], move_point: tuple[int]):
    """
        后台移动鼠标
    """
    try:
        # 激活窗口刀前台
        win32gui.SetForegroundWindow(handle)
        win32gui.ShowWindow(handle, 3)  # 窗口最大化
        left, top, right, bottom = win32gui.GetWindowRect(handle)
        width = right - left
        height = bottom - top
        # # 计算指定检查点的坐标
        x = left + int(point[0] * width)
        y = top + int(point[1] * height)

        x1 = left + int(point[0] * width) + random.randint(1, 20)
        y1 = top + int(point[1] * height)
        # x = point[0]
        # y = point[1]
        # 移动鼠标指针
        win32api.SetCursorPos(point)
        win32api.mouse_event(win32con.MOUSEEVENTF_LEFTDOWN, x, y, 0, 0)  # 鼠标左键按下
        # time.sleep(0.5)
        # win32api.SetCursorPos(move_point)
        for i in range(x, x1):
            win32api.mouse_event(win32con.MOUSE_MOVED, i, y1, 0, 0)  # 鼠标左键按下
        win32api.mouse_event(win32con.MOUSEEVENTF_LEFTUP, x1, y1, 0, 0)  # 鼠标左键抬起
    except Exception as e:
        pass

方式二: 原自动化滑动,成功率中

def un_login_lock(self, distance: int, locator: Locator) -> None:
    locator.blur()
    box = locator.bounding_box()
    tracks = get_track(distance)
    x = int(box["x"] + box["width"] / 2)
    y = int(box["y"] + box["height"] / 2)
    locator.hover()
    self.page.mouse.down()
    self.page.mouse.move(x, y + random.randint(10, 20), steps=12)
    for track in tracks:
        self.page.mouse.move(track + x, y + random.randint(10, 20), steps=9)
        x = x + track
    self.page.mouse.up()
    self.page.wait_for_timeout(random.randint(2200, 3200))
附录:绕过Webdriver检测可增加浏览器反识别概率,可选不加
def webdriver(self):
    # 绕过Webdriver检测
    js = """Object.defineProperties(navigator, {webdriver:{get:()=>undefined}});"""
    self.page.add_init_script(js)

案例

if locator := self.is_lock(punish[0]):
    logger.info(f"正在进行滑动验证,{locator.bounding_box()}")
    hwnd = findTitle(window_title)
    conf = {
        "start":[[4077, 583],[4079, 582],[4078,595]], # 鼠标开始的轨迹数组
        "end":[[4823, 623],[4923, 699],[4518,578]] # 鼠标结束的轨迹数组
       }
    points = eval(conf.get("config_value"))
    starts = points.get("start")
    ends = points.get("end")
    # 随机选择一个
    move(hwnd[1], starts[random.randint(0, len(starts) - 1)], ends[random.randint(0, len(ends) - 1)])
    # self.un_login_lock(500, locator)

虽然小概率出现异常,加入重试机制后,基本没出现过问题

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1029317.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

A Span-based Multi-Modal Attention Network for joint entity-relationextraction

原文链接: https://www.sciencedirect.com/science/article/pii/S0950705122013247?via%3Dihub Knowledge-Based Systems 2023 介绍 作者认为当前基于span的关系提取方法都太关注于span内部的语义,忽略了span与span之间以及span与其他模态之间&#xff…

腾讯云服务器16核 32G 28M带宽租用价格、性能测评及配置大全

腾讯云轻量应用服务器16核32G28M配置优惠价3468元15个月(支持免费续3个月/送同配置3个月),轻量应用服务器具有100%CPU性能,系统盘为380GB SSD盘,28M带宽下载速度3584KB/秒,月流量6000GB,折合每天…

C语言入门Day_23 指针的使用

目录 前言: 1.指针运算符 2.指针的运算和使用 3.易错点 4.思维导图 前言: 上一篇博客中我们了解到指针的两个运算符号": 一个是星号*,一个是&,他们的名字分别是指针运算符和取地址运算符。 1.指针运算…

【JAVA】关于抽象类的概念

个人主页:【😊个人主页】 系列专栏:【❤️初识JAVA】 前言 在Java中,抽象类是一种特殊的类,它无法被实例化。它只能被用作其他类的基类,以便子类可以继承它的属性和方法。今天我们就来谈谈JAVA中的抽象类。…

爬虫 — App 爬虫(一)

目录 一、介绍二、APP 爬虫常见反爬三、APP 抓包常用工具四、模拟器五、安装 APP1、下载 APP2、安装 APP 六、fiddler1、工作原理2、安装3、基本介绍 七、环境配置1、fiddler 的配置2、夜神模拟器的配置 八、案例 一、介绍 爬虫分类——数据来源 1、PC 端爬虫(网页…

IP风险查询:抵御DDoS攻击和CC攻击的关键一步

随着互联网的普及,网络攻击变得越来越普遍和复杂,对企业和个人的网络安全构成了重大威胁。其中,DDoS(分布式拒绝服务)攻击和CC(网络连接)攻击是两种常见且具有破坏性的攻击类型,它们…

十、阶段实践练习

阶段实践练习 1.阶段实践练习1.1.练习1~~~~象棋口诀1.2.练习2~~~~输出汇款单1.3.练习3~~~~输出个人信息1.4.练习4~~~~计算月收入1.5.练习5~~~~计算商和余数1.6.练习6~~~~判断成绩能否及格1.7.练习7~~~~话费充值1.8.练习8~~~~货车装西瓜 ———————————————————…

一百八十一、Hive——海豚调度HiveSQL任务时当Hive的计算引擎是mr或spark时脚本的区别(踩坑,附截图)

一、目的 当Hive的计算引擎是spark或mr时,发现海豚调度HQL任务的脚本并不同,mr更简洁 二、Hive的计算引擎是Spark时 (一)海豚调度脚本 #! /bin/bash source /etc/profile nowdatedate --date0 days ago "%Y%m%d" y…

[Git入门]---gitee注册及代码提交

文章目录 1.Gitee是什么2.gitee注册3.git工具及图形化界面工具安装4.gitee仓库创建5.进行本地仓库与远端gitee仓库的链接6.git三板斧addcommitpush 7.gitee提交代码常见问题 1.Gitee是什么 gitee是基于git代码托管和研发协作的国内平台,在上面可以托管个人或公司代…

XSS-labs1-20关通过手册

目录 XSSlabs1-20关通关手册第一关level-1(无任何过滤)第二关level-2(闭合标签)第三关level-3(单引号闭合js事件函数绕过)第四关level-4(双引号闭合js事件函数绕过)第五关level-5&am…

Excel 拆分单元格数据(公式拆分、智能填充、分列)

将姓名工号拆分成 姓名 和 工号 方法1 在 B2 单元格输入 LEFT($A2, FIND(":", $A2) - 1)在 C2 单元格输入 RIGHT($A2, LEN($A2) - FIND(":", $A2))然后 ctrl d 向下填充即可 方法2 在 B2 单元格输入 李金秀,然后选中 B3 单元格&#xff0c…

LeetCode 753. 破解保险箱【欧拉回路,DFS】困难

本文属于「征服LeetCode」系列文章之一,这一系列正式开始于2021/08/12。由于LeetCode上部分题目有锁,本系列将至少持续到刷完所有无锁题之日为止;由于LeetCode还在不断地创建新题,本系列的终止日期可能是永远。在这一系列刷题文章…

实现AIGC更好的数据存力,这家科技巨头为我们指明了方向

存力即数据存储能力 蕴藏着巨大的发展机会 【全球存储观察 | 热点关注】 2023年,全球被ChatGPT的热潮席卷,拥抱AIGC的创新赛道成为众多企业的新选择。 全球存储观察分析指出,影响AIGC发展的三大因素也日益凸显,即算…

ROS之创建第一个程序

打开终端 创建工作空间 mkdir ros_ws进入工作空间 cd ros_ws创建src文件夹(放源程序) mkdir src编译工作空间 catkin_make打开vscode(从终端打开此工程) code .进入src文件夹 cd src创建功能包demo1,并加载依赖…

[Linux入门]---Linux编译器gcc/g++使用

文章目录 1.背景知识2.gcc如何完成编译运行工作预处理(进行宏替换)编译(生成汇编)汇编(生成机器可识别代码)链接(生成可执行文件) 3.函数库动态库静态库动静态库的区别 4.gcc选项 1.…

一键自助建站系统源码带安装教程 傻瓜式部署搭建,让您的建站更高效

在这个数字时代,网站已成为企业或个人展示形象、推广业务的重要工具。为了满足这一需求,许多自助建站系统应运而生,大大降低了用户建站的门槛。给大家分享一款傻瓜式部署搭建的一键自助建站系统源码,让您轻松拥有高效建站能力。 …

虹科教您 | 可实现带宽计量和延迟计算的时间敏感网络测试工具RELY-TSN-LAB操作指南与基本功能测试

1. RELY-TSN-LAB产品概述 时间敏感网络(TSN)能够合并OT和IT世界,这将是真正确保互操作性和标准化的创新性技术。这项技术的有效开发将显著降低设备成本、维护、先进分析服务的无缝集成以及减少对单个供应商的依赖。为了在这些网络中实现确定性,需要控制…

[LLM+AIGC] 01.应用篇之中文ChatGPT初探及利用ChatGPT润色论文对比浅析(文心一言 | 讯飞星火)

近年来,人工智能技术火热发展,尤其是OpenAI在2022年11月30日发布ChatGPT聊天机器人程序,其使用了Transformer神经网络架构(GPT-3.5),能够基于在预训练阶段所见的模式、统计规律和知识来生成回答&#xff0c…

【Linux操作系统实战】Linux基础命令面试必备(二)

😄作者简介: 小曾同学.com,一个致力于测试开发的博主⛽️,主要职责:测试开发、CI/CD 如果文章知识点有错误的地方,还请大家指正,让我们一起学习,一起进步。😊 座右铭:不想…

【rabbitMQ】-延迟队列-模拟控制智能家居的操作指令

这个需求为控制智能家居工作,把控制智能家居的操作指令发到队列中,比如:扫地机、洗衣机到指定时间工作 一.什么是延迟队列? 延迟队列存储的对象是对应的延迟消息,所谓“延迟消息” 是指当消息被发送以后,并…