【328】Python 控制鼠标/键盘+图片识别 综合应用
本文是基于 【267】实现跨网络传数据 的基础上的,由于在弹出 putty 之后,需要手动输入命令(pass.sh、get.sh)来实现数据的传递,另外就是处理完之后需要手动关闭 putty,本文解决的两个问题就是在 putty 上自动输入命令以及推出(exit)。
解决方法:
1. 系统在调用 putty 之后,利用 【321】python进程监控:psutil 中的知识点,可以判断 putty 是否运行,如果运行了,则可以通过 【322】python控制键盘鼠标:pynput 中的知识点自动输入【pass.sh 或 get.sh】,从而实现putty的命令自动输入(根据经验判断鼠标的位置落在 putty 界面上,因此需要 putty 始终保持最上面显示);
2. putty 命令执行完之后,需要执行【exit】命令关闭窗体,问题在于什么时候 putty 执行完毕,是通过 【326】Python 截图及图片识别 中截取 putty 所在界面,然后通过图片识别技术判断里面是否含有某些文字,如果有的话,可以知道 putty 已经处理完毕。如上,此处也要保证 putty 最上显示,另外截图的区域是按照经验设置的。截图如下所示:
代码实现:
文件夹设置如下:
- 📁Data
- 📁Scripts
- 📃Get_Data.py
- 📃Pass_Data.py
- 📃pscp.exe
- 📃putty.exe
- 📃Get_Data.bat
- 📃Pass_Data.bat
具体代码如下:
Get_Data.py
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 | # coding=utf-8 from PIL import ImageGrab from PIL import Image import pynput, time, os, psutil, pytesseract from pynput.mouse import Button from pynput.keyboard import Key mouse = pynput.mouse.Controller() keyboard = pynput.keyboard.Controller() def autoinput(): mouse.position = ( 499 , 273 ) mouse.click(Button.left) keyboard.press(Key.shift) keyboard.release(Key.shift) keyboard.press( 'g' ) keyboard.press( 'e' ) keyboard.press( 't' ) keyboard.press( '.' ) keyboard.press( 's' ) keyboard.press( 'h' ) keyboard.press(Key.enter) keyboard.release(Key.enter) keyboard.press(Key.shift) keyboard.release(Key.shift) def autoinput_exit(): mouse.position = ( 499 , 273 ) mouse.click(Button.left) # 用来切换输入法,我电脑默认中文 keyboard.press(Key.shift) keyboard.release(Key.shift) keyboard.press( 'e' ) keyboard.press( 'x' ) keyboard.press( 'i' ) keyboard.press( 't' ) keyboard.press(Key.enter) keyboard.release(Key.enter) # 再把输入法切换回来 keyboard.press(Key.shift) keyboard.release(Key.shift) def savePic(): pic = ImageGrab.grab(bbox = ( 175 , 299 , 719 , 701 )) pic.save(r "D:\Windows-Linux\Scripts\tmp.jpg" ) def getChinese(): str_chi = [ "数" , "据" , "复" , "制" , "完" , "成" , "退" , "出" ] text = pytesseract.image_to_string(Image. open (r 'D:\Windows-Linux\Scripts\tmp.jpg' ),lang = 'chi_sim' ) for s in str_chi: if (text.find(s) > - 1 ): return True return False flag = 0 for i in range ( 0 , 100 ): # 获取进程id ps = psutil.pids() # 判断是否有putty进程,默认只有一个putty for pi in ps: p = psutil.Process(pi) if p.name().find( "putty" ) = = 0 : autoinput() flag = 1 break if (flag): break time.sleep( 1 ) time.sleep( 5 ) for i in range ( 0 , 100 ): savePic() if (getChinese()): autoinput_exit() break time.sleep( 1 ) |
Pass_Data.py
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 | # coding=utf-8 # 图片识别技术 from PIL import ImageGrab from PIL import Image import pynput, time, os, psutil, pytesseract from pynput.mouse import Button from pynput.keyboard import Key mouse = pynput.mouse.Controller() keyboard = pynput.keyboard.Controller() def autoinput(): mouse.position = ( 499 , 273 ) mouse.click(Button.left) # 用来切换输入法,我电脑默认中文 keyboard.press(Key.shift) keyboard.release(Key.shift) keyboard.press( 'p' ) keyboard.press( 'a' ) keyboard.press( 's' ) # 一样的按键不用release会显示一个按键 keyboard.release( 's' ) keyboard.press( 's' ) keyboard.press( '.' ) keyboard.press( 's' ) keyboard.press( 'h' ) keyboard.press(Key.enter) keyboard.release(Key.enter) # 再把输入法切换回来 keyboard.press(Key.shift) keyboard.release(Key.shift) def autoinput_exit(): mouse.position = ( 499 , 273 ) mouse.click(Button.left) # 用来切换输入法,我电脑默认中文 keyboard.press(Key.shift) keyboard.release(Key.shift) keyboard.press( 'e' ) keyboard.press( 'x' ) keyboard.press( 'i' ) keyboard.press( 't' ) keyboard.press(Key.enter) keyboard.release(Key.enter) # 再把输入法切换回来 keyboard.press(Key.shift) keyboard.release(Key.shift) def savePic(): pic = ImageGrab.grab(bbox = ( 175 , 299 , 719 , 701 )) pic.save(r "D:\Windows-Linux\Scripts\tmp.jpg" ) def getChinese(): str_chi = [ "数" , "据" , "复" , "制" , "完" , "成" , "退" , "出" ] text = pytesseract.image_to_string(Image. open (r 'D:\Windows-Linux\Scripts\tmp.jpg' ),lang = 'chi_sim' ) for s in str_chi: if (text.find(s) > - 1 ): return True return False flag = 0 for i in range ( 0 , 100 ): # 获取进程id ps = psutil.pids() # 判断是否有putty进程,默认只有一个putty for pi in ps: p = psutil.Process(pi) if p.name().find( "putty" ) = = 0 : autoinput() flag = 1 break if (flag): break time.sleep( 1 ) time.sleep( 5 ) for i in range ( 0 , 100 ): savePic() if (getChinese()): autoinput_exit() break time.sleep( 1 ) |
Get_Data.bat
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | @ echo off echo . echo 连接Linux电脑,主机:192.168.14.28,用户名:ocean,密码:lj666yjh echo . echo 执行代码【get.sh】 cd . /Scripts start /min cmd /c python D:\Windows-Linux\Scripts\Get_Data.py putty.exe -pw lj666yjh ocean@192.168.14.28 echo . pscp.exe -pw lj666yjh ocean@192.168.14.28: /home/ocean/alex/Others/Linux-Windows/Data/ * D:\Windows-Linux\Data\ echo . echo 数据传输成功! echo . start D:\Windows-Linux\Data |
Pass_Data.bat
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | @ echo off cd . /Scripts pscp.exe -pw lj666yjh D:\Windows-Linux\Data\* ocean@192.168.14.28: /home/ocean/alex/Others/Linux-Windows/Data echo . echo 连接Linux电脑,主机:192.168.14.28,用户名:ocean,密码:lj666yjh echo . echo 执行代码【pass.sh】 start /min cmd /c python Pass_Data.py putty.exe -pw lj666yjh ocean@192.168.14.28 echo . echo 数据传输成功! echo . |
源码下载:Windows-Linux.zip
posted on 2018-06-26 10:25 McDelfino 阅读(2125) 评论(0) 编辑 收藏 举报
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· .NET10 - 预览版1新功能体验(一)