Python pywin32 整理 && 阴阳师自动化
前言
本人是最近再一次入坑阴阳师,起初只是想进游戏看看变化并不打算玩,毕竟想想当年肝的日子真的是让人望而却步。不过正巧在工作上学习了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
关于阴阳师自动化的一些思路
环境配置
- Python 3.7
- 安装pywin32包 - pip install pywin32 ,其余使用到的模块都自带
- 阴阳师客户端:官方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.设置窗口位置及大小
- 根据窗口名找到窗口,得到窗口句柄
阴阳师的官方应用窗口名为”阴阳师-网易游戏“, 如果是用模拟器就是模拟器窗口的名字 - 设置窗口位置及大小
3.登陆账号
- 简单的方式
客户端上保存了账号信息,所以简单的登陆方法就是获取每个登陆所需点击的按钮的坐标,然后模拟按照顺序点击,注意要调节好速度(sleep控制)
对于账号固定的情况,这种方式完全够用了
假如是双开俩号,客户端保存了两个账号信息,其中一个客户端登陆时执行切换账号操作就行了。如果是更多的账号,只要理清了登陆逻辑一样可以实现。 - 精准且灵活的方式
暂未研究,待更新…
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%<nul > 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的pywin32库进行自动化操作,特别是针对阴阳师游戏。内容包括获取坐标、移动鼠标、窗口操作等,并分享了实现阴阳师自动化的思路,如自动启动游戏、设置窗口位置、登陆账号等。
1820

被折叠的 条评论
为什么被折叠?



