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

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

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

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

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

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

【注2】本项目代码完整,存放在我的github上面,文中只是展示了一部分代码。

项目下载地址

【注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 Noneelse: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_startis_start = Truetopx, 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=0count = 0while is_start:time.sleep(2)i=i+1print("第%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,540img_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,505img_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,550img_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,500img_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,175img_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 base64def 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次才需要点击一次继续按钮。不需要做。当然如果有兴趣的同学可以把我的这部分代码补充完整,然后就可以使用啦。

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

基于计算机视觉的梦幻西游辅助脚本(只用于开发学习技术)相关推荐

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

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

  2. AIBlockChain:“知名博主独家讲授”人工智能创新应用竞赛【精选实战作品】之《基于计算机视觉、自然语言处理、区块链和爬虫技术的智能会议系统》软件系统案例的界面简介、功能介绍分享之总篇

    AI&BlockChain:"知名博主独家讲授"人工智能创新应用竞赛[精选实战作品]之<基于计算机视觉.自然语言处理.区块链和爬虫技术的智能会议系统>软件系统案 ...

  3. AIBlockChain:“知名博主独家讲授”人工智能创新应用竞赛【精选实战作品】之《基于计算机视觉、自然语言处理、区块链和爬虫技术的智能会议系统》软件系统案例的界面简介、功能介绍分享之二、会中智能

    AI&BlockChain:"知名博主独家讲授"人工智能创新应用竞赛[精选实战作品]之<基于计算机视觉.自然语言处理.区块链和爬虫技术的智能会议系统>软件系统案 ...

  4. AIBlockChain:“知名博主独家讲授”人工智能创新应用竞赛【精选实战作品】之《基于计算机视觉、自然语言处理、区块链和爬虫技术的智能会议系统》软件系统案例的界面简介、功能介绍分享之一、会前智能

    AI&BlockChain:"知名博主独家讲授"人工智能创新应用竞赛[精选实战作品]之<基于计算机视觉.自然语言处理.区块链和爬虫技术的智能会议系统>软件系统案 ...

  5. AIBlockChain:“知名博主独家讲授”人工智能创新应用竞赛【精选实战作品】之《基于计算机视觉、自然语言处理、区块链和爬虫技术的智能会议系统》软件系统案例的界面简介、功能介绍分享之四、数据挖掘

    AI&BlockChain:"知名博主独家讲授"人工智能创新应用竞赛[精选实战作品]之<基于计算机视觉.自然语言处理.区块链和爬虫技术的智能会议系统>软件系统案 ...

  6. python使用win32后台鼠标点击梦幻西游(只用于开学习技术)新手学习

    软件准备 需要用到的软件PyCharm,梦幻西游手游客户端 需要安装的库 pip install pywin32 直接上代码吧,里面都注释好了 注意!!!!!需要登录到游戏账号后才能正确点击 原因是登 ...

  7. 基于C#的中望CAD二次开发学习笔记(1)环境测试

    目录 前言 一.ZRXSDK的安装使用 二.创建项目 三.编写环境测试代码 四.在ZWCAD中测试 参考资料 总结 前言 作为一个设计院搬砖人,和各种CAD打交道是必不可少的.当然,其中最为正统的是A ...

  8. 基于有Vue基础的微信小程序开发学习笔记

    微信小程序开发 文章目录 微信小程序开发 一.微信小程序介绍 二.小程序结构目录 1.小程序的文件结构 2.基本项目目录 三.配置文件详解 1.全局配置文件 2.页面配置文件 3.sitemap配置 ...

  9. 引用:基于C#的中望CAD二次开发学习笔记

    目录 前言 一.ZRXSDK的安装使用 二.创建项目 三.编写环境测试代码 四.在ZWCAD中测试 参考资料 总结 前言 作为一个设计院搬砖人,和各种CAD打交道是必不可少的.当然,其中最为正统的是A ...

最新文章

  1. end-to-end 的神经网络
  2. 供销大集有潜力吗_菌肥内幕被揭开!快看你买的靠谱吗?
  3. np.array_split 方法也可以分割列表list,如下
  4. python读取txt文件乱码-python文件乱码
  5. chrome下的img.onload
  6. hadoop的python框架指南_Python之——用Mrjob框架编写Hadoop MapReduce程序(基于Hadoop 2.5.2)...
  7. Windows下编程需要看哪些书
  8. Asp.NET大文件上传组件开发总结(二)---提取文件内容
  9. 【剑指offer】面试题34:二叉树中和为某一值的路径
  10. oracle窗帘位图索引,Greenplum数据库设计开发规范参考.docx
  11. jQuery使用之(二)设置元素的样式
  12. python 安卓应用层_Android应用层源码阅读笔记--Application
  13. 有限元基础及ANSYS应用 - 第10节 - 实体结构的ANSYS分析
  14. 生产排程遇难题?APS系统来解决
  15. 教务管理系统 php源码,优索教务管理系统 v9.3.2
  16. bak 安全牛 kali link
  17. 实验一 验证删除快照时VMware会改变父快照或基础磁盘
  18. 微信小程序中页面引入js文件
  19. 计算机管理声音视屏不见,电脑视频没有声音要如何解决,戳进来看看!
  20. java接口,设计一个动物声音模拟器

热门文章

  1. 【游戏】Pes2021补丁
  2. ALPS TCP新建配置——网络测试仪实操
  3. Android-四大天王
  4. Cocos2dx 3.1.1 之 加速传感器、监听物理按键
  5. flink入门3-Flink连接Kafka、Redis,实现Kafka Source/Redis Sink
  6. Python集合和字符串及练习
  7. 解决在IDEA中进行结巴分词产生Exception in thread “main“ ExceptionInInitializerError at ()错误
  8. 马上消费首份报告曝光,聚焦6大方向践行社会责任
  9. 【个推CTO谈数据智能】之数据安全计算体系
  10. MMORPG游戏的典型架构