本来嘛,说好了要写Selenium自动化搜电影的笔记的,然后正好今天上课无聊玩阴阳师开了个SSR,发现还有600体!准备怒刷之,但是又肝不动了。打算尝试用Python写个脚本来代替我自动点击(PC端,安卓模拟器)
大家放心我没写出来
写好在测试的时候,发现一到安卓模拟器就丢失焦点(也可能是点不了),对win32编程完全不熟悉,研究了2,3个小时没解决。又跟一个网易游戏的聚聚聊了会,他用C++写的用得和我一样的方法完成了。。。。。
(如果有必要我明天换C++写一下。。。)但是测试了其他游戏,如腾讯游戏大厅,炉石传说,都可以按照设定的逻辑正常点击。
我在写完上面一段话的时候突然想起来,我是不是应该把.py文件用管理员模式运行一下试试。。。。。唉 然后就成功自动刷了几次御魂。。。
把开发工具和几个常用的方法贴出来。
安卓模拟器:Bluestacks
Python版本:2.7
使用的包:
import time import win32api,win32gui,win32con from ctypes import *
在pywin32下,我们可以调用windos编程的一些函数。比如说调用MessageBox弹个窗啥的。当然我们今天主要调用的是与鼠标操作相关的函数,用python语言实现鼠操作的模拟。
1.鼠标的点击def clickLeftCur():
def clickLeftCur():
win32api.mouse_event(win32con.MOUSEEVENTF_LEFTDOWN|win32con.MOUSEEVENTF_LEFTUP, 0, 0)
第一个参数表示 按下鼠标左键后放开鼠标左键,模拟了一次左键单击,
而后面两个参数0表示关于上一次鼠标事件后的偏移量,我们暂时不用。
2.鼠标的移动
def moveCurPos(x,y): windll.user32.SetCursorPos(x, y)
顾名思义,移动鼠标。x,y表示以你当前屏幕左上角为0,0原点的坐标系的坐标单位为一像素。
3.获取鼠标当前坐标
def getCurPos(): return win32gui.GetCursorPos()
获取鼠标当前位置的坐标信息。
好,有了上诉三个函数之后,我们就可以干一下奇怪的事情了。比如把鼠标从当前位置往右移动100个像素之后点击一下鼠标。
#获取鼠标当前位置
xy=getCurPos() #向右移动100个像素
moveCurPos(xy[0]+100, xy[1]) #单击鼠标左键
clickLeftCur()
OK,到这里我们已经熟悉了简单的鼠标操作。
那我们怎么把它应用到阴阳师里面呢!!!!
比如刷觉醒:
1.我们应该在探索页面中,点击左下角的觉醒材料
2.然后选择你要刷的麒麟
3.选择层数,点击挑战
4.点击准备
5.点击任意位置获得红蛋,点击任意位置开启,再次点击任意位置回到 3
6.开始下一次 刷刷刷
这里有几个要注意的地方,我在程序里一一指出来。
既然我们要点击的区域很多,那我们就得记录很多的坐标,所以我用了一个函数来检测当前句柄和鼠标的位置。
def getPos(): while True: time.sleep(0.2) getCurPos() pos=getCurPos() s=getWinHandle(pos) print s ,pos
这个函数会一直输出你鼠标所在的位置信息和鼠标焦点所在的窗口句柄,通过记录这些数据,我们可以告诉程序接下里需要移动和点击的轨迹。
准备完成之后,我们就开始刷刷刷!
#跳转到指定句柄的窗口
win32gui.SetForegroundWindow(4720694) time.sleep(1)
这里就要用到我们刚才使用的getPos()函数获得的信息了,每次的窗口句柄都是不同的。首先我们先将焦点转到到阴阳师游戏窗口。
#移动到左下角 觉醒材料 点击
moveCurPos(420,845) clickLeftCur() time.sleep(2)
因为在庭院中的移动会影响探索灯笼的位置,所以假设我们已经在探索页面。点击左下角的觉醒材料页面,等待2秒来响应。
#点击风麒麟
moveCurPos(976,467) clickLeftCur() time.sleep(2)
风麒麟最好点,我们先点风麒麟,其他的麒麟根据固定的位置应有不同的点击方式
#移动到挑战 点击
moveCurPos(1417,716) clickLeftCur() time.sleep(10)
由于阴阳师会记录你上一次挑战的层数,所以我这里就不选层了。由于这里要点击动画,我选择等待10秒。
#点击准备
moveCurPos(1665, 714) clickLeftCur() time.sleep(2)
点击准备后开始战斗。
#等待战斗结束
time.sleep(45)
这里是最不好估计的,我觉得你应该多尝试几次固定层数的时间,然后取平均值,并适当的延长一段时间。我这里为了测试方便,选择的是四层。
#任意点击屏幕3次
clickLeftCur() time.sleep(2) clickLeftCur() time.sleep(2) clickLeftCur() time.sleep(3)
结束后单击三次任意位置,就能开启宝箱并退出当前战斗。
前面的坐标啊,句柄啊,都是我临时获得的,我只要稍微移动一下窗口就不可用了。所以,我们学习的是方法啊!!!!今天就弄了几个小时,主要是被管理员权限坑惨了!!!!!啊啊啊!!!
想一劳永逸的话也很简单,每次都固定窗口的大小(比如全屏幕),或者通过获取窗口的句柄,来或者窗口的长宽,而每个控件都是固定位置在窗口中的,这样我们只要通过控件所在位置的长宽比,就可以一次性解决这些问题。
另外刷探索副本的话由于宝箱掉落的位置不确定,所以比较难使用这个方法实现,这个方法比较适用于 觉醒材料,御魂,结界突破。并且在使用的过程中,是不能动电脑的。。。。我也想后台刷啊!改天有空了查查其他资料去!
求关注公众号 :eatPython