本人是最近再一次入坑阴阳师,起初只是想进游戏看看变化并不打算玩,毕竟想想当年肝的日子真的是让人望而却步。不过正巧在工作上学习了Python,就突发奇想如果能用脚本来刷岂不美滋滋?
事实证明,有了脚本解放双手不要太爽~
脚本是通过pywin32实现的,通过pywin32来对阴阳师官方PC客户端进行一些简单操作是没有风险的,几个月的实践也证明了这一点
在这里就把自己的一些整理分享给大家
如有大佬有更好的方法,欢迎指教
使用这三个模块 win32api, win32con, win32gui 以及from ctypes import windll
import win32api
import win32con
import win32gui
from ctypes import windll
from time import sleep
下面就贴上一些我常用的功能
注:贴上的都是简单封装的函数作为示例,可以直接拿去用,也可以自己重新优化,主要是整理在一次供参考,给出一些思路。
def get_point():
point = win32api.GetCursorPos()
return point
def mouse_move(x, y):
windll.user32.SetCursorPos(x, y)
这里需要注意的是,下面最后两行是鼠标的按下和弹起,需要点击某个坐标的话可以配合用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)
def get_window_handlers():
handlers = []
win32gui.EnumWindows(lambda handler, param: param.append(handler), handlers)
return handlers
入参是指定窗口句柄
def get_window_size(handler):
location_size = win32gui.GetWindowRect(handler)
return location_size
第一个参数是指定窗口句柄, 后四个是坐标位置
分别是起点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)
注:用win32gui的FindWindow方法查找有一个缺点,就是当有重名的窗口时只会找到一个
def find_window_by_title(title):
window_found = win32gui.FindWindow(None, title)
return window_found
由于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
这个方法我用于确认是否成功双开阴阳师
入参是所有的handler,可以结合第4点来实现
def get_window_title_all(handlers):
titles = []
for handler in handlers:
title = win32gui.GetWindowText(handler)
titles.append(title)
return titles
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个方法的原因。
登陆完成之后就是开始各种刷刷刷了
对于实现刷各种副本,大部分的副本活动只要摸清了操作流程,转化成点点点,加个循环就能实现了。
对于一项副本可以分为几个步骤:
对于某些动态变化的事,比如刷狗粮就需要花更多的心思了,可以利用截图+图像识别去匹配移动的怪物,获取坐标后点击。
之后有空会更新一下这种实现。
弃坑了弃坑了
补上一段,批处理开机启动方法
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")