Python模擬滑鼠點擊——如何正確的肝陰陽師
前兩天看到這個問題 你寫過什麼有趣的程序 下面@遊俠 的答案讓我突然有點想法。是不是我也可以用最近正在學習的Python完成模擬滑鼠點擊來刷刷刷呢!
大家放心我沒寫出來
寫好在測試的時候,發現一到安卓模擬器就丟失焦點(也可能是點不了),對win32編程完全不熟悉,研究了2,3個小時沒解決。又跟@遊俠 聊了一會,他用C++寫的用得和我一樣的方法完成了。
我在寫完上面一段話的時候突然想起來,我是不是應該把.py文件用管理員模式運行一下試試。。。。。唉 然後就成功自動刷了幾次覺醒。。。
把開發工具和幾個常用的方法貼出來。
安卓模擬器:Bluestacks
Python版本:2.7
使用的包:
import timeimport win32api,win32gui,win32confrom ctypes import *
在pywin32下,我們可以調用windos編程的一些函數。比如說調用MessageBox彈個窗啥的。當然我們今天主要調用的是與滑鼠操作相關的函數,用python語言實現鼠操作的模擬。
1.滑鼠的點擊
def clickLeftCur(): win32api.mouse_event( win32con.MOUSEEVENTF_LEFTDOWN| win32con.MOUSEEVENTF_LEFTUP, 0, 0)
第一個參數表示 按下滑鼠左鍵後放開滑鼠左鍵,模擬了一次左鍵單擊,而後面兩個參數0表示關於上一次滑鼠事件後的偏移量,我們暫時不用。
2.滑鼠的移動
#移動滑鼠到x,ydef 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,到這裡我們已經熟悉了簡單的滑鼠操作。
那我們怎麼把它應用到陰陽師裡面呢!!!!
比如刷覺醒:
- 我們應該在探索頁面中,點擊左下角的覺醒材料
- 然後選擇你要刷的麒麟
- 選擇層數,點擊挑戰
- 點擊準備
- 點擊任意位置獲得紅蛋,點擊任意位置開啟,再次點擊任意位置回到 3
- 開始下一次 刷刷刷
這裡有幾個要注意的地方,我在程序里一一指出來。
既然我們要點擊的區域很多,那我們就得記錄很多的坐標,所以我用了一個函數來檢測當前句柄和滑鼠的位置。
def getPos(): global pos 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)
結束後單擊三次任意位置,就能開啟寶箱並退出當前戰鬥。
前面的坐標啊,句柄啊,都是我臨時獲得的,我只要稍微移動一下窗口就不可用了。所以,我們學習的是方法啊!!!!今天就弄了幾個小時,主要是被管理員許可權坑慘了!!!!!啊啊啊!!!
想一勞永逸的話也很簡單,每次都固定窗口的大小(比如全屏幕),或者通過獲取窗口的句柄,來或者窗口的長寬,而每個控制項都是固定位置在窗口中的,這樣我們只要通過控制項所在位置的長寬比,就可以一次性解決這些問題。
另外刷探索副本的話由於寶箱掉落的位置不確定,所以比較難使用這個方法實現,這個方法比較適用於 覺醒材料,御魂,結界突破。並且在使用的過程中,是不能動電腦的。。。。我也想後台刷啊!改天有空了查查其他資料去!
另外我在個人公眾號裡面開始慢慢記錄學習Python的筆記,現在還不完善,有一起學習的朋友可以關注我們多多交流下。
推薦閱讀:
※Matlab, R, Python關於向量化計算和for循環的速度比較?
※教你怎麼在Ubuntu 16.04上安裝Python 3以及設置本地編程環境
※【深度技術】小試牛刀:使用Python模擬登錄知乎
※如何理解Python裝飾器?
※分分鐘,殺入Kaggle TOP 5% 系列(1)