1 大漠软件
- 大漠文件下载:百度网盘)
- 关闭安全中心:安全中心 -> 病毒和威胁防护 -> 防病毒选项 -> 定期扫描关
- 购买大漠账户:淘宝;或官网购买;
- 解释器选择:只能使用 Python 3.8 解释器。选错了解释器?见如何切换 Python 解释器版本
- 调用库:
- 解释器中安装:文件 | 设置 | 项目:pythonProect | Python 解释器 |
| PyGameAuto | 安装软件
- 命令安装:在 终端 | 本地 中输入:
pip install PyGameAuto -i https://pypi.tuna.tsinghua.edu.cn/simple/
- 解释器中安装:文件 | 设置 | 项目:pythonProect | Python 解释器 |
1. 必须安装包
Python 之 pip安装 及 使用详解_ZC·Shou的博客-CSDN博客_pip
2 PyGameAuto模块
2.1 准备工作
2.1.1 提取包
# ----------------------- <提取模块函数> ----------------------- #
from PyGameAuto.Dm import RegDm
2.1.2 大漠对象
# ----------------------- <注册大漠对象> ----------------------- #
dm = RegDm.reg()
dm.reg("注册码", "附加码")
# ----------------------- <创建大漠对象> ----------------------- #
RegDm.CreateObj()
dm = RegDm.reg()
ret = dm.reg("注册码", "附加码")
if ret == 1:
print("注册成功")
else:
print("注册失败")
# 返回值:1 成功; -1 防火墙;2 pycharm没管理员运行;4 注册码错误;6 非法使用插件
- 这里在执行
RegDm.reg()
时报过错,怎么修改也不行。这种情况通常是没有管理员权限打开IDE,或是.DLL
文件被傻掉了。后者彻底的解决方法为:- 进入
C:\Users\ASUS\AppData\Local\Programs\Python\Python38-32\Lib\site-packages
文件夹,删掉PyGameAuto
全家; - 再点击 文件 | 设置 | 项目 | 解释器 | PyGameAuto,选择“减号”删除;
- 再点击“加号”重新添加该模块;
- 进入
2.1.3 开盾
# -------------------------- <开盾> -------------------------- #
a = dm.DmGuard(1, 'f1')
DmGuard 参数 |
说明 | ||
---|---|---|---|
1 |
盾状态 | 0 |
关闭盾 |
1 |
打开盾 | ||
'f1' |
伪装模式 | f1[pid] |
把当前进程伪装成svchost.exe 进程 |
f2[pid] |
把protect_process 进程伪装成target_process 运行 |
||
b2[pid] |
保护进程不被非法访问 |
2.1.4 窗口句柄
# ------------------------ <查找句柄> ------------------------ #
denw = dm.EnumWindow(0, '黑色沙漠 - 415197', 'BlackDesertWindowClass', 1+2)
denw = int(denw) # ---------------字符转换,Bindwindow需要整数型参数
# ---------------------返回值应与大漠软件中数值一致
# ------------------------ <绑定句柄> ------------------------ #
dm_protect = 'dx.public.hide.dll\
|dx.public.anti.api\
|dx.public.graphic.protect\
|dx.public.km.protect'
dm.BindWindowEx(denw, 'gdi', 'windows', 'windows', dm_protect, 0)
# 返回值:0 失败;1 成功
# ------------------------ <激活窗口> ------------------------ #
dm.SetWindowState(denw, 1) # 0 关闭;1 激活窗口;10 禁止窗口;13 强制结束;
EnumWindow 参数 |
说明 | ||
---|---|---|---|
0 |
桌面句柄 | ||
'黑色沙漠 - 415197' |
窗口标题名 | 部分游戏可能每次更新后变化 | |
'BlackDesertWindowClass' |
窗口类名 | ||
1+2 |
匹配方式 | 1 匹配窗口标题;2 匹配窗口类名; |
|
BindWindowEx 参数 |
说明 | ||
denw |
窗口句柄 | 需要是整数型 | |
'gdi' |
|||
'windows', 'windows' |
鼠标/键盘绑定方式 | 'windows' 后台绑定;'normal' 前台绑定 |
|
dm_protect |
保护进程 | dx.public.hide.dll |
隐藏大漠的 dll 插件,容易崩溃 |
dx.public.anti.api |
|||
dx.public.graphic.protect |
保护dx涂色不被恶意检测, 对 dx.keypad.api 和dx.mouse.api 也保护 |
||
dx.public.km.protect |
保护dx键鼠不被恶意检测, 可配合 dx.public.antic.api 一起使用 |
||
0 |
绑定模式 | 0 普通模式;101 |
2.1.5 键鼠设置
# --------------------- <虚拟真实鼠标键盘> --------------------- #
dm.EnableRealMouse(2, 500, 300) # --------------模拟真实鼠标
dm.EnableRealKeypad(1) # ----------------------模拟真实键盘
# --------------------- <鼠标键盘发送方式> --------------------- #
# 鼠标和键盘默认采用异步发送方式,应改成同步
# 异步:没结束就继续使用;同步:执行完上一个才执行下一个
dm.EnableMouseSync(1, 300)
dm.EnableKeypadSync(1, 300)
# --------------------- <关闭windows消息> --------------------- #
# 使用dx键盘/鼠标时,关闭windows消息
dm.EnableMouseMsg(0)
dm.EnableKeypadMsg(0)
EnableRealMouse 参数 |
说明 | ||
---|---|---|---|
2 |
鼠标模式 | 0 关闭模拟;1 直线模拟;2 随即曲线模拟;3 小弧度曲线模拟;4 大弧度曲线模拟; |
|
500 |
点击间隔 | 单位(ms) | |
300 |
移动距离 | ||
EnableRealKeypad 参数 |
说明 | ||
1 |
键盘模式 | 0 关闭模拟;1 开启模拟; |
|
EnableMouseSync 参数/EnableKeypadSync 参数 |
说明 | ||
1 |
同步开关 | 0 关闭同步(即异步);1 开启同步; |
|
300 |
等待时间(单位:ms) | ||
EnableMouseMsg 参数/EnableKeypadMsg 参数 |
说明 | ||
1 |
消息开关 | 0 关闭;1 开启;(绑定后才能使用) |
2.2 识别语句
2.2.1 大漠找色
# long FindColor(x1, y1, x2, y2, color, sim, dir, intX, intY)
dfc = dm.FindColor(213, 154, 236, 175, 'de8f8f-050505', 0.9, 0)
if dfc[-1] == 1:
print('找到了")
else:
print('没找到')
2.2.2 大漠找图
# -------------- 设置全局路径 -------------- #
path = os.path.join(sys.path[1], '') + 'source\\img\\' # 设置文件夹路径
dm.SetPath(Path) # 设置全局路径
# 没找到会返回(-1, -1, -1)
# ------------------ 找图 ------------------ #
dfp = dm.FindPic(1281, 315, 1643, 721, '大量包装专用绳子.bmp', '000000', 0.9, 0)
# ---------------- 信息返回 ---------------- #
if dfp[0] == 0:
dfp_x = dfp[1] + 10 + random.uniform(0, 10)
dfp_y = dfp[2] + 5 + random.uniform(0, 10)
# ---------------- 执行语句 ---------------- #
dm.moveto(dfp_x, dfp_y)
2.2.3 大漠找字
使用该功能时,需要先在“大漠综合工具”进行一系列操作:
- “打开或新建字库”,选择“项目 | source | word”文件夹;
- 抓图(CTRL+1);
- 选择“提取点阵(单个)”;
- 选取文字颜色,并调整偏色‘101010’+,直到“二值化区域”中显示出完整且清晰的字;
- 点击“编辑字库”并命名。
# -------------- 设置全局路径 -------------- #
path = os.path.join(sys.path[1], '') + 'source\\word\\'
dm.SetPath(Path)
dm.SetDict(0, 'word.txt') # 设置字库
# 0为第几个文件,成功返回1;
以下三种方法都需要该全局路径为前提:
# ------------------ 找字 ------------------ #
dfsf = dm.FindStrFast(1281, 315, 1643, 721, '字', '63331d-101010', 1.0)) # 找到(11, 22, 0);没找到返回 -1;
# 63331d 为字色;101010 为颜色偏差;
# ---------------- 信息返回 ---------------- #
if dfsf[-1] == 0:
dfsf_x = dfsf[1] + 10 + random.uniform(0, 10)
dfsf_y = dfsf[2] + 5 + random.uniform(0, 10)
# ---------------- 执行语句 ---------------- #
dm.moveto(dfsf_x, dfsf_y)
# ------------------ 找字 ------------------ #
doe = dm.OcrEX(1281, 315, 1643, 721, '63331d-101010', 1.0))
# 成功则返回 文字+坐标。例如:"任务$47$185"
# ---------------- 信息返回 ---------------- #
if doe:
does = doe.split('$')
does_x = does[1] + 10 + random.uniform(0, 10)
does_y = does[2] + 5 + random.uniform(0, 10)
# ---------------- 执行语句 ---------------- #
dm.moveto(does_x, does_y)
# ----------------- 引用库 ----------------- #
# import ddddocr 该语句需要写在所有代码之前
# ------------------ 截图 ------------------ #
dm.Capture(1281, 315, 1643, 721, '字.bmp')
# ------------------ 找字 ------------------ #
ocr = ddddocr.DdddOcr()
with open(path + '字.bmo', 'rb') as f:
img = f.read()
ocrc = ocr.classification(img) # 返回文字
2.3 执行语句
2.3.1 大漠移动
dm.MoveTo(220, 170) # 移动到对应坐标,注意句柄绑定方式
2.3.2 大漠点击
dm.LeftClick() # 左键点击
dm.rightclick() # 右键点击
2.10 解绑
2.10.1 解绑退出
dm.UnBindWindow()
0 综合工具
os? time?
# !/usr/bin/env python
# -*-coding:utf-8 -*-
"""
# File : black desert.py
# Time :2022/5/9 21:35
# Author :Enilpicsid
# email : 1154046957@qq.com
# Description:
"""
from PyGameAuto.Dm import RegDm
import time
import sys
import os
dm = RegDm.reg()
dm.reg('xf30557fc317f617eead33dfc8de3bdd4ab9043', 'xfvt90mmulp5700')
denw = dm.EnumWindow(0, '黑色沙漠 - 415197', 'BlackDesertWindowClass', 1+2)
denw = int(denw)
print(denw)
dbw = dm.BindWindow(denw, 'gdi', 'normal', 'normal', 0)
# print(dbw)
# ------------------ 找图 ------------------- #
# path = os.path.join(sys.path[1], '') + 'source\\img\\'
# dm.setpath(path)
#
# dm_ret = dm.FindPic(1501, 995, 1527, 1020, '大黑精灵冒险.bmp', '050505', 0.8, 0)
# print(dm_ret)
# ------------------- 找色 ------------------- #
# ret = dm.FindColor(213, 154, 236, 175, 'de8f8f-050505', 0.9, 0)
# print(ret)
dm.MoveTo(220, 170)
dm.leftclick()
time.sleep(0.1)
# dm.keydownchar('ctrl')
# time.sleep(0.1)
dm.keypresschar('r')
time.sleep(1)
# dm.keyupchar('ctrl')
path = os.path.join(sys.path[1], '') + 'source\\img\\'
dm.setpath(path)
# 和仓库守卫对话
while 1 == 1:
dfp = dm.FindPic(800, 900, 1000, 1000, '仓库小.bmp', '000000', 0.9, 0)
time.sleep(0.1)
if dfp[0] == 0:
break
dm.keypresschar('2')
# 自动放入仓库
while 1 == 1:
dfp = dm.FindPic(1500, 700, 1700, 800, '自动放入仓库.bmp', '000000', 0.9, 0)
time.sleep(0.1)
if dfp[0] == 0:
dfp_x = dfp[1]
dfp_y = dfp[2]
break
dm.moveto(dfp_x, dfp_y)
dm.leftclick()
# 加工
while 1 == 1:
dfp = dm.FindPic(1300, 780, 1400, 810, '加工_仓库.bmp', '000000', 0.9, 0)
time.sleep(0.1)
if dfp[0] == 0:
dfp_x = dfp[1]
dfp_y = dfp[2]
break
dm.moveto(dfp_x, dfp_y)
dm.leftclick()
# 皇室加工
while 1 == 1:
dfp1 = dm.FindPic(1000, 240, 1150, 300, '皇室料理加工_灰.bmp', '000000', 0.9, 0)
dfp2 = dm.FindPic(1000, 240, 1150, 300, '皇室料理加工_亮.bmp', '000000', 0.9, 0)
time.sleep(0.1)
if dfp1[0] == 0:
dfp_x = dfp1[1] + 5
dfp_y = dfp1[2] + 5
dm.moveto(dfp_x, dfp_y)
dm.leftclick()
break
if dfp2[0] == 0:
break
# 放置材料
time.sleep(1)
while 1 == 1:
dfp = dm.FindPic(1279, 291, 1642, 695, '腌制蔬菜.bmp', '000000', 0.9, 0)
time.sleep(0.1)
if dfp[0] == 0:
dfp_x = dfp[1] + 5
dfp_y = dfp[2] + 5
break
time.sleep(0.3)
dm.moveto(dfp_x, dfp_y)
time.sleep(0.3)
dm.rightclick()
time.sleep(1)
# while 1 == 1:
# dfp = dm.FindPic(810,410,860,440, '腌制蔬菜打包台.bmp', '000000', 0.9, 0)
# time.sleep(0.1)
# if dfp[0] == 0:
# print(dfp)
# break
dfp = dm.FindPic(1279, 291, 1642, 695, '大量包装专用绳子.bmp', '000000', 0.9, 0)
print(dfp)
dfp_x = dfp[1] + 5
dfp_y = dfp[2] + 5
dm.moveto(dfp_x, dfp_y)
time.sleep(0.1)
dm.rightclick()
# 加工开始
while 1 == 1:
dfp = dm.FindPic(800, 740, 870, 780, '加工开始.bmp', '000000', 0.9, 0)
time.sleep(0.1)
if dfp[0] == 0:
dfp_x = dfp[1] + 5
dfp_y = dfp[2] + 5
dm.moveto(dfp_x, dfp_y)
dm.leftclick()
break
# time.sleep(0.1)
# dm.MoveTo(220, 170)
# time.sleep(0.1)
# dm.LeftClick()
# time.sleep(0.1)
# dm.LeftClick()
# time.sleep(0.1)
#
# dm.UnBindWindow()
# print("执行完毕")