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 RegDmimport timeimport sysimport osdm = 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:breakdm.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]breakdm.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]breakdm.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] + 5dfp_y = dfp1[2] + 5dm.moveto(dfp_x, dfp_y)dm.leftclick()breakif 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] + 5dfp_y = dfp[2] + 5breaktime.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)# breakdfp = dm.FindPic(1279, 291, 1642, 695, '大量包装专用绳子.bmp', '000000', 0.9, 0)print(dfp)dfp_x = dfp[1] + 5dfp_y = dfp[2] + 5dm.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] + 5dfp_y = dfp[2] + 5dm.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("执行完毕")
