做自动化的时候,比较常见的一种场景
在这里插入图片描述
上面这个列表,我们需要鼠标去点击每个锁定标题,当然可以直接点击黄色15¥,黄色15¥和黄色20¥,相似度应该在0.7左右但是算是匹配成功的。

做法可以是:
先截取一张模板
在这里插入图片描述
然后在最开始的一张截图去锁定,代码如下

# png_path 截图模板 就是上图中的15¥
 png_path = r'E:\python\auto_exe\yuanshen\photo\ico_1.png'
 		# 当前屏幕。就是最开始的一张图
        screen = lackey.Screen()
        # findAll 在screen当中寻找所有符合的项目。
        ico_1_list = list(screen.findAll(png_path))
        # 循环点击
        if len(ico_1_list) != 0:
            for index in range(len(ico_1_list)):
                screen.click(ico_1_list[index])
                time.sleep(1)

当然上面的只是一部分,像原神的游戏公告自动化点击,消除小红点是下面代码完成的,不可直接复制粘贴,因为缺少截图。完整程序包请直接访问百度网盘下载,更改原神的启动路径即可。

效果如下:由于版权原因,上传视频和程序包都失败,视频最后上传到小破站了,程序包上传到百度云网盘了,有兴趣的话可以看下。
python | 第1集 实现自动化拍照,自动化点击游戏公告,消除小红点
https://www.bilibili.com/video/BV1qe4y1H7Nd/?vd_source=74491db4ef604fb16ac63f32db8f3abf

百度云网盘:
链接:https://pan.baidu.com/s/1395qW18qU6tpTo8exQ7oLg
提取码:1ski

import time
import keyboard
from lackey import Button, Match
from pywinauto import mouse
from PIL import ImageGrab
import pywinauto
2022年9月25日19:47:10 
当前版本需要先获取一个screen
screen = lackey.Screen()
account_png = lackey.Pattern(r'E:\python\auto_exe\photo\account.png')
screen.click(account_png)
screen.type('123456')
import lackey
# 尝试重新点击一个按钮
def try_click_again(png_path='', massage='', press_alt=False):
    error_count = 120
    while True:
        error_count = error_count - 1
        try:
            screen = lackey.Screen()
            click_png = lackey.Pattern(png_path)
            if press_alt:
                keyboard.press("Alt")
                time.sleep(2)
            screen.click(click_png)
            print(massage + " success!")
            time.sleep(15)
            pic = ImageGrab.grab()
            pic.save(massage + ".jpg")
            if press_alt:
                keyboard.release("Alt")
            break
        except Exception as e:
            # 表示当前屏幕没有需要截图的像素
            time.sleep(1)
            print(e.args[0] + "\n" + massage + ", try to click again ...\n")
            if error_count == 0:
                print(massage + ',try to click again fail,will exit...')
                exit()
def main_page():
    #  点击人头
    # try_click_again(png_path=r'E:\python\auto_exe\yuanshen\photo\left_1.png',
    #                 massage='click click in(点击主页,左上角的人头)', press_alt=True)
    time.sleep(10)
    keyboard.press_and_release("Esc")
    time.sleep(10)
def main_page_photo():
    # 点击拍照
    try_click_again(png_path=r'E:\python\auto_exe\yuanshen\photo\photo.png',
                    massage='click click in(打开主页后,点击拍照按钮)')
    # 按键Enter
    keyboard.parse_hotkey("Ctrl+H")
    time.sleep(10)
    keyboard.press_and_release("Enter")
    # 点击保存
    try_click_again(png_path=r'E:\python\auto_exe\yuanshen\photo\save.png',
                    massage='click click in(点击保存按钮)')
    # 点击退出
    try_click_again(png_path=r'E:\python\auto_exe\yuanshen\photo\exit.png',
                    massage='click click in(点击退出按钮)')
    # 点击退出(二次退出)
    try_click_again(png_path=r'E:\python\auto_exe\yuanshen\photo\exit.png',
                    massage='click click in(点击退出(二次退出)按钮)')
