Python模擬鼠標點擊——如何正確的肝陰陽師


  本來嘛,說好了要寫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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM