mhxy_fz

一个基于计算机视觉开发的梦幻西游辅助脚本

(为了不让别有用心的人用软件牟利,虽然软件打包好了,但仅供有兴趣的人学习代码,不提供软件下载)

从有想法到弄出来花了两三天,很多知识都是现学的,哈哈,虽然有点累,但是蛮开心的。

【注】本工具不为盈利,只为兴趣,学以致用而已。

麻烦觉得不错的人点个star哦!

【注1】脚本或程序需要跑在管理员权限运行才行。因为鼠标点击需要管理员权限。只截图不需要。

【注2】本项目代码完整,文中只是展示了一部分。

【注3】类似下面的资源图片不会提供哦。

我的代码力都有截图保存的部分被我注释了,想实践的同学可以根据自己的窗口的情况先在目标区域截图保存作为基准,然后以后每次运行都截图来和保存的图比较即可。

本教程分四部分:

(1)使用python 的pywin32这个库来实现对Windows窗口的操作和点击。

(2)使用PIL来实现图像相似度的计算。

(3)使用tkinter这个库来实现图形化界面。

(4)使用pyinstaller这个库来实现把源程序打包成.exe文件。

一、pywin32的主要作用

1.捕获窗口;

def resolution(): # 获取屏幕分辨率

return win32api.GetSystemMetrics(0), win32api.GetSystemMetrics(1)

# 获取梦幻西游窗口信息,返回一个矩形窗口

def get_window_info():

wdname = u'《梦幻西游》手游'

handle = win32gui.FindWindow(0, wdname) # 获取窗口句柄

if handle == 0:

return None

else:

return win32gui.GetWindowRect(handle)

2.模拟鼠标键盘动作;

def move_click(x, y, t=0): # 移动鼠标并点击左键

win32api.SetCursorPos((x, y)) # 设置鼠标位置(x, y)

win32api.mouse_event(win32con.MOUSEEVENTF_LEFTDOWN |

win32con.MOUSEEVENTF_LEFTUP, x, y, 0, 0) # 点击鼠标左键

if t == 0:

time.sleep(random.random()*2+1) # sleep一下

else:

time.sleep(t)

return 0

二、使用PIL来抓取图像并实现相似度计算

#师门任务

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)

# 购买宠物(比如是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)

#师门任务栏

shimen = Image.open("shimen_jpg")

shimen_hash = get_hash(shimen)

# 师门任务栏

shimen_songxin = Image.open("shimen_songxin_jpg")

shimen_songxin_hash = get_hash(shimen_songxin)

# 药店购买

goumai_yp = Image.open("goumai_yp_jpg")

goumai_yp_hash = get_hash(goumai_yp)

# 商城购买

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次循环" %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("点击使用")

time.sleep(3)

continue

# 购买宠物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("点击购买宠物")

time.sleep(3)

continue

# 药店购买 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("点击购买药")

time.sleep(3)

continue

# 商城购买 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("点击商城购买")

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("点击药品上交")

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("点击宠物上交")

time.sleep(3)

continue

# 师门任务按钮

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("点击师门任务")

time.sleep(3)

continue

# # 师门任务栏 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("点击师门任务栏")

time.sleep(3)

continue

具体思路就是抓取对应位置的图像和已经保存的图像进行相似度计算,(这里使用的是计算汉明距离,值越小说明越相似。)如果出现相似的情况就说明事件发生,然后点击按钮。否则什么也不做。这样就避免了传统的定时定点点击的弊端。我们的脚本可以每次都点击,也可以很多次不点。经测试,效果很好。就和人一样只有在需要点击的时候才会点击。平时什么也不做。

三、tkinter图像化界面

# 启动

if __name__ == "__main__":

screen_resolution = resolution()

# print(screen_resolution)

window_size = get_window_info()

print(window_size)

global is_start

# 创建主窗口

root = tk.Tk()

root.title("梦幻西游手游辅助")

root.minsize(300, 250)

root.maxsize(300, 250)

# 创建按钮

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="带队抓鬼", 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()

结果展示:

四、pyinstaller 打包

直接使用pyinstaller打包的话,如图片之类的资源文件并不会被打包。所以把图片需要转化成.py文件。在需要的地方导入才能使用。(当然也有其他方法,我使用的是这个)

【注】这段代码来源于CSDN

#!/usr/bin/env python

# _*_ coding:utf-8 _*_

import base64

def pic2py(picture_names, py_name):