def main_page_advs():
    # 点击公告按钮
    try_click_again(png_path=r'E:\python\auto_exe\yuanshen\photo\advs.png',
                    massage='click click in(打开主页后,点击公告按钮)')
    # 点击游戏公告
    try_click_again(png_path=r'E:\python\auto_exe\yuanshen\photo\game_advs.png',
                    massage='click click in(点击游戏公告)')
    # 游戏公告的小红点
    while True:
        png_path = r'E:\python\auto_exe\yuanshen\photo\ico_1.png'
        screen = lackey.Screen()
        ico_1_list = list(screen.findAll(png_path))
        if len(ico_1_list) != 0:
            for index in range(len(ico_1_list)):
                screen.click(ico_1_list[index])
                time.sleep(1)
        # 结束条件
        try:
            screen = lackey.Screen()
            click_png = lackey.Pattern(r'E:\python\auto_exe\yuanshen\photo\game_advs_end.png')
            screen.click(click_png)
            break
        except Exception as e:
            print(e.args[0] + "\n未定位到【公平运营声明】公告,结束条件不满足")
        mouse.scroll(coords=(270, 415), wheel_dist=-1)
        print("鼠标滚动!")
    # 点击活动公告
    try_click_again(png_path=r'E:\python\auto_exe\yuanshen\photo\active_advs.png',
                    massage='click click in(点击游戏公告)')
    # 活动公告的小红点
    while True:
        png_path = r'E:\python\auto_exe\yuanshen\photo\ico_1.png'
        screen = lackey.Screen()
        ico_1_list = list(screen.findAll(png_path))
        if len(ico_1_list) != 0:
            for index in range(len(ico_1_list)):
                screen.click(ico_1_list[index])
                time.sleep(1)
        # 结束条件
        time.sleep(1)
        try:
            screen = lackey.Screen()
            click_png = lackey.Pattern(r'E:\python\auto_exe\yuanshen\photo\active_exit.png')
            screen.click(click_png)
            break
        except Exception as e:
            print(e.args[0] + "\n未定位到【神铸赋形】公告,结束条件不满足")
        mouse.scroll(coords=(270, 415), wheel_dist=-1)
        print("鼠标滚动!")
def main_page_email():
    # 点击邮件按钮
    try_click_again(png_path=r'E:\python\auto_exe\yuanshen\photo\email.png',
                    massage='click click in(打开主页后,点击邮件按钮)')
    # 检查 是不是没有邮件
    screen = lackey.Screen()
    ico_1_list = list(screen.findAll(r'E:\python\auto_exe\yuanshen\photo\no_email.png'))
    if len(ico_1_list) != 0:
        # 点击退出
        keyboard.press_and_release("Esc")
        time.sleep(5)
        # 直接点击Esc 回到主屏幕
        keyboard.press_and_release("Esc")
        return
    # 点击 已读邮件删除
    try_click_again(png_path=r'E:\python\auto_exe\yuanshen\photo\delete_read_finish.png',
                    massage='click click in(点击删除已读按钮')
    # 点击 确认按钮
    try_click_again(png_path=r'E:\python\auto_exe\yuanshen\photo\yes.png',
                    massage='click click in(点击 确认删除按钮')
    # 点击全部领取
    try_click_again(png_path=r'E:\python\auto_exe\yuanshen\photo\all_get.png',
                    massage='click click in(点击【全部领取】按钮)')
    # 点击左键
    mouse.press(Button.LEFT)
    time.sleep(5)
    keyboard.press_and_release("Esc")
    time.sleep(5)
    # 直接点击Esc 回到主屏幕
    keyboard.press_and_release("Esc")
    time.sleep(5)
# 调整时间
def main_page_adjust_time():
    # 点击调整时间
    try_click_again(png_path=r'E:\python\auto_exe\yuanshen\photo\email.png',
                    massage='click click in(打开主页后,点击调整时间)')
    # 调整时间
def run(mihoyo_path=''):
    # 打开米哈游程序
    # if r'\Genshin Impact\launcher.exe' not in mihoyo_path:
    #     print("打开【米哈游】失败,请检查输入路径!")
    #     return
    #     # Application 需要指定参数
    # pywinauto.Application(backend='win32').start(cmd_line=mihoyo_path)
    # # 点击【开始游戏】
    # try_click_again(png_path=r'E:\python\auto_exe\yuanshen\photo\start_game.png', massage='click start game(进入游戏)')
    # # 点击【点击进入】
    # try_click_again(png_path=r'E:\python\auto_exe\yuanshen\photo\click_in.png', massage='click click in(点击进入)')
    # # 点击【左上角的人头】
    # main_page()
    # # 拍照
    # main_page_photo()
    # 点击【左上角的人头】
    main_page()
    # 点击公告
    main_page_email()
if __name__ == '__main__':
    run(mihoyo_path=r'D:\yuanshen\Genshin Impact\launcher.exe')
