最近后台网站崩溃有点频繁,都需要手动去后台用软件开启服务,有点繁琐。于是想到了之前学习过的python自动化任务,决定上手一试。
先想下怎么实现,这个任务需要开启电脑上指定的某个软件,进入对应的ip的服务器,再使用指令进入目录,最后执行开启的命令。
分析需求,只用到 光标移动、光标点击、键盘输入,那么用pyautogui库都可以解决,它就是专门做光标键盘输入的,看名字就知道。autogui
要用的软件是放在开始菜单中的:
所以需要先把光标移动到开始菜单的位置,再点击开始菜单。移动位置需要指定(x,y),即坐标系x轴的哪个位置,y轴的哪个位置,这样她才知道你要移动到哪里去 。左上角为坐标原点,右下为正轴。坐标系统如下:
使用QQ截图工具(快捷键alt+shift+A),从左上角开始做为原点,测量到开始菜单大概在(1887,33)的位置。
于是就有了下面这行代码:
pyautogui.moveRel(1880,25, duration=0.1)
pyautogui.moveTo() 函数将光标立即移动到屏幕的指定位置。表示 x、y 坐标的整数值分别构成了函数的第一个和第二个参数。可选的 duration 整数或浮点数关键字参数,指定了将光标移到目的位置所需的秒数。如果不指定,默认值是零,表示立即移动(在 PyAutoGUI 函数中,所有的 duration 关键字参数都是可选的)。
但是移动之后,发现没有移动到需要的位置。再次测量,发现我给的坐标是没问题的,所以联想到,它这里应该是用的相对坐标,而我之前以为是绝对坐标。
绝对坐标,不论什么情况,都以屏幕的左上角的原点做计算
相对坐标,以当前光标的位置为原点进行计算
比如在计算之后,光标在(100,100)的位置,我给它坐标(20,20),是希望它移动到屏幕的(20,20)的位置,结果移动到了(120,120),也就是100+20,相对当前光标的位置做了移动。
先用这个可能的原因,做下测试,发现确实是这个原因。现在知道问题出在哪了,先想到的解决的办法是,在命令执行之前,人为先把光标移动到屏幕左上角,这时候还报了个错。
查找资料,得到--“pyautogui 也有自动防故障功能。将鼠标移到屏幕的左上角,这将导致 pyautogui产生 pyautogui .FailSafeException 异常。你的程序可以用 try 和 except 语句来处理这第 18 章 用 GUI 自动化控制键盘和鼠标个异常,也可以让异常导致程序崩溃。这两种情况下,如果你尽可能快地向左上移动鼠标,自动防故障功能都将停止程序。可以设置 pyautogui. FAILSAFE = False,禁止这项功能。”
于是需要加上“pyautogui. FAILSAFE = False”这行代码,防止报错。加上后测试确实正常了。继续。
在加的过程中,又觉得很麻烦,还是要我手动去移,那做这个自动化就没意义了,有没有别的办法?又想到了,可以先把光标自动移动到左上角,比如(-2000,-2000)试试?这样无论之前光标在哪个位置,最后都能移到屏幕左上角了,因为她总不能把光标移动到屏幕外面去吧。然后试了下这行代码“pyautogui.moveRel(-2000,-2000, duration=0.1)”,果然可行,
所以代码最后变成了如下:
pyautogui.moveRel(-2000,-2000, duration=0.1) ##移动到 最左上角time.sleep(0.1) ## 等待0.1秒再执行下一步pyautogui.moveRel(1880,25, duration=0.1) ##移动到 开始菜单的位置
测试正常,再加上点击的方法“pyautogui.click()”
现在要基于已经打开的”开始菜单“进行移动,于是又要先移动到左上角,再移动到“软件图标”的位置,这有点太麻烦了吧,不爽,难道库的开发者会想不到这点?
于是我就去网上找库的使用文档,发现如下:
原来鼠标移动其实有两个方法,moveRel是相对移动,而moveTo是绝对位置移动,而之前用的是相对移动的方法。
试了下效果,改成绝对移动,确实是这样。看来前面绕了一大圈。
所以得到下面的代码。
后面还需要用到 doubleClick() 鼠标双击, 可用于打开软件。
typewrite()方法, 用于自动敲键盘,输入预先指定的文字。
这期间也遇到一个问题,折腾好一会儿, 就是typewrite()怎么也输入不了,还以为是这个方法有bug,但在别的地方用过这个,是没问题的。反复几次,后来发现,是因为上一步操作耗时长,而给的 time.sleep(0.1)时间少了,所以typewrite这一步直接没了。总之就是机器慢的原因。所以要注意下这个点。一定要保证sleep的时间是够的,让上一步操作完。
后续都比较顺利,没遇到什么问题,最后得到了想要的自动化的效果,总耗时大概13秒,代码很简单,如下:
上面这套的优点是利用理解,书写简单,不易出bug。
缺点也明显,局限很高,基本只能在这台电脑上使用,因为这些位置的取点都是固定的,不灵活。
不过本来这代码也就这台机器用,所以无所谓了。
这个自动化的功能写起来简单,用起来爽,一劳永逸,真不错。比较省时,自己操作和输入,花的时间比机器慢了不少。更主要省心,不用自己去输入,去点击,避免了麻烦。都能达到一样的效果,为什么不偷懒呢。
这还只是python的一点皮毛。python写工具实用性强,不像其他的东西,讲的理论高深,一时半会无法实践。
再接再励!