本來嘛,說好了要寫Selenium自動化搜電影的筆記的,然後正好今天上課無聊玩陰陽師開了個SSR,發現還有600體!準備怒刷之,但是又肝不動了。打算嘗試用Python寫個腳本來代替我自動點擊(PC端,安卓模擬器) 大家放心我沒寫出來 寫好在測試的時候,發現一到安卓模擬器就丟失焦點(也可能是點不了), ...
本來嘛,說好了要寫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