影刀RPA 键盘鼠标模拟的精细控制:延迟坐标与按键组合

影刀RPA 键盘鼠标模拟的精细控制:延迟坐标与按键组合
影刀RPA 键盘鼠标模拟的精细控制延迟坐标与按键组合作者林焱什么情况用这个网页自动化大部分情况用【点击元素】和【填写输入框】就够了。但当你遇到以下场景就必须祭出键盘鼠标模拟了需要操作非浏览器的桌面软件ERP客户端、老旧的CS系统网页上的Flash/Canvas组件影刀的元素捕获抓不到里面的东西需要CtrlC/V等键盘快捷键组合需要拖拽操作网页弹窗遮挡了元素无法用元素定位点击这些情况的核心特点是元素捕获工具抓不到或者能抓到但指令无效。这时候你就需要模拟人坐在电脑前按键盘点鼠标的操作。怎么做第一步选择正确的模拟方式影刀提供了两种级别的模拟方式指令原理优点缺点前台模拟【模拟按键】/【鼠标点击】直接移动物理鼠标、发送按键兼容性最好操作时会占用鼠标键盘后台模拟【发送按键到窗口】向指定窗口发送消息不占用鼠标键盘部分程序不支持驱动级模拟【硬件模拟】通过驱动层模拟绕过大部分检测需要管理员权限选择原则优先尝试元素操作【点击元素】元素不行 → 前台模拟【鼠标点击】 坐标定位前台影响操作 → 后台模拟不保证有效被检测出是自动化 → 硬件模拟第二步鼠标模拟的精确控制坐标定位——最重要的基础操作店群矩阵自动化突破运营极限【鼠标移动】→ 坐标(500, 300) → 鼠标指针移动到屏幕的(500, 300)像素位置 ⚠️ 坐标是相对于整个屏幕的不是相对于窗口的 【鼠标点击】→ 左键/右键/双击 → 在鼠标当前位置点击 【鼠标拖拽】→ 起始(100,200) 到 结束(500,200) → 按住左键从A拖到B如何获取精确的屏幕坐标# 用Python节点获取鼠标位置辅助定位importpyautoguiimporttime# 打印当前鼠标位置——把鼠标放在目标位置后运行这个print(3秒后获取鼠标位置...)time.sleep(3)x,ypyautogui.position()print(f目标坐标: ({x},{y}))# 获取屏幕上某个像素的颜色用于判断状态colorpyautogui.pixel(x,y)print(f颜色:{color})窗口适配问题不同分辨率的屏幕同一个按钮的坐标不同。你需要相对坐标而不是绝对坐标# 相对窗口坐标计算importwin32guiimportwin32condefget_window_rect(window_title):获取窗口位置和大小hwndwin32gui.FindWindow(None,window_title)ifhwnd:rectwin32gui.GetWindowRect(hwnd)# rect (left, top, right, bottom)return{left:rect[0],top:rect[1],width:rect[2]-rect[0],height:rect[3]-rect[1]}returnNonedefrelative_to_absolute(window_title,rel_x,rel_y):相对坐标转绝对屏幕坐标rectget_window_rect(window_title)ifrect:return(rect[left]rel_x,rect[top]rel_y)returnNone# 使用# 假设按钮在窗口内(100, 50)位置abs_coordsrelative_to_absolute(企业ERP系统,100,50)# 影刀中点击【鼠标移动】→(abs_coords[0],abs_coords[1])【鼠标点击】→ 左键第三步键盘模拟的实战技巧基本按键操作【模拟按键】→ Enter → 按下并释放回车键 【模拟按键】→ {CTRL}c → 按下CtrlC复制 【模拟按键】→ {CTRL}v → 按下CtrlV粘贴 【模拟按键】→ {ALT}{TAB} → 切换窗口 【模拟按键】→ {CTRL}{SHIFT}N → 三个键组合按键代码常用清单按键写法场景回车{ENTER}或~确认表单Tab{TAB}切换焦点Esc{ESC}关闭弹窗方向键{UP} {DOWN} {LEFT} {RIGHT}菜单导航Backspace{BACKSPACE}删除| Delete |{DELETE}| 删除 || Home/End |{HOME} {END}| 跳到开头/结尾 || PageUp/Down |{PGUP} {PGDN}| 翻页 || F1-F12 |{F1}到{F12}| 功能键 |输入一大段文本# 模拟逐字输入比CtrlV更不容易被检测 【模拟按键】→ 影刀RPA自动化教程 # 如果需要中文输入注意输入法状态 # 确保输入法是英文状态或者在输入前切换到英文 【模拟按键】→ {ALT}{SHIFT} ← 切换输入法第四步间隔控制——模拟真人操作如果你发得太快有些程序处理不了。加入间隔模拟真人# 在Python节点中封装人性化输入importrandomimporttimedefhuman_type(text,min_delay0.05,max_delay0.2):模拟真人打字有快有慢偶尔停顿fori,charinenumerate(text):# 随机间隔time.sleep(random.uniform(min_delay,max_delay))pyautogui.typewrite(char)# 偶尔卡顿一下ifrandom.random()0.05:# 5%概率停顿time.sleep(random.uniform(0.3,0.8))defhuman_click(x,y):模拟真人点击# 先移动到附近不是精确目标位置offset_xrandom.randint(-3,3)offset_yrandom.randint(-2,2)# 移动速度不均匀先快后慢pyautogui.moveTo(xoffset_x,yoffset_y,durationrandom.uniform(0.3,0.7))# 短暂停顿像人在确认位置time.sleep(random.uniform(0.1,0.3))# 微调到精确位置人通常会微调pyautogui.moveTo(x,y,durationrandom.uniform(0.05,0.15))# 点击pyautogui.click()第五步截图辅助定位当坐标靠不住时窗口位置可能变了用截图匹配定位# Python节点图片识别定位点击importpyautoguidefclick_image(image_path,confidence0.9): 在屏幕上找到图片并点击 image_path: 目标图片的截图截取你要点击的按钮 confidence: 匹配度0-1建议0.85-0.95 try:locationpyautogui.locateOnScreen(image_path,confidenceconfidence)iflocation:centerpyautogui.center(location)pyautogui.click(center)returnTrueexcept:passreturnFalse# 使用# 1. 先截图保存按钮的图片D:/rpa_imgs/submit_btn.png# 2. 在流程中调用ifclick_image(D:/rpa_imgs/submit_btn.png):print(找到并点击了提交按钮)else:print(未找到按钮可能需要调整截图)第六步拖拽操作的实现# Python节点拖拽操作importpyautoguidefdrag_element(from_x,from_y,to_x,to_y):从(from_x, from_y)拖拽到(to_x, to_y)pyautogui.moveTo(from_x,from_y,duration0.3)pyautogui.mouseDown()pyautogui.moveTo(to_x,to_y,duration0.5)pyautogui.mouseUp()# 在影刀中使用【鼠标拖拽】指令更简单# 【鼠标拖拽】→ 起始(500, 300) 到 (800, 300)有什么坑坑一坐标是屏幕坐标不是窗口坐标现象取得坐标后窗口移动一下就全点错了。解决使用窗口相对坐标窗口定位importwin32guidefclick_in_window(window_title,rel_x,rel_y):在窗口内的相对位置点击hwndwin32gui.FindWindow(None,window_title)ifnothwnd:returnFalse# 先激活窗口win32gui.SetForegroundWindow(hwnd)time.sleep(0.2)# 获取窗口位置rectwin32gui.GetWindowRect(hwnd)abs_xrect[0]rel_x abs_yrect[1]rel_y pyautogui.click(abs_x,abs_y)returnTrue坑二不同分辨率的显示器现象在自己1366x768笔记本上调试的坐标到1920x1080的台式机上全错。temu店群自动化报活动案例解决用比例而不是绝对坐标defresolution_adaptive_click(rel_x_pct,rel_y_pct): 按比例点击 rel_x_pct: X坐标占屏幕宽度的比例0.5中间 rel_y_pct: Y坐标占屏幕高度的比例 screen_w,screen_hpyautogui.size()abs_xint(screen_w*rel_x_pct)abs_yint(screen_h*rel_y_pct)pyautogui.click(abs_x,abs_y)# 点击屏幕正中间resolution_adaptive_click(0.5,0.5)# 点击右上角区域resolution_adaptive_click(0.95,0.05)坑三中文输入法状态现象用【模拟按键】输入中文时出来的全是字母。原因模拟按键发送的是键盘码需要输入法处于合适状态。解决输入中文用剪贴板CtrlV更可靠# 通过剪贴板输入中文importpyperclipimportpyautoguiimporttimedeftype_chinese(text):通过剪贴板输入中文pyperclip.copy(text)![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/4e06743876ec4499a8469c4732af2457.png#pic_center)time.sleep(0.1)pyautogui.hotkey(ctrl,v)# 或者在影刀中# 1. 先把中文文本复制到剪贴板# 2. 【模拟按键】→ {CTRL}v坑四模拟操作期间被干扰现象流程正在自动操作不小心动了鼠标导致点错位置。解决模拟操作前后设置标志比如修改系统托盘图标颜色关键操作之间加微延迟避免操作叠加工作用机最好在执行自动化期间不要人手动操作坑五{CTRL}组合键在某些程序无效现象{CTRL}c在记事本中能复制在某个老ERP里没反应。原因部分程序拦截了标准键盘消息或者需要不同的修饰键。解决尝试不同的方式# 方法1标准组合键pyautogui.hotkey(ctrl,c)# 方法2按下-等待-释放pyautogui.keyDown(ctrl)time.sleep(0.1)pyautogui.press(c)time.sleep(0.1)pyautogui.keyUp(ctrl)# 方法3SendMessageWindows API级别importwin32apiimportwin32con# 向目标窗口发送 WM_COPY 消息总结键盘鼠标模拟是自动化中的最后手段——能用元素定位就不用模拟能用接口就不用操作UI。但当你不得不模拟的时候记住三件事用相对坐标、加随机延迟、时刻准备处理异常。模拟操作是最容易受环境变化影响的操作方式。