python 脚本梦幻西游_GitHub - U200915104/mhxy_fz: 一个基于计算机视觉开发的梦幻西游辅助脚本...
mhxy_fz
一個(gè)基于計(jì)算機(jī)視覺開發(fā)的夢(mèng)幻西游輔助腳本
(為了不讓別有用心的人用軟件牟利,雖然軟件打包好了,但僅供有興趣的人學(xué)習(xí)代碼,不提供軟件下載)
從有想法到弄出來花了兩三天,很多知識(shí)都是現(xiàn)學(xué)的,哈哈,雖然有點(diǎn)累,但是蠻開心的。
【注】本工具不為盈利,只為興趣,學(xué)以致用而已。
麻煩覺得不錯(cuò)的人點(diǎn)個(gè)star哦!
【注1】腳本或程序需要跑在管理員權(quán)限運(yùn)行才行。因?yàn)槭髽?biāo)點(diǎn)擊需要管理員權(quán)限。只截圖不需要。
【注2】本項(xiàng)目代碼完整,文中只是展示了一部分。
【注3】類似下面的資源圖片不會(huì)提供哦。
我的代碼力都有截圖保存的部分被我注釋了,想實(shí)踐的同學(xué)可以根據(jù)自己的窗口的情況先在目標(biāo)區(qū)域截圖保存作為基準(zhǔn),然后以后每次運(yùn)行都截圖來和保存的圖比較即可。
本教程分四部分:
(1)使用python 的pywin32這個(gè)庫(kù)來實(shí)現(xiàn)對(duì)Windows窗口的操作和點(diǎn)擊。
(2)使用PIL來實(shí)現(xiàn)圖像相似度的計(jì)算。
(3)使用tkinter這個(gè)庫(kù)來實(shí)現(xiàn)圖形化界面。
(4)使用pyinstaller這個(gè)庫(kù)來實(shí)現(xiàn)把源程序打包成.exe文件。
一、pywin32的主要作用
1.捕獲窗口;
def resolution(): # 獲取屏幕分辨率
return win32api.GetSystemMetrics(0), win32api.GetSystemMetrics(1)
# 獲取夢(mèng)幻西游窗口信息,返回一個(gè)矩形窗口
def get_window_info():
wdname = u'《夢(mèng)幻西游》手游'
handle = win32gui.FindWindow(0, wdname) # 獲取窗口句柄
if handle == 0:
return None
else:
return win32gui.GetWindowRect(handle)
2.模擬鼠標(biāo)鍵盤動(dòng)作;
def move_click(x, y, t=0): # 移動(dòng)鼠標(biāo)并點(diǎn)擊左鍵
win32api.SetCursorPos((x, y)) # 設(shè)置鼠標(biāo)位置(x, y)
win32api.mouse_event(win32con.MOUSEEVENTF_LEFTDOWN |
win32con.MOUSEEVENTF_LEFTUP, x, y, 0, 0) # 點(diǎn)擊鼠標(biāo)左鍵
if t == 0:
time.sleep(random.random()*2+1) # sleep一下
else:
time.sleep(t)
return 0
二、使用PIL來抓取圖像并實(shí)現(xiàn)相似度計(jì)算
#師門任務(wù)
def shimen(window_size):
global is_start
is_start = True
topx, topy = window_size[0], window_size[1]
# 使用按鈕(比如是x1,y1,x2,y2)
shiyong = Image.open("shiyong_jpg")
shiyong_hash = get_hash(shiyong)
# shiyong.show()
# print(shiyong_hash)
# 購(gòu)買寵物(比如是x1,y1,x2,y2)
goumai_cw = Image.open("goumai_cw_jpg")
goumai_cw_hash = get_hash(goumai_cw)
# 上交藥品按鈕(比如是x1,y1,x2,y2)
shangjiao_yp = Image.open("shangjiao_yp_jpg")
shangjiao_yp_hash = get_hash(shangjiao_yp)
# 上交寵物按鈕
shangjiao_cw = Image.open("shangjiao_cw_jpg")
shangjiao_cw_hash = get_hash(shangjiao_cw)
#師門任務(wù)欄
shimen = Image.open("shimen_jpg")
shimen_hash = get_hash(shimen)
# 師門任務(wù)欄
shimen_songxin = Image.open("shimen_songxin_jpg")
shimen_songxin_hash = get_hash(shimen_songxin)
# 藥店購(gòu)買
goumai_yp = Image.open("goumai_yp_jpg")
goumai_yp_hash = get_hash(goumai_yp)
# 商城購(gòu)買
goumai_sc = Image.open("goumai_sc_jpg")
goumai_sc_hash = get_hash(goumai_sc)
i=0
count = 0
while is_start:
time.sleep(2)
i=i+1
print("第%i次循環(huán)" %i)
# 使用按鈕(635 ,510 ,710 ,540)
img_shiyong = ImageGrab.grab((topx + get_posx(635, window_size), topy + get_posy(510, window_size), topx + get_posx(710, window_size), topy + get_posy(540, window_size)))
# img_shiyong.show()
# img_shiyong.save("shiyong.jpg")
# print("顯示圖片")
# print(get_hash(img_shiyong))
# print(hamming(get_hash(img_shiyong), shiyong_hash, 20))
if hamming(get_hash(img_shiyong), shiyong_hash, 20):
move_click(topx + get_posx(670, window_size), topy + get_posy(525, window_size))
print("點(diǎn)擊使用")
time.sleep(3)
continue
# 購(gòu)買寵物610,505,740,540
img_goumai_cw = ImageGrab.grab((topx + get_posx(610, window_size), topy + get_posy(505, window_size), topx + get_posx(740, window_size), topy + get_posy(540, window_size)))
# img_goumai_cw.save("goumai_cw.jpg")
if hamming(get_hash(img_goumai_cw), goumai_cw_hash, 20):
move_click(topx +get_posx(680, window_size), topy + get_posy(520, window_size))
print("點(diǎn)擊購(gòu)買寵物")
time.sleep(3)
continue
# 藥店購(gòu)買 570,470,700,505
img_goumai_yp = ImageGrab.grab((topx + get_posx(560, window_size), topy + get_posy(460, window_size), topx + get_posx(690, window_size), topy + get_posy(500, window_size)))
# img_goumai_yp.save("goumai_yp.jpg")
if hamming(get_hash(img_goumai_yp), goumai_yp_hash, 20):
move_click(topx + get_posx(620, window_size), topy + get_posy(480, window_size))
print("點(diǎn)擊購(gòu)買藥")
time.sleep(3)
continue
# 商城購(gòu)買 520,520,715,550
img_goumai_sc = ImageGrab.grab((topx + get_posx(580, window_size), topy + get_posy(515, window_size), topx + get_posx(715, window_size), topy + get_posy(550, window_size)))
# img_goumai_sc.save("goumai_sc.jpg")
if hamming(get_hash(img_goumai_sc), goumai_sc_hash, 20):
move_click(topx + get_posx(650, window_size), topy + get_posy(530, window_size))
print("點(diǎn)擊商城購(gòu)買")
time.sleep(3)
continue
# 上交藥品按鈕 600,470,700,500
img_shangjiao_yp = ImageGrab.grab((topx + get_posx(590, window_size), topy + get_posy(465, window_size), topx + get_posx(695, window_size), topy + get_posy(490, window_size)))
# img_shangjiao_yp .save("shangjiao_yp.jpg")
if hamming(get_hash(img_shangjiao_yp), shangjiao_yp_hash, 20):
move_click(topx + get_posx(640, window_size), topy + get_posy(478, window_size))
print("點(diǎn)擊藥品上交")
time.sleep(3)
continue
# 上交寵物按鈕
img_shangjiao_cw = ImageGrab.grab((topx + get_posx(500, window_size), topy + get_posy(460, window_size), topx + get_posx(600, window_size), topy + get_posy(500, window_size)))
# img_shangjiao_cw.save("shangjiao_cw.jpg")
if hamming(get_hash(img_shangjiao_cw), shangjiao_cw_hash, 20):
move_click(topx + get_posx(550, window_size), topy + get_posy(480, window_size))
print("點(diǎn)擊寵物上交")
time.sleep(3)
continue
# 師門任務(wù)按鈕
img_shimen_songxin = ImageGrab.grab((topx + get_posx(620, window_size), topy + get_posy(345, window_size), topx + get_posx(700, window_size), topy + get_posy(370, window_size)))
# img_shimen_songxin .save("shimen_songxin1.jpg")
if hamming(get_hash(img_shimen_songxin), shimen_songxin_hash, 30):
move_click(topx + get_posx(660, window_size), topy + get_posy(360, window_size))
print("點(diǎn)擊師門任務(wù)")
time.sleep(3)
continue
# # 師門任務(wù)欄 630,150,665,175
img_shimen = ImageGrab.grab((topx + get_posx(630, window_size), topy + get_posy(160, window_size), topx + get_posx(670, window_size), topy + get_posy(180, window_size)))
# img_shimen.save("shimen.jpg")
if hamming(get_hash(img_shimen), shimen_hash, 40):
move_click(topx + get_posx(650, window_size), topy + get_posy(170, window_size))
print("點(diǎn)擊師門任務(wù)欄")
time.sleep(3)
continue
具體思路就是抓取對(duì)應(yīng)位置的圖像和已經(jīng)保存的圖像進(jìn)行相似度計(jì)算,(這里使用的是計(jì)算漢明距離,值越小說明越相似。)如果出現(xiàn)相似的情況就說明事件發(fā)生,然后點(diǎn)擊按鈕。否則什么也不做。這樣就避免了傳統(tǒng)的定時(shí)定點(diǎn)點(diǎn)擊的弊端。我們的腳本可以每次都點(diǎn)擊,也可以很多次不點(diǎn)。經(jīng)測(cè)試,效果很好。就和人一樣只有在需要點(diǎn)擊的時(shí)候才會(huì)點(diǎn)擊。平時(shí)什么也不做。
三、tkinter圖像化界面
# 啟動(dòng)
if __name__ == "__main__":
screen_resolution = resolution()
# print(screen_resolution)
window_size = get_window_info()
print(window_size)
global is_start
# 創(chuàng)建主窗口
root = tk.Tk()
root.title("夢(mèng)幻西游手游輔助")
root.minsize(300, 250)
root.maxsize(300, 250)
# 創(chuàng)建按鈕
button_shimen = tk.Button(root, text=u"師門", command=lambda: MyThread(shimen, window_size), width = 15,height = 2)
button_shimen.place(relx=0.2, rely=0.15, width=200)
button_shimen.pack()
button_bangpai = tk.Button(root, text="幫派", command=lambda: MyThread(bang_pai, window_size), width = 15,height = 2)
button_bangpai.place(relx=0.2, rely=0.35, width=200)
button_bangpai.pack()
button_baotu = tk.Button(root, text="寶圖", command=lambda: MyThread(baotu,window_size), width = 15,height = 2)
button_baotu.place(relx=0.4, rely=0.55, width=200)
button_baotu.pack()
button_zhuagui = tk.Button(root, text="帶隊(duì)抓鬼", command=lambda: MyThread(zhua_gui, window_size), width = 15,height = 2)
button_zhuagui.place(relx=0.4, rely=0.65, width=100)
button_zhuagui.pack()
button_tingzhi = tk.Button(root,text=u"停止", command=lambda: MyThread(stop), width = 15,height = 2)
button_tingzhi.place(relx=0.4, rely=0.85, width=200)
button_tingzhi.pack()
root.mainloop()
結(jié)果展示:
四、pyinstaller 打包
直接使用pyinstaller打包的話,如圖片之類的資源文件并不會(huì)被打包。所以把圖片需要轉(zhuǎn)化成.py文件。在需要的地方導(dǎo)入才能使用。(當(dāng)然也有其他方法,我使用的是這個(gè))
【注】這段代碼來源于CSDN
#!/usr/bin/env python
# _*_ coding:utf-8 _*_
import base64
def pic2py(picture_names, py_name):
"""
將圖像文件轉(zhuǎn)換為py文件
:param picture_name:
:return:
"""
write_data = []
for picture_name in picture_names:
filename = picture_name.replace('.', '_')
open_pic = open("%s" % picture_name, 'rb')
b64str = base64.b64encode(open_pic.read())
open_pic.close()
# 注意這邊b64str一定要加上.decode()
write_data.append('%s = "%s"\n' % (filename, b64str.decode()))
f = open('%s.py' % py_name, 'w+')
for data in write_data:
f.write(data)
f.close()
if __name__ == '__main__':
pics = ["bangpai.jpg", "bangpai_renwu.jpg", "bangpai_renwu2.jpg", "goumai_cw.jpg","goumai_sc.jpg","goumai_yp.jpg","shangjiao_cw.jpg"
,"shangjiao_yp.jpg","shimen.jpg","shimen_songxin.jpg","shiyong.jpg","qiecuo.jpg", "qiecuo_yulin.jpg"]
pic2py(pics, 'memory_pic') # 將pics里面的圖片寫到 memory_pic.py 中
print("ok")
結(jié)果是這樣
使用:
在需要使用的地方導(dǎo)入,就可以把bangpai_jpg當(dāng)作bangpai.jpg來使用。
(不懂的同學(xué)可以百度一下或者CSDN一下base64編解碼哈。)
import base64
# 從.py文件獲取圖片
def get_pic(pic_code, pic_name):
image = open(pic_name, 'wb')
image.write(base64.b64decode(pic_code))
image.close()
# 導(dǎo)入圖片
get_pic(bangpai_jpg, 'bangpai_jpg')
get_pic(bangpai_renwu_jpg, 'bangpai_renwu_jpg')
get_pic(bangpai_renwu2_jpg, 'bangpai_renwu2_jpg')
get_pic(goumai_cw_jpg, 'goumai_cw_jpg')
get_pic(goumai_sc_jpg, 'goumai_sc_jpg')
get_pic(goumai_yp_jpg, 'goumai_yp_jpg')
get_pic(shangjiao_cw_jpg, 'shangjiao_cw_jpg')
get_pic(shangjiao_yp_jpg, 'shangjiao_yp_jpg')
get_pic(shimen_jpg, 'shimen_jpg')
get_pic(shimen_songxin_jpg, 'shimen_songxin_jpg')
get_pic(shiyong_jpg, 'shiyong_jpg')
結(jié)果展示:
打包成功!
運(yùn)行結(jié)果以及日志。
經(jīng)測(cè)試,打?qū)殘D,師門任務(wù),幫派任務(wù)全做完了,
在本電腦上測(cè)試,效果很好,所有情況都檢測(cè)到了,但是換了一臺(tái)比較舊的電腦屏幕,偶爾就會(huì)有一個(gè)按鈕檢測(cè)不出來,這時(shí)候就需要調(diào)整參數(shù)或者在本機(jī)上抓取圖片來作為基準(zhǔn)(因?yàn)槲覀兪菑钠聊唤貓D和我們保存的圖的相似度來判斷事件是否發(fā)生的,所以屏幕是有關(guān)系的比較老的屏幕一般看起來比較暗,所以偶爾檢測(cè)不出來也是正常)。
抓鬼的話沒具體做,只是把代碼寫好了沒有填具體參數(shù)所以沒有功能。因?yàn)橛X得組好隊(duì)只需要跟著別人就好了。10次才需要點(diǎn)擊一次繼續(xù)按鈕。不需要做。當(dāng)然如果有興趣的同學(xué)可以把我的這部分代碼補(bǔ)充完整,然后就可以使用啦。
【注】腳本或程序需要跑在管理員權(quán)限運(yùn)行才行。因?yàn)槭髽?biāo)點(diǎn)擊需要管理員權(quán)限。只是截圖不需要。
總結(jié)
以上是生活随笔為你收集整理的python 脚本梦幻西游_GitHub - U200915104/mhxy_fz: 一个基于计算机视觉开发的梦幻西游辅助脚本...的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: jQ 时间戳的各种转换
- 下一篇: python画圣诞树