python | lackey库实践 | 匹配多张截图(原神【游戏公告】自动点击,消除小红点)

做自动化的时候,比较常见的一种场景
在这里插入图片描述
上面这个列表,我们需要鼠标去点击每个锁定标题,当然可以直接点击黄色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不要直接使用。
# 所以自己可以打包 然后自己使用。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值