最近玩一个小程序口袋奇兵,因为这个游戏太浪费时间,加上一直在学python,用这个游戏来实战python,第一步,学会了鼠标连点。然后,发现还是要图像识别,才能提高准确率,后来又改做后台鼠标,经过了几次修改,现在能自动跟车。
ps:利用键盘停止程序运行,在直接连点的时候好使,后面更新了程序后,用键盘却不能中断程序了,这个问题在csdn上找了好多,也没能解决。
也学了好久的爬虫,效率最高的肯定是通过爬虫去直接发请求,但是网页元素遇到了canvas对象,不知道怎么查找canvas里的元素,卡在这里了,在网上找了一些自动化测试的教程,也没有找到解决的办法,希望有大神能指导指导。
附上我的原码:
import sys import time import win32gui import pymouse import pyautogui import keyboard import threading import win32api import win32con x = 0 # 锤子循环次数 y = 2000 # 黑车循环次数 z = 0 # 难民循环次数 koudai = win32gui.FindWindow(None, '口袋奇兵') print('窗口标题:%s' % (koudai)) # 通过句柄获取窗口的左、上、右、下,位置 left, top, right, bottom = win32gui.GetWindowRect(koudai) print(left, top, right, bottom) pos = (left, top) # 左上角的位置 reflash = (70, 800) # 刷新位置(以下为相对位置) team = (299, 730) # 第4队位置 fire = (250, 380) # 开火 # backto 和confirm用于错误时返回 backto = (51, 110) # 战争界面返回位置 confirm = (300, 520) confirm2 = (300, 550) def gochuizi(): for i in range(0,x): chuizi = pyautogui.locateOnScreen(image='chuizi.jpg', confidence=0.7) if chuizi == None: time.sleep(3) continue else: pos1 = (chuizi[0] - 50-pos[0], chuizi[1] + 50-pos[1]) print(pos1) long_position = win32api.MAKELONG(pos1[0],pos1[1]) win32gui.SendMessage(koudai, win32con.WM_LBUTTONDOWN, win32con.MK_LBUTTON, long_position) win32gui.SendMessage(koudai, win32con.WM_LBUTTONUP, win32con.MK_LBUTTON, long_position) time.sleep(0.1) print('锤子') go_fire() print('i'+str(i)) time.sleep(1) def goheiche(): for j in range(0,y): heiche = pyautogui.locateOnScreen(image='heiche.jpg', confidence=0.7) if heiche ==None: time.sleep(3) continue else: pos2 = (heiche[0] - 50-pos[0], heiche[1] + 50-pos[1]) print(pos2) long_position2 = win32api.MAKELONG(pos2[0], pos2[1]) win32gui.SendMessage(koudai, win32con.WM_LBUTTONDOWN, win32con.MK_LBUTTON, long_position2) win32gui.SendMessage(koudai, win32con.WM_LBUTTONUP, win32con.MK_LBUTTON, long_position2) time.sleep(0.1) print('黑车') go_fire() print('j'+str(j)) time.sleep(1) def gonanmin(): for h in range(0,z): nanmin = pyautogui.locateOnScreen(image='nanmin.png', confidence=0.7) if nanmin == None: time.sleep(3) continue else: pos3 = (nanmin[0] - 50-pos[0], nanmin[1] + 50-pos[1]) print(pos3) long_position3 = win32api.MAKELONG(pos3[0], pos3[1]) win32gui.SendMessage(koudai, win32con.WM_LBUTTONDOWN, win32con.MK_LBUTTON, long_position3) win32gui.SendMessage(koudai, win32con.WM_LBUTTONUP, win32con.MK_LBUTTON, long_position3) time.sleep(0.1) print('难民') go_fire() print('h'+str(h)) time.sleep(3) def go_fire(): # 4队 fire time.sleep(0.1) team_position = win32api.MAKELONG(team[0], team[1]) win32gui.SendMessage(koudai, win32con.WM_LBUTTONDOWN, win32con.MK_LBUTTON, team_position) win32gui.SendMessage(koudai, win32con.WM_LBUTTONUP, win32con.MK_LBUTTON, team_position) time.sleep(0.1) fire_position = win32api.MAKELONG(fire[0], fire[1]) win32gui.SendMessage(koudai, win32con.WM_LBUTTONDOWN, win32con.MK_LBUTTON, fire_position) win32gui.SendMessage(koudai, win32con.WM_LBUTTONUP, win32con.MK_LBUTTON, fire_position) time.sleep(1) print('战斗') def go_refresh(): for i in range(0,1000): reflash_position = win32api.MAKELONG(reflash[0], reflash[1]) win32gui.SendMessage(koudai, win32con.WM_LBUTTONDOWN, win32con.MK_LBUTTON, reflash_position) win32gui.SendMessage(koudai, win32con.WM_LBUTTONUP, win32con.MK_LBUTTON, reflash_position) print('reflash'+str(i)) # 出现卡战斗场面 backto_position = win32api.MAKELONG(backto[0], backto[1]) win32gui.SendMessage(koudai, win32con.WM_LBUTTONDOWN, win32con.MK_LBUTTON, backto_position) win32gui.SendMessage(koudai, win32con.WM_LBUTTONUP, win32con.MK_LBUTTON, backto_position) time.sleep(0.2) confirm_position = win32api.MAKELONG(confirm[0], confirm[1]) win32gui.SendMessage(koudai, win32con.WM_LBUTTONDOWN, win32con.MK_LBUTTON, confirm_position) win32gui.SendMessage(koudai, win32con.WM_LBUTTONUP, win32con.MK_LBUTTON, confirm_position) time.sleep(0.2) confirm_position2 = win32api.MAKELONG(confirm2[0], confirm2[1]) win32gui.SendMessage(koudai, win32con.WM_LBUTTONDOWN, win32con.MK_LBUTTON, confirm_position2) win32gui.SendMessage(koudai, win32con.WM_LBUTTONUP, win32con.MK_LBUTTON, confirm_position2) time.sleep(10) def go_quit(): while keyboard.is_pressed('ENTER'): # sys.exit() sys.quit() print('退出') if __name__ == "__main__": threads = [] t1 = threading.Thread(target=gochuizi) threads.append(t1) t2 = threading.Thread(target=goheiche) threads.append(t2) t3 = threading.Thread(target=gonanmin) threads.append(t3) t4 = threading.Thread(target=go_fire) threads.append(t4) t5 = threading.Thread(target=go_refresh) threads.append(t5) t6 = threading.Thread(target=go_quit) threads.append(t6) t1.start() t2.start() t3.start() # t4.start()不用启动,通过t1-3调用 t5.start() t6.start() if keyboard.is_pressed('ENTER'): print('退出') quit()