1 大漠软件


  1. 大漠文件下载:百度网盘)
  2. 关闭安全中心:安全中心 -> 病毒和威胁防护 -> 防病毒选项 -> 定期扫描关
  3. 购买大漠账户:淘宝;或官网购买;

购买商品_大漠插件官网大漠插件帐号注册码大漠插件定制版购买

  1. 解释器选择:只能使用 Python 3.8 解释器。选错了解释器?见如何切换 Python 解释器版本
  2. 调用库:
    • 解释器中安装:文件 | 设置 | 项目:pythonProect | Python 解释器 | Python 大漠脚本 - 图1 | PyGameAuto | 安装软件
    • 命令安装:在 终端 | 本地 中输入:pip install PyGameAuto -i https://pypi.tuna.tsinghua.edu.cn/simple/

Python 大漠脚本 - 图2

  1. 1. 必须安装包

Python 大漠脚本 - 图3

Python 之 pip安装 及 使用详解_ZC·Shou的博客-CSDN博客_pip


2 PyGameAuto模块


2.1 准备工作

2.1.1 提取包

  1. # ----------------------- <提取模块函数> ----------------------- #
  2. from PyGameAuto.Dm import RegDm

2.1.2 大漠对象

  1. # ----------------------- <注册大漠对象> ----------------------- #
  2. dm = RegDm.reg()
  3. dm.reg("注册码", "附加码")
  4. # ----------------------- <创建大漠对象> ----------------------- #
  5. RegDm.CreateObj()
  1. dm = RegDm.reg()
  2. ret = dm.reg("注册码", "附加码")
  3. if ret == 1:
  4. print("注册成功")
  5. else:
  6. print("注册失败")
  7. # 返回值: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 开盾

  1. # -------------------------- <开盾> -------------------------- #
  2. 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 窗口句柄

  1. # ------------------------ <查找句柄> ------------------------ #
  2. denw = dm.EnumWindow(0, '黑色沙漠 - 415197', 'BlackDesertWindowClass', 1+2)
  3. denw = int(denw) # ---------------字符转换,Bindwindow需要整数型参数
  4. # ---------------------返回值应与大漠软件中数值一致
  5. # ------------------------ <绑定句柄> ------------------------ #
  6. dm_protect = 'dx.public.hide.dll\
  7. |dx.public.anti.api\
  8. |dx.public.graphic.protect\
  9. |dx.public.km.protect'
  10. dm.BindWindowEx(denw, 'gdi', 'windows', 'windows', dm_protect, 0)
  11. # 返回值:0 失败;1 成功
  12. # ------------------------ <激活窗口> ------------------------ #
  13. 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.apidx.mouse.api也保护
dx.public.km.protect 保护dx键鼠不被恶意检测,
可配合dx.public.antic.api一起使用
0 绑定模式 0普通模式;101

