【pynput】鼠标行为追踪并模拟

文章目录

  • 前言
  • 基本思路
  • 安装依赖包
  • 实时鼠标捕获
    • 捕获鼠标位置
    • 捕获鼠标事件
    • 记录点击内容
    • 效果图
  • 实时按键捕获
    • 控制按键操作
    • 捕获按键事件
    • 组合键记录区间设置
  • 用户操作记录与回溯
    • 基本思路
    • 完整代码
    • 效果图

利用本文内容从事的任何犯法行为和开发与本人无关,请理性利用技术服务大家,创建美好和谐的社会,让人们生活从繁琐中变得更加具有创造性!

前言

这前面文章中,提到了【实时屏幕捕获】的内容,这篇文章则是为大家介绍在现代计算机环境中,鼠标行为追踪的有效的方法,并通过记录和分析用户的鼠标操作,可以减少重复性工作,提高工作效率。尤其是在一些固定且重复的任务中,如接口测试、参数测试等,鼠标行为追踪为自动化提供了可能。

类似于手机上面的语言助手,不是有一个特定语言执行特定动作的功能吗,这个就类似于它,目前之所以做鼠标行为追踪并模拟是为了后面开展更加高级的功能。

基本思路

  1. 利用按键或时间限制捕获时间段
  2. 利用 OpenCV 实现鼠标位置点的追踪
  3. 记录每次操作位置点并回溯

安装依赖包

首先,我们需要安装所需的库。在终端或命令提示符中执行以下命令:

pip install opencv-python pyautogui numpy pynput

opencv-python:用于提供了丰富的图像处理和计算机视觉算法

pyautogui:用于捕获屏幕画面

numpy:用于处理大型多维数组和矩阵,以及执行与数据结构相关的数学运算

pynput:用于捕获以及控制鼠标和键盘

实时鼠标捕获

捕获鼠标位置

通过 position 属性来获取鼠标的位置,可以清晰地判断用户操作的区域:

from pynput import mouse as mos# 鼠标控制器
mouse = mos.Controller()
# 获取当前鼠标位置
mouse.position

在这里插入图片描述

捕获鼠标事件

鼠标事件有三种分为:鼠标移动、点击以及滚轮滚动:

# 移动监听
def on_move(x, y):print(f'鼠标移动到了:{(x, y)}')# 点击监听
def on_click(x, y, button, pressed):print(f'鼠标按键:{button},在位置处 {(x, y)}, {"按下了" if pressed else "释放了"} ')if not pressed:# 停止监听return False# 滚动监听
def on_scroll(x, y, dx, dy):print(f'滚动中... {"向下:" if dy < 0 else "向上:"}{(x, y)}')# 构造监听器对象
listener = mos.Listener(on_move=on_move,on_click=on_click,on_scroll=on_scroll)# 监听启动 
listener.start()

在这里插入图片描述

记录点击内容

根据鼠标点击来记录用户点击内容,可以有效地分析用户的行为和爱好,更好地像学徒一样去理解用户的行为,从而达到掌握其技巧:

import pyautogui
import numpy as np
import cv2user_click_pos = {'event': None, 'position': None}# 获取屏幕画面并保存
def save_screen():# 获取屏幕截图screenshot = pyautogui.screenshot()# 将截图转换为 OpenCV 格式screen_img = cv2.cvtColor(np.array(screenshot), cv2.COLOR_RGB2BGR)# 保存截图cv2.imwrite("screen_img.png", screen_img)# 点击监听并记录用户点击事件
def on_click(x, y, button, pressed):save_screen()user_click_pos['event'] = buttonuser_click_pos['position'] = (x, y)if not pressed:# 停止监听return False# 构造监听器对象
listener = mos.Listener(on_click=on_click)# 监听启动
listener.start()

在这里插入图片描述

效果图

在这里插入图片描述

实时按键捕获

控制按键操作

通过控制按键的按下 press 和释放 release 来打开资源管理器:

from pynput import keyboard as kbd# 键盘控制器
keyboard = kbd.Controller()# 按下 Win + E 打开资源管理器
keyboard.press(kbd.Key.cmd)
keyboard.press('e')
keyboard.release(kbd.Key.cmd)
keyboard.release('e')

捕获按键事件

按键分为三种,一种是特殊键,另一种是字母键,还有一种是组合键,事件分为两种:按下以及释放:

