利用本文内容从事的任何犯法行为和开发与本人无关,请理性利用技术服务大家,创建美好和谐的社会,让人们生活从繁琐中变得更加具有创造性!
这前面文章中,提到了【实时屏幕捕获】的内容,这篇文章则是为大家介绍在现代计算机环境中,鼠标行为追踪的有效的方法,并通过记录和分析用户的鼠标操作,可以减少重复性工作,提高工作效率。尤其是在一些固定且重复的任务中,如接口测试、参数测试等,鼠标行为追踪为自动化提供了可能。
类似于手机上面的语言助手,不是有一个特定语言执行特定动作的功能吗,这个就类似于它,目前之所以做鼠标行为追踪并模拟是为了后面开展更加高级的功能。
首先,我们需要安装所需的库。在终端或命令提示符中执行以下命令:
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 cv2
user_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'] = button
user_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"] = False
print(f'按下组合键 ctrl + s')
except AttributeError as e:
if key == kbd.Key.esc:
_KEY_Press["ctrl+s"] = False
return False
# 按键释放
def on_release(key):
try:
if key.char == "\x13":
_KEY_Press["ctrl+s"] = True
print(f'释放组合键 ctrl + s')
except AttributeError:
if key == kbd.Key.esc:
_KEY_Press["ctrl+s"] = False
return False
# 构造监听器对象
with kbd.Listener(
on_press=on_press,
on_release=on_release) as listener:
# 监听启动
listener.join()
当熟练了解以后,就可以愉快地使用这些零零散散的知识并加以应用从而达到预想的效果。
以微信给别人发短信为例:
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 = 0
for 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_List
try:
if key.char == "\x13":
_KEY_Press["ctrl+r"] = False
_KEY_Press["ctrl+s"] = False
User_Active_List = []
elif key.char == "\x12":
_KEY_Press["ctrl+s"] = False
_KEY_Press["ctrl+r"] = False
elif _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"] = True
return False
elif _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_time
try:
if key.char == "\x13":
_KEY_Press["ctrl+s"] = True
start_time = datetime.now()
print(f'开始记录操作...')
if key.char == "\x12":
_KEY_Press["ctrl+r"] = True
run_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"] = True
return 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_List
if _KEY_Press["esc"]:
print(f'鼠标捕获退出!')
return False
elif _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()
鼠标按键行为回溯