2.1.5 键鼠设置

  1. # --------------------- <虚拟真实鼠标键盘> --------------------- #
  2. dm.EnableRealMouse(2, 500, 300) # --------------模拟真实鼠标
  3. dm.EnableRealKeypad(1) # ----------------------模拟真实键盘
  4. # --------------------- <鼠标键盘发送方式> --------------------- #
  5. # 鼠标和键盘默认采用异步发送方式,应改成同步
  6. # 异步:没结束就继续使用;同步:执行完上一个才执行下一个
  7. dm.EnableMouseSync(1, 300)
  8. dm.EnableKeypadSync(1, 300)
  9. # --------------------- <关闭windows消息> --------------------- #
  10. # 使用dx键盘/鼠标时,关闭windows消息
  11. dm.EnableMouseMsg(0)
  12. 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 大漠找色

  1. # long FindColor(x1, y1, x2, y2, color, sim, dir, intX, intY)
  2. dfc = dm.FindColor(213, 154, 236, 175, 'de8f8f-050505', 0.9, 0)
  3. if dfc[-1] == 1:
  4. print('找到了")
  5. else:
  6. print('没找到')

2.2.2 大漠找图

  1. # -------------- 设置全局路径 -------------- #
  2. path = os.path.join(sys.path[1], '') + 'source\\img\\' # 设置文件夹路径
  3. dm.SetPath(Path) # 设置全局路径
  4. # 没找到会返回(-1, -1, -1)
  5. # ------------------ 找图 ------------------ #
  6. dfp = dm.FindPic(1281, 315, 1643, 721, '大量包装专用绳子.bmp', '000000', 0.9, 0)
  7. # ---------------- 信息返回 ---------------- #
  8. if dfp[0] == 0:
  9. dfp_x = dfp[1] + 10 + random.uniform(0, 10)
  10. dfp_y = dfp[2] + 5 + random.uniform(0, 10)
  11. # ---------------- 执行语句 ---------------- #
  12. dm.moveto(dfp_x, dfp_y)

2.2.3 大漠找字

使用该功能时,需要先在“大漠综合工具”进行一系列操作:

  1. “打开或新建字库”,选择“项目 | source | word”文件夹;
  2. 抓图(CTRL+1);
  3. 选择“提取点阵(单个)”;
  4. 选取文字颜色,并调整偏色‘101010’+,直到“二值化区域”中显示出完整且清晰的字;
  5. 点击“编辑字库”并命名。
  1. # -------------- 设置全局路径 -------------- #
  2. path = os.path.join(sys.path[1], '') + 'source\\word\\'
  3. dm.SetPath(Path)
  4. dm.SetDict(0, 'word.txt') # 设置字库
  5. # 0为第几个文件,成功返回1;

以下三种方法都需要该全局路径为前提:

  1. # ------------------ 找字 ------------------ #
  2. dfsf = dm.FindStrFast(1281, 315, 1643, 721, '字', '63331d-101010', 1.0)) # 找到(11, 22, 0);没找到返回 -1;
  3. # 63331d 为字色;101010 为颜色偏差;
  4. # ---------------- 信息返回 ---------------- #
  5. if dfsf[-1] == 0:
  6. dfsf_x = dfsf[1] + 10 + random.uniform(0, 10)
  7. dfsf_y = dfsf[2] + 5 + random.uniform(0, 10)
  8. # ---------------- 执行语句 ---------------- #
  9. dm.moveto(dfsf_x, dfsf_y)
  1. # ------------------ 找字 ------------------ #
  2. doe = dm.OcrEX(1281, 315, 1643, 721, '63331d-101010', 1.0))
  3. # 成功则返回 文字+坐标。例如:"任务$47$185"
  4. # ---------------- 信息返回 ---------------- #
  5. if doe:
  6. does = doe.split('$')
  7. does_x = does[1] + 10 + random.uniform(0, 10)
  8. does_y = does[2] + 5 + random.uniform(0, 10)
  9. # ---------------- 执行语句 ---------------- #
  10. dm.moveto(does_x, does_y)
  1. # ----------------- 引用库 ----------------- #
  2. # import ddddocr 该语句需要写在所有代码之前
  3. # ------------------ 截图 ------------------ #
  4. dm.Capture(1281, 315, 1643, 721, '字.bmp')
  5. # ------------------ 找字 ------------------ #
  6. ocr = ddddocr.DdddOcr()
  7. with open(path + '字.bmo', 'rb') as f:
  8. img = f.read()
  9. ocrc = ocr.classification(img) # 返回文字

2.3 执行语句

2.3.1 大漠移动

  1. dm.MoveTo(220, 170) # 移动到对应坐标,注意句柄绑定方式

2.3.2 大漠点击

  1. dm.LeftClick() # 左键点击
  2. dm.rightclick() # 右键点击

2.10 解绑

2.10.1 解绑退出

  1. dm.UnBindWindow()

0 综合工具

Python 大漠脚本 - 图4