# 键盘按下
def on_press(key):try:print(f'字母键: {key.char} 被按下')except AttributeError:print(f'特殊键: {key} 被按下')# 按键释放
def on_release(key):print('{} 释放了'.format(key))if key == kbd.Key.esc:# 释放了 esc 键,停止监听return False# 构造监听器对象
with kbd.Listener(on_press=on_press,on_release=on_release) as listener:# 监听启动listener.join()

在这里插入图片描述

组合键记录区间设置

根据不同的按键效果来指定不同的指令,例如利用 ctr + s 开始记录鼠标操作,Esc 则退出记录过程:

_KEY_Press = {'ctrl+s': False,
}# 键盘按下
def on_press(key):try:print(key)if key.char == "\x13":_KEY_Press["ctrl+s"] = Falseprint(f'按下组合键 ctrl + s')except AttributeError as e:if key == kbd.Key.esc:_KEY_Press["ctrl+s"] = Falsereturn False# 按键释放
def on_release(key):try:if key.char == "\x13":_KEY_Press["ctrl+s"] = Trueprint(f'释放组合键 ctrl + s')except AttributeError:if key == kbd.Key.esc:_KEY_Press["ctrl+s"] = Falsereturn False# 构造监听器对象
with kbd.Listener(on_press=on_press,on_release=on_release) as listener:# 监听启动listener.join()

在这里插入图片描述

用户操作记录与回溯

当熟练了解以后,就可以愉快地使用这些零零散散的知识并加以应用从而达到预想的效果。

基本思路

以微信给别人发短信为例:

  1. 记录鼠标点击位置
  2. 记录按键输入内容
  3. 回溯上面记录操作

完整代码

import time
from datetime import datetime
from pynput import keyboard as kbd
from pynput import mouse as mos_KEY_Press = {# 开始记录操作'ctrl+s': False,# 开始回溯操作'ctrl+r': False,# 结束捕获'esc': False
}# 用户行为操作记录:{type: mouse key, position: (), event: '', char: '', time: 0, }
User_Active_List = []# 开始记录时间
start_time = None
# 开始回溯时间
run_time = None
# 鼠标控制器
mouse = mos.Controller()
# 键盘控制器
keyboard = kbd.Controller()# 操作回溯
def run_active(list):pre_time = 0for item in list:time.sleep(item['time'] - pre_time)if item['type'] == 'mouse':mouse.position = item['position']mouse.click(item['event'], 1)if item['type'] == 'key':keyboard.press(item['char'])keyboard.release(item['char'])print(item)pre_time = item['time']print("回溯完成!")# 按键按下
def on_press(key):global User_Active_Listtry:if key.char == "\x13":_KEY_Press["ctrl+r"] = False_KEY_Press["ctrl+s"] = FalseUser_Active_List = []elif key.char == "\x12":_KEY_Press["ctrl+s"] = False_KEY_Press["ctrl+r"] = Falseelif _KEY_Press["ctrl+s"]:# 记录按键User_Active_List.append({'type': 'key','char': key,'time': (datetime.now() - start_time).total_seconds(),})except AttributeError:if key == kbd.Key.esc:print(f'按键捕获退出!')_KEY_Press["ctrl+s"] = False_KEY_Press["ctrl+r"] = False_KEY_Press["esc"] = Truereturn Falseelif _KEY_Press["ctrl+s"]:# 记录按键User_Active_List.append({'type': 'key','char': key,'time': (datetime.now() - start_time).total_seconds(),})# 按键释放
def on_release(key):global start_time, run_timetry:if key.char == "\x13":_KEY_Press["ctrl+s"] = Truestart_time = datetime.now()print(f'开始记录操作...')if key.char == "\x12":_KEY_Press["ctrl+r"] = Truerun_time = datetime.now()print(f'开始回溯操作...')run_active(User_Active_List)except AttributeError:if key == kbd.Key.esc:print(f'按键捕获退出!')_KEY_Press["ctrl+s"] = False_KEY_Press["ctrl+r"] = False_KEY_Press["esc"] = Truereturn False# 构造按键监听对象
key_listener = kbd.Listener(on_press=on_press,on_release=on_release)# 监听启动
key_listener.start()# 记录用户点击事件
def on_click(x, y, button, pressed):global User_Active_Listif _KEY_Press["esc"]:print(f'鼠标捕获退出!')return Falseelif _KEY_Press["ctrl+s"] and pressed:User_Active_List.append({'type': 'mouse','position': (x, y),'event': button,'time': (datetime.now() - start_time).total_seconds(),})# 构造监听器对象
mos_listener = mos.Listener(on_click=on_click)# 监听启动
mos_listener.start()