"""

将图像文件转换为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")

结果是这样

使用:

在需要使用的地方导入,就可以把bangpai_jpg当作bangpai.jpg来使用。

(不懂的同学可以百度一下或者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()

# 导入图片

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')

结果展示:

打包成功!

运行结果以及日志。

经测试,打宝图,师门任务,帮派任务全做完了,

在本电脑上测试,效果很好,所有情况都检测到了,但是换了一台比较旧的电脑屏幕,偶尔就会有一个按钮检测不出来,这时候就需要调整参数或者在本机上抓取图片来作为基准(因为我们是从屏幕截图和我们保存的图的相似度来判断事件是否发生的,所以屏幕是有关系的比较老的屏幕一般看起来比较暗,所以偶尔检测不出来也是正常)。

抓鬼的话没具体做,只是把代码写好了没有填具体参数所以没有功能。因为觉得组好队只需要跟着别人就好了。10次才需要点击一次继续按钮。不需要做。当然如果有兴趣的同学可以把我的这部分代码补充完整,然后就可以使用啦。

【注】脚本或程序需要跑在管理员权限运行才行。因为鼠标点击需要管理员权限。只是截图不需要。

python梦幻西游辅助_GitHub - fanxueqian/mhxy_fz: 一个基于计算机视觉开发的梦幻西游辅助脚本...相关推荐

  1. python 脚本梦幻西游_GitHub - U200915104/mhxy_fz: 一个基于计算机视觉开发的梦幻西游辅助脚本...

    mhxy_fz 一个基于计算机视觉开发的梦幻西游辅助脚本 (为了不让别有用心的人用软件牟利,虽然软件打包好了,但仅供有兴趣的人学习代码,不提供软件下载) 从有想法到弄出来花了两三天,很多知识都是现学的 ...

  2. 一个基于 React 开发的PC端音乐App

    ?一个基于 React 开发的PC端音乐App. 同时支持 Mac 与 Windows 系统.下载地址 项目使用 electron 作为外壳,webpack 作为打包工具,核心技术包括 React + ...

  3. 一个基于Android开发的简单的音乐播放器

    一个基于Android开发的简单的音乐播放器 记得当时老师让我们写因为播放器时,脑子一头雾水,网上杂七杂八的资料也很少有用,因此索性就自己写一篇,希望对有缘人有用. 因为有好多人问我要源码,所以附上g ...

  4. 一个基于C#开发的Excel转Json工具

    Json在程序开发中是非常常用的数据格式,对于程序员来说,阅读和编辑Json都没有什么问题,但其他人就不是那么方便了.比如配置游戏数据:游戏角色.技能.道具的名称,策划书往往都是通过Excel配置,这 ...

  5. 一个基于C#开发的轻量级OCR文字识别开源工具

    在日常工作中是否经常碰到,需要从图片提取文字呢.这种情况,我们只能一个字一个字的去敲打,这样效率实在太慢了,这时候就需要用到文字识别工具. 所以今天给大家推荐一个基于C#开发的Windows OCR工 ...

  6. python云盘私有云_GitHub - 0x2642/Umi-Chest: 一个基于python的私有云实验项目

    Umi-Chest 一个基于angular 4的单页面舰娘百科App 关于项目名是因为kuma一直找不到好的名字,因为联想到海,然后我喜欢海爷,所以本来想叫海爷百宝箱什么的(一个舰娘的App你叫海爷百 ...

  7. python 端口扫描 东京_GitHub - w2n1ck/portscan: 一个基于Python+Go的端口扫描及服务探测脚本...

    portscan 一个基于Python+Go的端口扫描及服务探测脚本 0x00 前言 近期由于公司环境整改/迭代以及历史弱口令等撞库,运维同事将内网测试环境的一些SSH等敏感端口对外,导致被挖矿团伙利 ...

  8. 基于python的系统构建_搭建一个基于python的深度学习环境

    最近就要学习深度学习了,怎么能没有一个合适的开发环境呢? 那么,开始吧 系统方面我选择了Ubuntu GNOME 16.04版本,因为在Ubuntu中进行配置相对于红帽系要方便一些.毕竟谁也不想正在愉 ...

  9. 造轮子-AgileConfig一个基于.NetCore开发的轻量级配置中心

    微服务确实是行业的一个趋势,我自己也在把一些项目往微服务架构迁移.玩微服务架构配置中心是一个绕不过去的东西,有很多大牌的组件可以选,比如spring-cloud-config,apoll,discon ...

  10. 一个基于.Net开发的Windows截屏录制工具

    今天给大家推荐一个UI漂亮.功能强大的截屏录制工具. 项目简介 这是基于.Net开发的,屏幕截图.录屏的开源项目.功能非常强大,功能列表如下: 1.截图:全屏截图.滚动截图.检测窗口截图.自动截图.倒 ...

最新文章

  1. python常用变量名_python基础知识整理
  2. (转)无边框窗口实现拖垃效果
  3. 再见,CentOS!
  4. wireshark网卡权限_设置网卡属性用wireshark抓VLAN包
  5. 20191007每日一句
  6. 基于邮件推拉技术的数据库远程数据同步解决方案
  7. IAR教程之IAR安装
  8. 如何快速学习PLC编程
  9. 关于组长、队长和团长
  10. 微信小程序考勤签到管理系统+后台管理系统
  11. 今日头条小程序开发功能
  12. 狼图腾--满族为什么能以少统多
  13. 简单使用PHP 的 Silm框架.
  14. java floor(),Java floor()用法及代码示例
  15. 【阅读笔记】Cost Volume Pyramid Based Depth Inference for Multi-View Stereo
  16. python经济学函数_用python学习中级微观经济学【Slutsky Equation篇】
  17. Linux从入门到入狱-01
  18. 【OpenCV 例程300篇】208. Photoshop 对比度自动调整算法
  19. 重装VS6时,弹出Setup Was Unable to Create a DCOM User Account错误的解决方法
  20. CV-提取图像Freeman码python实现

热门文章

  1. python os创建txt文件,python创建txt文件方法详解
  2. HTML-W3school首页制作
  3. 规则引擎groovy
  4. python简单爬虫获取行政边界点坐标
  5. 东南大学计算机考研代码,东南大学代码_东南大学专业代码_2021东南大学招生代码,报考代码...
  6. MySQL嵌套查询(子查询)
  7. MySQL按照拼音排序
  8. php eof记录指针,关于ASP eof与bof 区别分析
  9. WZOI.CC基础题库答案向导
  10. Linux之tar命令