当前程序涉及的库
import time # 用于延迟处理,由于网络波动页面加载需要一定的时间,可用延迟加载的处理方式
import keyboard # 用于原神当中打开页面使用,像Esc可以从主界面进入到个人主页,Enter可以实现拍照 Ctrl+H 实现拍照全屏
import lackey # 实现按钮锁定,根据截图在屏幕中锁定位置,之后可以进行点击
import pywinauto # 实现自动化打开exe程序
from PIL import ImageGrab # 实现屏幕截图,有时候你锁定不到你的截图,可以在报错的时候截图,查看当时锁定时刻的屏幕是什么样的,用于排查问题。
# 程序已上传到百度云,csdn资源无法上传。
# 程序不可直接使用,需要修改原神exe的加载位置
# 为什么不把程序打包成exe让别人直接用呢
  这种风险很大,你并不知道我exe程序中到底写的程序是怎么样的,万一是个后台进程记录你的个人隐私,
  在通过网络传输给我呢,所以一般没有经过认证的exe不要直接使用。
# 所以自己可以打包 然后自己使用。
                    鼠标键盘完全自动化,所以鼠标轨迹都是直线的,显得很僵硬。当前程序涉及的库import time # 用于延迟处理,由于网络波动页面加载需要一定的时间,可用延迟加载的处理方式import keyboard # 用于原神当中打开页面使用,像Esc可以从主界面进入到个人主页,Enter可以实现拍照# Ctrl+H 实现拍照全屏import lackey # 实现按钮锁定,根据截图在屏幕中锁定位置,之后可以进行点击import pywinauto # 实现自动化打开exe程序
lackey.Screen() 入参:int类型0表示主监视器,屏幕1
lackey.Pattern() 入参: image 要匹配的图片
lackey.click()  lackyy.wait 入参 lackey.Pattern 当然可以直接入参image ,但是不建议这么做!
    def test_023(self):
        # 选择屏幕,0是主监视器
        r = lackey.Screen(0)
        # 等待账号输入框、出现后点击
Lackey是Sikuli脚本的Python实现,允许您使用纯Python运行在Sikuli编辑器中开发的自动化脚本。 如果您试图在不依赖Java的环境中运行Sikuli脚本或将它们集成到现有的Python测试结构中,那么这是适合您的。
安装简单:
 pip install Lackey
 然后,您可以将Lackey导入Sikuli-script python文件的头部:
 from lackey import *
 警告请注意,这将创建将覆盖某些Python函数(例如type()全局方法。 有关更多信息,请参见下面的“ Sikuli修补”部分。
安装Tesseract OCR
 OCR功能取决于第三方实用程序Tesseract OCR(v3.05 +)。 您适用于您平台
				
python+pywinauto+lackey实现PC端exe自动化欢迎阅读框架介绍环境搭建Tim自动化完整代码写在最后 最近一年多一直在从事PC端exe的测试,也是趁着闲余时间,调研了下exe的自动化。 核心框架为python+pywinauto+lackey这样的一个组合方式 本文以大家熟知的Tim为例子,实现打开exe,输入账号密码并且登录,搜索具体聊天对象,发送消息,并退出账号的一系列简单操作。 依然是从环境搭建开始,我会尽我所能,详细的去介绍每一步,让各位能看懂我每一步操作的目的和理由。
一、pyautogui模块简要说明 ## 使用 pyautogui 模块相关函数,可以模拟鼠标及键盘操作, 完整说明文档见: http://pyautogui.readthedocs.org/ # pip install pyautogui # 要注意的是,模拟移动鼠标与击键可能太快,导致其他程序跟不上,并且程序可能失去控制, # 需要掌握如何从问题中恢复,至少要能中止它。 # 防止或恢复GUI自动化问题 # 1) 使用pyautogui.PAUSE设置每个PyAutoGUI函数调 app.UntitledNotepad.menu_select("File->SaveAs") app.SaveAs.ComboBox5.select("UTF-8") app.SaveAs.edit1.set_te Cannot run program “D:\jdk8\bin\java.exe“ (in directory “C:\Users\Administrator\AppData\Local\JetBra Cannot run program “D:\jdk8\bin\java.exe“ (in directory “C:\Users\Administrator\AppData\Local\JetBra acid_zch: 谢谢博主!!!我刚刚整理了一下文件也遇到了这个问题,按照您这个方案之后解决了,非常感谢!!!