在这里插入图片描述

效果图

鼠标按键行为回溯

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【强化学习】基于蒙特卡洛MC与时序差分TD的简易21点游戏应用

1. 本文将强化学习方法&#xff08;MC、Sarsa、Q learning&#xff09;应用于“S21点的简单纸牌游戏”。 类似于Sutton和Barto的21点游戏示例&#xff0c;但请注意&#xff0c;纸牌游戏的规则是不同且非标准的。 2. 为方便描述&#xff0c;过程使用代码截图&#xff0c;文末附链…

【Spark精讲】一文讲透Spark RDD

MapReduce的缺陷 MR虽然在编程接口的种类和丰富程度上已经比较完善了&#xff0c;但这些系统普遍都缺乏操作分布式内存的接口抽象&#xff0c;导致很多应用在性能上非常低效 。 这些应用的共同特点是需要在多个并行操 作之间重用工作数据集 &#xff0c;典型的场景就是机器学习…

Vue(一):Vue 入门与 Vue 指令

Vue 01. Vue 快速上手 1.1 Vue 的基本概念 用于 构建用户界面 的 渐进性 框架 构建用户界面&#xff1a;基于数据去渲染用户看到的界面渐进式&#xff1a;不需要学习全部的语法就能完成一些功能&#xff0c;学习是循序渐进的框架&#xff1a;一套完整的项目解决方案&#x…

Django Cookie和Session使用(十一)

一、Cookie Cookie具体指一小段信息&#xff0c;它是服务器发送出来存储在浏览器上的一组键值对&#xff0c;下次访问服务器时浏览器会自动携带这些键值对&#xff0c;以便服务器提取有用信息。 Cookie的特性 1、服务器让浏览器进行设置的 2、保存在浏览器本地&#xff0c;…

linux 网络工具(二)

linux 网络工具 1. ip命令簇4.1 address4.2 link4.3 route4.4 rule 2. 其他常用命令2.1 ifup/ifdown2.2 配置主机名2.3 设置DNS服务器指向2.4 配置域名解析2.5 ss2.6 路由相关配置文件2.7 查看机器可用端口2.8 traceroute2.9 dhclient 1. ip命令簇 Linux的ip命令和ifconfig类似…

微信小程序picker组件扩展选择时间到秒插件

创建插件seldatetime // 插件JS部分 Component({// 一些选项options: {// 样式隔离&#xff1a;apply-shared 父影响子&#xff0c;shared父子相互影响&#xff0c; isolated相互隔离styleIsolation:"isolated",// 允许多个插槽multipleSlots: true},// 组件的对外属…

机器学习三要素与拟合问题

1.如何构建机器学习模型&#xff1f; 机器学习工作流程总结 1.获取数据 2.数据基本处理 3.特征工程 4.机器学习(模型训练) 5.模型评估 结果达到要求&#xff0c;上线服务&#xff0c;没有达到要求&#xff0c;重新上面步骤 我们使用机器学习监督学习分类预测模型的工作流…

SLF4J: Class path contains multiple SLF4J bindings.解决

背景 项目正常运行几年&#xff0c;近期优化调整修复漏洞&#xff0c;依赖升级后cleaninstall 重启发现项目启动失败&#xff0c;访问所有接口都报错404 错误信息 output输出异常信息截图 tomcat 打印异常信息截图 output打印异常信息详情 D:\javaRuanJian\Tomcat\apach…

人工智能的新篇章:深入了解大型语言模型(LLM)的应用与前景

LLM&#xff08;Large Language Model&#xff09;技术是一种基于深度学习的自然语言处理技术&#xff0c;旨在训练能够处理和生成自然语言文本的大型模型。 LLM 技术的核心思想是使用深度神经网络&#xff0c;通过大规模的文本数据预训练模型&#xff0c;并利用这些预训练模型…

linux 防火墙查看放行端口,追加放行端口命令

linux 查看防火墙已经放行端口列表 firewall-cmd --list-ports 运行结果如下&#xff1a; linux 追加防火墙经放行端口&#xff08;如追加443&#xff09; firewall-cmd --zonepublic --add-port443/tcp --permanent 亲测有效&#xff01;

