pyautogui库详细教程,逐行解释(附项目实战:基于图像识别实现崩坏星穹铁 ...

打印 上一主题 下一主题

主题 597|帖子 597|积分 1791

导言

自动化对于很多人来说是一个高深莫测,可望而不可即的概念,但是实在自动化的实现途径有很多,比如接下来笔者将要介绍的就是此中较为简单的实现途径----pyautogui,只要有一定的编程底子,相信你也可以写出自己的自动化脚本,而其它的自动化脚本也可以做到触类旁通。


pyautogui常用函数



1.定位函数locateCenterOnScreen()

定位函数locateCenterOnScreen()可以定位截图在屏幕上的坐标位置。如果你不知道按钮的位置,就不能用moveTo()移动和click()点击。而且按钮的位置大概会变革,这时即使有来坐标也不好用了。
但是如果你有按钮的截图,你就可以调用pyautogui.locateCenterOnScreen()函数来直接获得按钮所在中央坐标如果截图没找到,pyautogui.locateCenterOnScreen()函数返回None。
下面以我的编译器界面为例,在这个界面中,找到星穹铁道的图标:

截图效果是这样:

是不是挺糊的?2333,但是没关系,我们强大的locateCenterOnScreen()函数照样能返回坐标,让我们来试试:
  1. # 导入库
  2. import pyautogui
  3. # 寻找截图所在位置
  4. location = pyautogui.locateCenterOnScreen('../automation/template/xing_tie.png')
  5. # 打印截图所在位置
  6. print(location)
  7. # 输出结果
  8. # Point(x=1547, y=1563)
复制代码


1.1 locateCenterOnScreen()可选关键字:匹配精度

固然掌握了上述内容,你就可以进行根本的定位操作了,但是如果想要更加精确更加高效的完成定位,那么我想下面的可选参数你一定不能错过。
可选的confidence关键字参数指定函数在屏幕上定位图像的精度。该参数越大,图像匹配程度越高。
  1. # 导入库
  2. import pyautogui
  3. # 寻找截图所在位置
  4. location = pyautogui.locateCenterOnScreen('../automation/template/xing_tie.png',confidence=0.1)
  5. location1 = pyautogui.locateCenterOnScreen('../automation/template/xing_tie.png',confidence=0.9)
  6. # 打印截图所在位置
  7. print('低精度匹配')
  8. print(location)
  9. print('高精度匹配')
  10. print(location1)
  11. # 输出结果
  12. # 低精度匹配
  13. # Point(x=26, y=25)
  14. # 高精度匹配
  15. # Point(x=1547, y=1563)
复制代码
低精度匹配效果不说严丝合缝,至少也可以说是偏到姥姥家去了,但是很多时候得当调低精度照旧有利于定位,因为很多时候截图的清楚度并不是那么高,这时候如果还要求超高精度完美匹配反而定位不到,属于是你这钱给活我也干不了
P.s.需要安装OpenCV库才能使confidence关键字起作用


1.2 locateCenterOnScreen()可选关键字:灰度匹配

在 1920 x 1080 屏幕上,定位函数调用约莫需要 1 或 2 秒。这对于大部分项目和程序来说已经绰绰有余,但是对于游戏或者视频来说照旧太慢了。可选的grayscale关键字可以给定位函数来稍微加速(约莫30%左右)。这会降低图像和屏幕截图的颜色饱和度,从而加速定位速度,但大概会导致误报匹配(假阳性)。
  1. # 导入库
  2. import pyautogui
  3. # 寻找截图所在位置
  4. location = pyautogui.locateCenterOnScreen('../automation/template/xing_tie.png',grayscale=True)
  5. # 打印截图所在位置
  6. print(location)
  7. # 输出结果
  8. # Point(x=1547, y=1563)
复制代码
2.鼠标控制函数



2.1鼠标控制函数moveTo( )

鼠标控制函数moveTo( )会将鼠标光标移动至指定坐标(X,Y)。None可以通报坐标值来表现“当前鼠标光标位置” 。
  1. # 导入库
  2. import time
  3. import pyautogui
  4. # 等待一会方便观察,随后鼠标移动到x:114,y:514的位置
  5. time.sleep(2)
  6. pyautogui.moveTo(114, 514)
  7. # 等待一会方便观察,随后鼠标移动到x不变(114),y:191的位置
  8. time.sleep(2)
  9. pyautogui.moveTo(None,191 )
  10. # 等待一会方便观察,随后鼠标移动到x:981,y不变(191)的位置
  11. time.sleep(2)
  12. pyautogui.moveTo(981, None)
复制代码

2.1.1 moveTo( )可选关键字:移动所需时间

通常鼠标光标会立刻移动到新坐标。如果您盼望鼠标渐渐移动到新位置,请通报第三个参数来表现移动所需的持续时间(以秒为单元)。需要注意的是,如果持续时间小于0.1的话,移动将是即时的。
  1. # 导入库
  2. import pyautogui
  3. # 鼠标移动到(114,514)坐标,过程持续3秒
  4. pyautogui.moveTo(114, 514,3)
复制代码
2.2鼠标控制函数dragTo( )

鼠标控制函数dragTo( )将鼠标在当前位置,按住指定鼠标按键并移动至指定坐标(X,Y),实现拖拽效果。button关键字可以设置为'left'、'middle'、 以及'right'拖动时按住哪个鼠标按钮。
  1. # 导入库
  2. import pyautogui
  3. # 将鼠标在当前位置按住鼠标左键并移动至(300,400)坐标
  4. pyautogui.dragTo(100, 200, button='left')
复制代码
2.2.1 dragTo( )可选关键字:拖拽所需时间

通常鼠标光标会立刻拖拽到新坐标。如果您盼望鼠标渐渐拖拽到新位置,请通报第三个参数来表现移动所需的持续时间(以秒为单元)。
  1. # 导入库
  2. import pyautogui
  3. # 将鼠标在当前位置按住鼠标右键并移动至(300,400)坐标,用时两秒
  4. pyautogui.dragTo(300, 400, 2, button='right')
复制代码
2.3鼠标控制函数click( )

该click( )函数模仿在鼠标在指定坐标单击指定鼠标按键。“点击”的定义是按下按钮然后松开。button关键字可以设置为'left'、'middle'、 以及'right'以指定点击哪个鼠标按钮。
  1. # 导入库
  2. import pyautogui
  3. # 在(114,514)坐标单击鼠标左键
  4. pyautogui.click(114,514,button='left')
复制代码
2.3.1 click( )可选关键字:点击次数与停顿时间

若要进行多次单击,请将整数通报给clicks关键字参数。别的,您可以将浮点数或整数通报给interval关键字参数,以指定单击之间的暂停量(以秒为单元)。
  1. # 导入库
  2. import pyautogui
  3. # 在(114,514)坐标单击两次鼠标左键
  4. pyautogui.click(114,514,clicks=2,button='left')
  5. # 在(114,514)坐标单击两次鼠标左键,每次间隔0.25秒
  6. pyautogui.click(114,514,clicks=2, interval=0.25,button='left')
复制代码
2.4鼠标控制函数scroll( )

鼠标控制函数scroll( )可以通过调用该函数并通报整数次数,在当前坐标模仿鼠标滚轮的滚动操作。每次的滚动量因平台而异。通过传入指定坐标以便在实行滚动之前移动鼠标光标。
  1. # 导入库
  2. import pyautogui
  3. # 在当前位置向上滚动10单位量
  4. pyautogui.scroll(10)
  5. # 在(114,514)坐标向下滚动10单位量
  6. pyautogui.scroll(114,514,-10)
复制代码
  3.键盘控制函数

  3.1键盘控制函数write( )

键盘控制函数write( )可以模仿键盘输入指定的字符串
  1. # 导入库
  2. import pyautogui
  3. # 模拟键盘输入Hello world
  4. pyautogui.write('Hello world!')
复制代码
3.1.1 write( )可选关键字:输入延迟隔断
若盼望在按下每个字符键之间添加延迟隔断,可以为其传入关键字interval
  1. # 导入库
  2. import pyautogui
  3. # 模拟键盘输入Hello world,输入两个字符之间的间隔为0.25秒
  4. pyautogui.write('Hello world!', interval=0.25)
复制代码
 3.2键盘控制函数press( )

键盘控制函数press( )模仿按下一个键然后释放它。需要注意的是,esc,shift这些热键也是可以通过输入字符串进行触发的
  1. # 导入库
  2. import pyautogui
  3. # 模拟键盘输入H
  4. pyautogui.press('H')
  5. # 模拟键盘输入热键Enter
  6. pyautogui.press('Enter')
复制代码
4.进阶操作

4.1目标图片需要一定时间才会出现,那么如何使得查找图片的函数(pyautogui.locateCenterOnScreen)一直运行?
  1. # 该方法用于获取目标图像所在位置,只要没找到图像就一直找
  2. def get_position(word):
  3.     up_left = None
  4.     while up_left == None:
  5.         up_left = pyautogui.locateCenterOnScreen('../目标路径/{}.png'.format(word),confidence=0.9)
  6.     return up_left
复制代码
将该方法封装为一个新的函数进行递归调用,那么只要目标图像没有出现(在函数中体现为无法获取目标图像坐标),那么查找图片的函数(pyautogui.locateCenterOnScreen)就会一直尝试获取目标图像坐标,直到获取乐成后返回坐标,函数竣事。


常见问题指南

1.为什么自动化程序可以精确返回目标UI位置但是无法实行对应操作?
大概是该程序含有反脚本机制检测,请以管理员模式运行Pycharm

2.出现报错如下:OSError: Failed to read ../automation/template/你好.png because file is missing, has improper permissions, or is an unsupported or invalid format
大概是路径中含有中文,请将中文内容修改。或者是函数无法检索到该文件,请仔细查对文件名和路径
3.自动化程序之前可以运行但是后来不行了
请仔细查抄UI是否已经发生变革导致函数无法检索到。或者是更换了运行该函数的屏幕,分辨率变革后需要重新截图或者用回之前的屏幕


基于图像识别实现星穹铁道自动化项目

     基于图像识别实现星穹铁道自动化(附项目源码与教程)
  该项目基于图像识别技能,实现了刷取副本自动化,由于遗器与角色进阶材料更新较为频仍,且仅仅只是对项目内代码简单复用即可实现补全,因此目前项目只实现了拟造花萼(金),拟造花萼(赤),历战余响的自动刷取,如果该文章浏览量数据抱负,批评区大量催更的话,我会尽快完成项目的补全哦~原创不易,还恳请各位多多支持!
  1. # pyautogui库用于自动化鼠标键盘事件
  2. import pyautogui
  3. # 用于控制滚轮事件频率,使其更加自然
  4. import time
  5. # 该方法用于获取目标图像所在位置,只要没找到图像就一直找
  6. def get_position(word):
  7.     up_left = None
  8.     while up_left == None:
  9.         up_left = pyautogui.locateCenterOnScreen('../automation/template/{}.png'.format(word),confidence=0.95)
  10.     return up_left
  11. # 单击
  12. def click(position):
  13.     pyautogui.click(position[0],position[1],button='left')
  14. # 输入刷副本相关参数
  15. type = input('今天想刷啥类型副本')
  16. material = input(f'今天想刷{type}中的哪个副本')
  17. frequency = int(input(f'今天想刷{material}几次呢?'))
  18. # 在开始菜单中选择星穹铁道
  19. click(get_position('xing_tie'))
  20. print('星铁已经就绪')
  21. # 虽然UI已经出现,但是程序还未准备就绪,需要等待
  22. time.sleep(1)
  23. # 于启动器界面启动游戏
  24. click(get_position('qi_dong'))
  25. print('星穹铁道,启动!')
  26. # 于游戏界面开始游戏
  27. click(get_position('start'))
  28. print('创死它!')
  29. # 于游戏中点击esc键打开菜单
  30. if get_position('main') != None:
  31.     pyautogui.hotkey('esc')
  32. print('打开菜单')
  33. # 于菜单界面打开指南
  34. click(get_position('guide'))
  35. print('康康指南')
  36. if pyautogui.locateCenterOnScreen('../automation/template/today_task.png', grayscale=True) != None:
  37.     click(get_position('today_task'))
  38. # 找到欲拖拽目标type
  39. pyautogui.moveTo(get_position('gloden_flower'))
  40. print('找到预定滚动目标')
  41. # 没找到预定目标type就往下滚动列表
  42. while pyautogui.locateCenterOnScreen('../automation/template/{}.png'.format(type),confidence=0.9) == None:
  43.     pyautogui.scroll(-1)
  44.     # 慢点滚,看得我眼睛疼
  45.     time.sleep(0.5)
  46. print('开始滚动')
  47. # 金花
  48. if type == 'gloden_flower':
  49.     click(get_position('gloden_flower'))
  50.     print('找到预定目标')
  51.     # 金花_经验
  52.     if material == 'exp':
  53.         pyautogui.click(get_position('exp')[0] + 500, get_position('exp')[1] + 100)
  54.     # 金花_光锥经验
  55.     elif material == 'weapon_exp':
  56.         pyautogui.click(get_position('weapon_exp')[0] + 500, get_position('exp')[1] + 100)
  57.     # 金花_信用点
  58.     elif material == 'credit_point':
  59.         pyautogui.click(get_position('credit_point')[0] + 500, get_position('exp')[1] + 100)
  60. # 红花
  61. elif type == 'red_flower':
  62.     click(get_position('red_flower'))
  63.     print('找到预定目标')
  64.     # 找到欲拖拽目标material
  65.     pyautogui.moveTo(get_position('destory'))
  66.     print('找到预定滚动目标')
  67.     # 没找到预定目标material就往下滚动列表
  68.     while pyautogui.locateCenterOnScreen('../automation/template/{}.png'.format(material), confidence=0.99) == None:
  69.         pyautogui.scroll(-1)
  70.         # 慢点滚,看得我眼睛疼
  71.         time.sleep(0.5)
  72.     print('开始滚动')
  73.     # 红花_毁灭
  74.     if material == 'destroy':
  75.         pyautogui.click(get_position('destory')[0] + 500, get_position('destory')[1])
  76.     # 红花_存护
  77.     elif material == 'preserve':
  78.         pyautogui.click(get_position('preserve')[0] + 500, get_position('preserve')[1])
  79.     # 红花_巡猎
  80.     elif material == 'hunting':
  81.         pyautogui.click(get_position('hunting')[0] + 500, get_position('hunting')[1])
  82.     # 红花_丰饶
  83.     elif material == 'abundance':
  84.         pyautogui.click(get_position('abundance')[0] + 500, get_position('abundance')[1])
  85.     # 红花_智识
  86.     elif material == 'knowledge':
  87.         pyautogui.click(get_position('knowledge')[0] + 500, get_position('knowledge')[1])
  88.     # 红花_同谐
  89.     elif material == 'harmony':
  90.         pyautogui.click(get_position('harmony')[0] + 500, get_position('harmony')[1])
  91.     # 红花_虚无
  92.     elif material == 'nothingness':
  93.         pyautogui.click(get_position('nothingness')[0] + 500, get_position('nothingness')[1])
  94. # 每周副本
  95. elif type == 'weekly_copy':
  96.     click(get_position('weekly_copy'))
  97.     print('找到预定目标')
  98.     # 找到欲拖拽目标material
  99.     pyautogui.moveTo(get_position('doomsday_beast'))
  100.     print('找到预定滚动目标')
  101.     # 没找到预定目标material就往下滚动列表
  102.     while pyautogui.locateCenterOnScreen('../automation/template/{}.png'.format(material), confidence=0.99) == None:
  103.         pyautogui.scroll(-1)
  104.         # 慢点滚,看得我眼睛疼
  105.         time.sleep(0.5)
  106.     print('开始滚动')
  107.     # 末日兽
  108.     if material == 'doomsday beast':
  109.         pyautogui.click(get_position('nothingness')[0] + 500, get_position('nothingness')[1])
  110.     # 可可利亚
  111.     if material == 'cocolia':
  112.         pyautogui.click(get_position('cocolia')[0] + 500, get_position('cocolia')[1])
  113.     # 幻胧
  114.     if material == 'hazy':
  115.         pyautogui.click(get_position('hazy')[0] + 500, get_position('hazy')[1])
  116. # 进入战斗
  117. click(get_position('enter_fighting'))
  118. # 开始战斗(编队页面)
  119. click(get_position('start_fighting'))
  120. # 根据战斗次数决定循环次数
  121. for i in range(frequency-1):
  122.     # 再打一次
  123.     click(get_position('fight_again'))
复制代码
全项目文件
链接:https://pan.baidu.com/s/13tkt10-rVJRzchdnLQZPyw?pwd=1234 
提取码:1234

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

大连密封材料

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表