目录导航
- 说明:
- 使用的的包:
- 扫拍功能:
说明:
在此声明,仅作学习交流使用,对产生的任何影响,本人概不负责.
大体是实现的具体思路,完整的代码恕不免费提供.
本人也是因为喜欢打游戏dnf 最近无聊就想着自己用python编程来写点小工具,查了很多资料一步步实现了一些功能,也是自己的一种提高吧
转载请注明出处:原创地址
刷图脚本转至此处,更多源码展示
刷图脚本地址刷图脚本
更新记录
2019/11/6日,刷图脚本更新部分函数
使用的的包:
- import win32api, win32con, time, win32gui
- from ctypes import windll
- from PIL import Image, ImageGrab
- import pytesseract
- import cv2
- import tkinter as tk
- from tkinter import ttk
- from sys import exit
- from os import popen
- from numpy import load, save
- import numpy as np
扫拍功能:
1. 实现键鼠模拟
也只有能模拟了后才可以去做其他功能,dnf这个游戏做了很多屏蔽手段,很多普通方法都无法进行模拟,我这里采用的是win32api方式,比较贴近底层,可以实现驱动级的按键模拟,模拟代码网上一大片,我这里展示的是我封装完成实现我需要的一些功能
鼠标模拟封装
# 单击/左击
click_left(self, x, y):# 双击/右击click_right(self, x, y, sleep1=0.05, sleep2=0.1) #sleep 控制速度 # 拖动物品
click_move(self, click_x, click_y, x, y) # click_x, click_y 原始坐标 x, y 移动坐标
此方法可以模拟点击事件游戏内有效,采用动态坐标形式,窗口移动了位置也无所谓,
键盘模拟
# 按键模拟open_vk(self, sleep=0.02, *key) # 同上,key要模拟的键位# 移动位置模拟vk_key_run(self, vk, sleep, run_type) # vk 移动键位 , sleep 移动时间 run_type 设置停止移动的事件
2.自动输入要搜索的物品,
调用模拟按键输入就行
3.获得拍卖物品的价格
咱这里因为是脚本,所以不会读取游戏内存数据什么的,只能靠图片识别了
使用Tesseract-OCR
OCR与Tesseract介绍!
将图片翻译成文字一般被称为光学文字识别(Optical Character Recognition,OCR)。可以实现OCR 的底层库并不多,目前很多库都是使用共同的几个底层OCR 库,或者是在上面进行定制。
Tesseract 是一个OCR 库,目前由Google 赞助(Google 也是一家以OCR 和机器学习技术闻名于世的公司)。Tesseract 是目前公认最优秀、最精确的开源OCR 系统。
除了极高的精确度,Tesseract 也具有很高的灵活性。它可以通过训练识别出任何字体(只要这些字体的风格保持不变就可以),也可以识别出任何Unicode 字符。
一大通废话,主要就是使用这个识别引擎,把收集到的dnf价格图片进行训练,然后它就可以自动识别出想要的东西了,我需要的是价格,游戏图片都很统一主要就是数字比较容易识别,我这里训练一百多张后基本上识别率95以上了
训练的越多识别率越高,固定样式的图片基本上不会出错
图片识别封装,给它传入需要识别的区域坐标,就给你返回对应的识别结果,注:必须要自己训练识别库,否则无法识别
text 就是识别的内容,为str类型,如识别dnf价格结果就是27,111,000
首先要获得价格的截图,我直接截取价格区域,然后识别这个区域的数字.
截取的图片很小,识别起来速度会有保证,整个过程大概0.1秒左右,
如下训练用截图:
4.判断价格,合适就模拟鼠标购买
普通物品和卷子有所不同,以下是普通物品代码
判断价格和购买函数
5:简单写个界面
程序完成后我们总不能一直使用cmd来运行,使用界面,打包成exe后直接界面来操控
我了解过的python界面有两种1. tk 2. ttk推荐使用ttk
理由 比tk好看太多了
下面贴一点界面代码
def __init__(self, master=None):ttk.Frame.__init__(self, master)tab = ttk.Notebook(self.master, width=10)# 界面self.main = ttk.LabelFrame(tab)tab.add(self.main, text='智能副职业/扫拍')self.cailiao = ttk.Frame(tab)tab.add(self.cailiao, text='添加材料')self.juanzi = ttk.Frame(tab)tab.add(self.juanzi, text='添加卷子')tab.pack(expand=1, fill="both")self.name_dict = {}self.juanzi_dict = {}self.cailiao_dict = {}try:with open('name.txt', 'r') as f:for i in f:value, key = i.strip().split()self.name_dict[key] = valueexcept Exception as e:pass# 导入脚本self.tool = dnf_run.Tool_dnf()self.place()self.window_init()# 按钮self.bottmo_tk()# 文字和输入框self.check_tk()self.insert_juanzi() # 添加要扫的卷子self.insert_cailiao() # 添加要扫的材料
信息实时显示到界面,还有很多其他功能不贴了,主要的就这些
def info(self, text, lv=None):"""text 要显示的文本框对象"""global IS_RUN # 控制 运行和停止if lv is None:while True:time.sleep(0.5)if position_dnf.EXIT: # 控制线程运行和停止print("info线程退出%d" % position_dnf.EXIT)breakif IS_RUN: IS_RUN = Falsebreakif len(position_dnf.INFO) >= 1:data = position_dnf.INFO[0] + '\n'color = 'red'if '成功' in data:color = 'green'text.config(state='normal')text.insert('end', data, color)text.config(state='disabled')text.see('end')text.tag_config(color, foreground=color, font=(12))position_dnf.INFO.remove(position_dnf.INFO[0])if lv:data = lv + '\n'color = 'red'if '成功' in data:color = 'green'text.config(state='normal')text.delete(1.0, 'end')text.insert('end', data, color)text.config(state='disabled')text.see('end')text.tag_config(color, foreground=color, font=(12))
实现的效果
好了到这里扫拍功能全部完成,使用pyinstaller -F -w filename 打包成exe
给这个exe程序管理员权限,点击运行
副职业是最近添加的功能有空再贴代码
2019年11月6日最近稍微优化了下脚本的数据读取,采用的是numpy的数组方式(所有信息均保存为二进制),源码数量减少了很多,程序读取预设信息的速度加快,更加稳定了,简单帖点代码
def juanzi_run(self):"""扫卷子循环主体"""p = position_dnf.Price("地下城与勇士")hotkey = position_dnf.HotKey()hotkey.start()data = np.load('juanzi.npy')p.input_dnf(data)p.start_dnf(vk='b')while True:if position_dnf.EXIT:position_dnf.EXIT = Falsebreaktotal = p.search(p.price_juanzi)