【WPF.NET开发】路由事件

本文内容 先决条件什么是路由事件&#xff1f;路由策略为什么使用路由事件&#xff1f;附加并实现路由事件处理程序类处理程序WPF 中的附加事件XAML 中的限定事件名称WPF 输入事件EventSetter 和 EventTrigger Windows Presentation Foundation (WPF) 应用程序开发人员和组件…

FileZilla的使用主动模式与被动模式

&#x1f3ac; 艳艳耶✌️&#xff1a;个人主页 &#x1f525; 个人专栏 &#xff1a;《产品经理如何画泳道图&流程图》 ⛺️ 越努力 &#xff0c;越幸运 目录 一、FileZilla简介 1、FileZilla是什么&#xff1f; 2、FileZilla的应用场景 二、FileZilla的安装 1、下…

【直播预告】刘军博士:科学研究中的AI计算:何助力团队协作创新

【直播预告】随着数据、算法、算力的融合发展&#xff0c;AI已经成为科学和工程研究的不可或缺的力量&#xff0c;涉足药物设计、天气预测、新材料研发等领域。在AI领域&#xff0c;协作是关键。欢迎大家关注12月28日20:00九章云极资深数据科学家刘军博士的直播&#xff01;刘军…

HLS 2017.4 导出 RTL 报错:ERROR: [IMPL 213-28] Failed to generate IP.

软件版本&#xff1a;HLS 2017.4 在使用 HLS 导出 RTL 的过程中产生如下错误&#xff1a; 参考 Xilinx 解决方案&#xff1a;https://support.xilinx.com/s/article/76960?languageen_US 问题描述 DESCRIPTION As of January 1st 2022, the export_ip command used by Vivad…

【计算机视觉】角点检测(Harris、SIFT)

Harris 角点指的是窗口延任意方向移动&#xff0c;都有很大变化量的点。 用数学公式表示为&#xff1a; E(u,v)反映的移动后窗口的差异&#xff0c;w(x,y)为每个像素的点权值&#xff0c;I(xu,yv)是移动的像素值&#xff0c;I(x,y)是移动前的像素值。 将E(u,v)进行泰勒展开&am…

MySQL进阶之(一)逻辑架构

一、逻辑架构 1.1 逻辑架构剖析1.1.1 连接层1.1.2 服务层01、基础服务组件02、SQL Interface&#xff1a;SQL 接口03、Parser&#xff1a;解析器04、Optimizer&#xff1a;查询优化器05、Caches & Buffers&#xff1a; 查询缓存组件 1.1.3 引擎层1.1.4 存储层1.1.5 总结 1.…

elasticsearch系列九:异地容灾-CCR跨集群复制

概述 起初只在部分业务中采用es存储数据&#xff0c;在主中心搭建了个集群&#xff0c;随着es在我们系统中的地位越来越重要&#xff0c;数据也越来越多&#xff0c;针对它的安全性问题也越发重要&#xff0c;那如何对es做异地容灾呢&#xff1f; 今天咱们就一起看下官方提供的…

25、商城系统(七):商城项目基础功能pom.xml(重要),mybatis分页插件

截止这一章,我们就不把重心放在前端,后台的基础代码,因为后面都是业务层面的crud。 前端直接替换这两个文件夹即可,后台代码也直接复制: 一、重新更新一下所有的pom.xml 这个地方我踩了好多坑,最后得到一个完整的pom.xml,建议大家直接用我的pom.xml替换即可。 1.comm…

大数据与人工智能|万物皆算法(第三节)

要点一&#xff1a;数据与智能的关系 1. 一切的核心都是数据&#xff0c;数据和智能之间是密切相关的。 数据是对客观现实的描述&#xff0c;而信息是数据转化而来的。 例如&#xff0c;24是数据&#xff0c;但说“今天的气温是24摄氏度”是信息&#xff0c;而说“班可以分成24…

How to Develop Word Embeddings in Python with Gensim

https://machinelearningmastery.com/develop-word-embeddings-python-gensim/ 本教程分为 6 个部分;他们是&#xff1a; 词嵌入 Gensim 库 开发 Word2Vec 嵌入 可视化单词嵌入 加载 Google 的 Word2Vec 嵌入 加载斯坦福大学的 GloVe 嵌入 词嵌入 单词嵌入是一种提供单词的…