os? time?

  1. # !/usr/bin/env python
  2. # -*-coding:utf-8 -*-
  3. """
  4. # File : black desert.py
  5. # Time :2022/5/9 21:35
  6. # Author :Enilpicsid
  7. # email : 1154046957@qq.com
  8. # Description:
  9. """
  10. from PyGameAuto.Dm import RegDm
  11. import time
  12. import sys
  13. import os
  14. dm = RegDm.reg()
  15. dm.reg('xf30557fc317f617eead33dfc8de3bdd4ab9043', 'xfvt90mmulp5700')
  16. denw = dm.EnumWindow(0, '黑色沙漠 - 415197', 'BlackDesertWindowClass', 1+2)
  17. denw = int(denw)
  18. print(denw)
  19. dbw = dm.BindWindow(denw, 'gdi', 'normal', 'normal', 0)
  20. # print(dbw)
  21. # ------------------ 找图 ------------------- #
  22. # path = os.path.join(sys.path[1], '') + 'source\\img\\'
  23. # dm.setpath(path)
  24. #
  25. # dm_ret = dm.FindPic(1501, 995, 1527, 1020, '大黑精灵冒险.bmp', '050505', 0.8, 0)
  26. # print(dm_ret)
  27. # ------------------- 找色 ------------------- #
  28. # ret = dm.FindColor(213, 154, 236, 175, 'de8f8f-050505', 0.9, 0)
  29. # print(ret)
  30. dm.MoveTo(220, 170)
  31. dm.leftclick()
  32. time.sleep(0.1)
  33. # dm.keydownchar('ctrl')
  34. # time.sleep(0.1)
  35. dm.keypresschar('r')
  36. time.sleep(1)
  37. # dm.keyupchar('ctrl')
  38. path = os.path.join(sys.path[1], '') + 'source\\img\\'
  39. dm.setpath(path)
  40. # 和仓库守卫对话
  41. while 1 == 1:
  42. dfp = dm.FindPic(800, 900, 1000, 1000, '仓库小.bmp', '000000', 0.9, 0)
  43. time.sleep(0.1)
  44. if dfp[0] == 0:
  45. break
  46. dm.keypresschar('2')
  47. # 自动放入仓库
  48. while 1 == 1:
  49. dfp = dm.FindPic(1500, 700, 1700, 800, '自动放入仓库.bmp', '000000', 0.9, 0)
  50. time.sleep(0.1)
  51. if dfp[0] == 0:
  52. dfp_x = dfp[1]
  53. dfp_y = dfp[2]
  54. break
  55. dm.moveto(dfp_x, dfp_y)
  56. dm.leftclick()
  57. # 加工
  58. while 1 == 1:
  59. dfp = dm.FindPic(1300, 780, 1400, 810, '加工_仓库.bmp', '000000', 0.9, 0)
  60. time.sleep(0.1)
  61. if dfp[0] == 0:
  62. dfp_x = dfp[1]
  63. dfp_y = dfp[2]
  64. break
  65. dm.moveto(dfp_x, dfp_y)
  66. dm.leftclick()
  67. # 皇室加工
  68. while 1 == 1:
  69. dfp1 = dm.FindPic(1000, 240, 1150, 300, '皇室料理加工_灰.bmp', '000000', 0.9, 0)
  70. dfp2 = dm.FindPic(1000, 240, 1150, 300, '皇室料理加工_亮.bmp', '000000', 0.9, 0)
  71. time.sleep(0.1)
  72. if dfp1[0] == 0:
  73. dfp_x = dfp1[1] + 5
  74. dfp_y = dfp1[2] + 5
  75. dm.moveto(dfp_x, dfp_y)
  76. dm.leftclick()
  77. break
  78. if dfp2[0] == 0:
  79. break
  80. # 放置材料
  81. time.sleep(1)
  82. while 1 == 1:
  83. dfp = dm.FindPic(1279, 291, 1642, 695, '腌制蔬菜.bmp', '000000', 0.9, 0)
  84. time.sleep(0.1)
  85. if dfp[0] == 0:
  86. dfp_x = dfp[1] + 5
  87. dfp_y = dfp[2] + 5
  88. break
  89. time.sleep(0.3)
  90. dm.moveto(dfp_x, dfp_y)
  91. time.sleep(0.3)
  92. dm.rightclick()
  93. time.sleep(1)
  94. # while 1 == 1:
  95. # dfp = dm.FindPic(810,410,860,440, '腌制蔬菜打包台.bmp', '000000', 0.9, 0)
  96. # time.sleep(0.1)
  97. # if dfp[0] == 0:
  98. # print(dfp)
  99. # break
  100. dfp = dm.FindPic(1279, 291, 1642, 695, '大量包装专用绳子.bmp', '000000', 0.9, 0)
  101. print(dfp)
  102. dfp_x = dfp[1] + 5
  103. dfp_y = dfp[2] + 5
  104. dm.moveto(dfp_x, dfp_y)
  105. time.sleep(0.1)
  106. dm.rightclick()
  107. # 加工开始
  108. while 1 == 1:
  109. dfp = dm.FindPic(800, 740, 870, 780, '加工开始.bmp', '000000', 0.9, 0)
  110. time.sleep(0.1)
  111. if dfp[0] == 0:
  112. dfp_x = dfp[1] + 5
  113. dfp_y = dfp[2] + 5
  114. dm.moveto(dfp_x, dfp_y)
  115. dm.leftclick()
  116. break
  117. # time.sleep(0.1)
  118. # dm.MoveTo(220, 170)
  119. # time.sleep(0.1)
  120. # dm.LeftClick()
  121. # time.sleep(0.1)
  122. # dm.LeftClick()
  123. # time.sleep(0.1)
  124. #
  125. # dm.UnBindWindow()
  126. # print("执行完毕")