最新Python使用键鼠模拟,DNF拍卖行

说明:

在此声明,仅作学习交流使用,对产生的任何影响,本人概不负责.
大体是实现的具体思路,完整的代码恕不免费提供.
本人也是因为喜欢打游戏dnf 最近无聊就想着自己用python编程来写点小工具,查了很多资料一步步实现了一些功能,也是自己的一种提高吧
转载请注明出处:原创地址
刷图脚本转至此处,更多源码展示
刷图脚本地址刷图脚本
更新记录
2019/11/6日,刷图脚本更新部分函数

使用的的包:

  1. import win32api, win32con, time, win32gui
  2. from ctypes import windll
  3. from PIL import Image, ImageGrab
  4. import pytesseract
  5. import cv2
  6. import tkinter as tk
  7. from tkinter import ttk
  8. from sys import exit
  9. from os import popen
  10. from numpy import load, save
  11. 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] = value
        except 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)
                    break
                if IS_RUN: 
                    IS_RUN = False
                    break
                if 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 = False
                break
            total = p.search(p.price_juanzi)
  • 18
    点赞
  • 107
    收藏
    觉得还不错? 一键收藏
  • 32
    评论
评论 32
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值