Python pywin32 整理 && 阴阳师自动化

Python pywin32 整理 && 阴阳师自动化

  • 前言
  • 利用pywin32封装的一些常用功能(干货)
      • 1. 获取当前坐标
      • 2. 移动鼠标至指定坐标位
      • 3. 鼠标左键单击
      • 4. 获取所有的窗口句柄
      • 5. 获取指定窗口的大小
      • 6. 设置指定窗口的大小
      • 7. 根据应用窗口名找到窗口控件编号(单个)
      • 8. 根据应用窗口名找到窗口控件编号(多个)
      • 9. 获取所有窗口的标题名
  • 关于阴阳师自动化的一些思路
      • 环境配置
      • 1.自动启动阴阳师
      • 2.设置窗口位置及大小
      • 3.登陆账号
      • 4.执行程序
  • windows下开机启动脚本

前言

本人是最近再一次入坑阴阳师,起初只是想进游戏看看变化并不打算玩,毕竟想想当年肝的日子真的是让人望而却步。不过正巧在工作上学习了Python,就突发奇想如果能用脚本来刷岂不美滋滋?
事实证明,有了脚本解放双手不要太爽~

脚本是通过pywin32实现的,通过pywin32来对阴阳师官方PC客户端进行一些简单操作是没有风险的,几个月的实践也证明了这一点
在这里就把自己的一些整理分享给大家

如有大佬有更好的方法,欢迎指教

利用pywin32封装的一些常用功能(干货)

使用这三个模块 win32api, win32con, win32gui 以及from ctypes import windll

import win32api
import win32con
import win32gui
from ctypes import windll
from time import sleep

下面就贴上一些我常用的功能
注:贴上的都是简单封装的函数作为示例,可以直接拿去用,也可以自己重新优化,主要是整理在一次供参考,给出一些思路。

1. 获取当前坐标

   def get_point():
       point = win32api.GetCursorPos()
       return point

2. 移动鼠标至指定坐标位

	def mouse_move(x, y):
	    windll.user32.SetCursorPos(x, y)

3. 鼠标左键单击

这里需要注意的是,下面最后两行是鼠标的按下和弹起,需要点击某个坐标的话可以配合用2中的移动鼠标来实现点击

    def mouse_click(self, x=None, y=None):
        if not x is None and not y is None:
            self.mouse_move(x, y)
            sleep(0.05)
        win32api.mouse_event(win32con.MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0)
        win32api.mouse_event(win32con.MOUSEEVENTF_LEFTUP, 0, 0, 0, 0)

4. 获取所有的窗口句柄

    def get_window_handlers():
        handlers = []
        win32gui.EnumWindows(lambda handler, param: param.append(handler), handlers)
        return handlers

5. 获取指定窗口的大小

入参是指定窗口句柄

    def get_window_size(handler):
        location_size = win32gui.GetWindowRect(handler)
        return location_size

6. 设置指定窗口的大小

第一个参数是指定窗口句柄, 后四个是坐标位置
分别是起点x,起点y,终点x,终点y
例如0,0,800,600就是在屏幕左上角开始设置宽800,高600的窗口

    def set_window(handler, start_x, start_y, size_x, size_y):
        win32gui.SetWindowPos(handler, win32con.HWND_TOPMOST, start_x, start_y, size_x, size_y, win32con.SWP_SHOWWINDOW)

7. 根据应用窗口名找到窗口控件编号(单个)

注:用win32gui的FindWindow方法查找有一个缺点,就是当有重名的窗口时只会找到一个

    def find_window_by_title(title):
        window_found = win32gui.FindWindow(None, title)
        return window_found

8. 根据应用窗口名找到窗口控件编号(多个)

由于win32gui的FindWindow方法的缺点,自己封装一个查找指定名称窗口们的方法

    def find_windows_by_title(self, title):
        windows = []
        handlers = self.get_window_handlers()
        for handler in handlers:
            if win32gui.GetWindowText(handler) == title:
                windows.append(handler)
        return windows

9. 获取所有窗口的标题名

这个方法我用于确认是否成功双开阴阳师
入参是所有的handler,可以结合第4点来实现

    def get_window_title_all(handlers):
        titles = []
        for handler in handlers:
            title = win32gui.GetWindowText(handler)
            titles.append(title)
        return titles

关于阴阳师自动化的一些思路

环境配置

  1. Python 3.7
  2. 安装pywin32包 - pip install pywin32 ,其余使用到的模块都自带
  3. 阴阳师客户端:官方PC客户端,或者安卓模拟器上装阴阳师均可

1.自动启动阴阳师

Windows下可以利用dos命令行启动游戏

start "随便设个名字" "\\阴阳师安装的路径\\Onmyoji\\Launch.exe"

利用subprocess.Popen执行以上命令,注意要设置shell=True,在windows上shell即dos

cmd = 'start "随便设个名字" "\\阴阳师安装的路径\\Onmyoji\\Launch.exe"'
subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=True)

注:反复同时执行两遍上述命令有概率做到双开,可以写个循环实现,这就是为什么我封装了上面pywin32第9个方法的原因。

2.设置窗口位置及大小

  1. 根据窗口名找到窗口,得到窗口句柄
    阴阳师的官方应用窗口名为”阴阳师-网易游戏“, 如果是用模拟器就是模拟器窗口的名字
  2. 设置窗口位置及大小

3.登陆账号

  1. 简单的方式
    客户端上保存了账号信息,所以简单的登陆方法就是获取每个登陆所需点击的按钮的坐标,然后模拟按照顺序点击,注意要调节好速度(sleep控制)
    对于账号固定的情况,这种方式完全够用了
    假如是双开俩号,客户端保存了两个账号信息,其中一个客户端登陆时执行切换账号操作就行了。如果是更多的账号,只要理清了登陆逻辑一样可以实现。
  2. 精准且灵活的方式
    暂未研究,待更新…

4.执行程序

登陆完成之后就是开始各种刷刷刷了
对于实现刷各种副本,大部分的副本活动只要摸清了操作流程,转化成点点点,加个循环就能实现了。
对于一项副本可以分为几个步骤:

  1. 从主界面跳转到相应副本的位置
  2. 启动进入副本
  3. 循环执行
  4. 循环结束后跳转回主界面

对于某些动态变化的事,比如刷狗粮就需要花更多的心思了,可以利用截图+图像识别去匹配移动的怪物,获取坐标后点击。

之后有空会更新一下这种实现。

windows下开机启动脚本

弃坑了弃坑了
补上一段,批处理开机启动方法
win10下文件夹,C:\ProgramData\Microsoft\Windows\Start Menu\Programs\StartUp
脚本放在这个文件夹里开机会自动运行, 非win10的路径会不一样,网上搜一下就有。

因为逐渐的开始弃坑,后来启动频率是每天启动一次, 用一个文本保存上一次执行的日期来控制

下面第一行是关闭显示,开启延迟变量
for循环读取上次执行的日期信息
和当前日期比对,不同就执行脚本
每次比对完都更新当前日期到文本中

如果需要每天定不同时段跑的,也可以根据文本记录时间的方式实现

@echo off & setlocal enabledelayedexpansion
for /f "delims=" %%a in (date.txt) do (
      set last_date=%%a
      echo last date: !last_date!
    )
echo current date: %date%
set/p=%date% date.txt
if "%date%" EQU "!last_date!" (echo Skip auto_yys.bat) else (echo Start auto_yys.bat)
if "%date%" NEQ "!last_date!" (start python "F:\study\bandwagon\repository\yys\auto_startup.py")

你可能感兴趣的:(python)