python 在屏幕上点击特定按钮或图像

想要的效果

      大概就是搞个windows桌面自动点击程序,以新浪微博自动点赞为例。

需要用到的函数库

PyAutoGUI——图形用户界面自动化(主要用到这个)

PyAutoGUI是Python功能强大的UI自动化库,其目的是可以用程序自动控制鼠标和键盘操作,主要用来实现PC端的UI自动化。

  • 有鼠标控制、键盘操作、屏幕截图、图片定位、消息对话框、窗口操作等功能;
  • 有倒计时、鼠标坐标颜色抓取小程序、UI自动化迷你语言等实用工具;
  • 有故障安全、通用暂停等机制。 
  • Pillow——图像处理

    该库提供广泛的文件格式支持、高效的内部表示和相当强大的图像处理功能。旨在快速访问以几种基本像素格式存储的数据。它应该为一般的图像处理工具提供坚实的基础。

  • 该库包含基本的图像处理功能,包括点操作、使用一组内置卷积内核进行过滤以及色彩空间转换。
  • 该库还支持图像大小调整、旋转和任意仿射变换。
  • 有一种直方图方法允许您从图像中提取一些统计信息。这可用于自动对比度增强和全局统计分析。
  • OpenCV——是开源的计算机视觉和机器学习库(不太了解,问题不大)

    它轻量级而且高效——由一系列 C 函数和少量 C++ 类构成,同时提供了Python、Ruby、MATLAB等语言的接口,实现了图像处理和计算机视觉方面的很多通用算法。

    前面的看不看都一样进入正题

    例如实现功能,打开新浪微博首页,我们要识别图中的的赞,并点击。

    1),使用pyautogui.mouseInfo()获取目标图片(屏幕上需要点击的图像)位置,以新浪微博点赞为例,写代码截取点赞的手势图片,代码如下:

    import pyautogui
    pyautogui.mouseInfo()#获取点赞图片的位置(1127,756,1146,775)

    from PIL import Image
    import pyautogui
    import time
    time.sleep(2)#留一点切换页面时间
    im = pyautogui.screenshot()#截取整个屏幕
    om = im.crop((1127, 756, 1146, 775))#根据截取的屏幕仅截取“带赞的手势图片”,用pyautogui.mouseInfo()获取图片的位置(1127,756,1146,775),这里截取区域用到了Pillow
    om.save(r"C:\Users\zz\Desktop\dianzan.png")#将图片保存供pyautogui.locateOnScreen()使用
    
    

    截图效果:

    ps:自己手动截图也一样,还有最重要每当初次运行时要确保图像不出错还是重新用程序截一个图靠谱。

    2),获取赞截图后使用pyautogui.locateOnScreen()识别图像获取赞图像的位置,再用pyautogui.center()获取中心点,代码如下:

    import pyautogui
    import time
    
    time.sleep(1)
    
    
    def zan():
        time.sleep(1)  # 这个可以用来防止操作过快
        left, top, width, height = pyautogui.locateOnScreen(r"C:\Users\zz\Desktop\dianzan.png")  # 寻找刚才保存点赞手势图片
        center = pyautogui.center((left, top, width, height))  # 寻找图片的中心
        pyautogui.click(center)
        print('点赞成功!')
    
    
    count = 10    # 为了防止一直运行下去,点一定数量的赞就结束,自己定义
    while count:
        try:
            zan()  # 调用点赞函数
            count -= 1
        except TypeError:           # 错误类型没有也文图不大,哈哈哈
            pyautogui.scroll(-500)  # 本页没有图片后,滚动鼠标;
            print('没有找到目标,屏幕下滚~')
    print("点10个赞结束!")
    

     运行结果:

    代码输出如下:

     一般基本原理以上就是了,大概。。。。但是要提高pyautogui.locateOnScreen()识别图像速度和效率的话看下面:

    图片定位不稳定的四种解决方案

    方案介绍

    1.模糊定位:借助opencv的来提高识别率,加入confidence参数调整识别准确度,当confidence越小,定位的精度就会越低,从而实现模糊定位。

    2.灰度匹配:加入grayscale参数,当grayscale=True时会使图像和屏幕截图中的颜色去饱和,解决由于显示器饱和度不同从而引起的颜色细微差异因而导致的图像定位失败问题。

    3.指定范围:加入region参数,可以控制找图范围提高找图效率。

    4.多图定位:图标在不同场景下可能有不同的显示效果,可以把不同显示效果的多张图片归为一个事件,对多张图进行循环查找,定位一张图就可以对整个事件进行定位。

     1.模糊定位

    pyautogui.locateOnScreen()函数中加入confidence参数,当confidence的值决定精度,代码如下:

    left, top, width, height = pyautogui.locateOnScreen(r"C:\Users\zz\Desktop\dianzan.png", confidence=0.9)
    #太长了下面用xy表示

    2.灰度匹配

    pyautogui.locateOnScreen()函数中加入grayscale=True,就可以实现灰度匹配,代码如下:

    xy = locateOnScreen(r"C:\Users\zz\Desktop\dianzan.png", grayscale=True)

    3.指定范围

    加入region参数,可以控制找图范围,从而提高找图效率。region(x,y,width,height),其中x,y为范围左上角坐标,width,height为范围的宽和高,代码如下:

    xy = pyautogui.locateOnScreen(r"C:\Users\zz\Desktop\dianzan.png",  region=(1128, 208, 1158, 1027))

    4.多图定位

    可以对一个图标截多张不同的图,每一张图都代表这个图标,只要定位其中一张图就能定位这个图标。对locateOnScreent()函数进行二次封装,多张图片之间用 ' | ' 间隔,实现循环找图,代码如下:

    from pyautogui import *
     
    #把字符串按'|'切割
    def word_cut(args):
        tup = []
        if '|' in args:
            re1 = args.split('|')
            return re1
        else:
            tup.append(args)
            return tuple(tup)
     
    #判断图像是否找到,如果找到就返回True,没找到就跳过
    def assertPIC(args):
        if locateOnScreen(args) == None:
            pass
        else:
            return True
     
    #循环找图,找到就返回图像中心点,没找到就打印'没找到'
    def img_locat(args):
        arg = word_cut(args)
        for i in range(len(arg)):
            if assertPIC(arg[i]):
                return center(locateOnScreen(arg[i]))
            else:
                print('没找到')
     
    #测试
    print(img_locat('test1.png|test2.png'))

    所以最后的程序可以这样:

    import pyautogui
    import time
    
    time.sleep(1)
    
    
    def zan():
        time.sleep(3)  # 这个可以用来防止操作过快
        left, top, width, height = pyautogui.locateOnScreen(r"C:\Users\zz\Desktop\dianzan.png",
                                                            confidence=0.9, region=(1101, 190, 1240, 1034))  # 寻找刚才保存点赞手势图片
        center = pyautogui.center((left, top, width, height))  # 寻找图片的中心
        pyautogui.click(center)
        print('点赞成功!')
    
    
    count = 10  # 为了防止一直运行下去,点一定数量的赞就结束,自己定义
    while count:
        try:
            zan()  # 调用点赞函数
            count -= 1
        except TypeError:           # 错误类型没有也文图不大,哈哈哈
            pyautogui.scroll(-500)  # 本页没有图片后,滚动鼠标;
            print('没有找到目标,屏幕下滚~')
    
    print("点10个赞结束!")

    来源:zzfengling

    物联沃分享整理
    物联沃-IOTWORD物联网 » python 在屏幕上点击特定按钮或图像

    发表评论