Code Monkey home page Code Monkey logo

arknightsautohelper's Introduction

icon Arknights Auto Helper

明日方舟辅助脚本

功能说明:

  • 自动重复刷图,使用理智药、碎石
    • 识别掉落物品,上传企鹅物流数据统计
  • 自动选图(从主界面开始到关卡信息界面)
  • 自动领取任务奖励
  • 公开招募识别

0x01 运行须知

二进制包(Windows)

⬇️ 从 Releases 中下载 二进制包启动器

首次运行启动器时,将从 GitHub 下载通过 Actions 打包的最新代码及运行环境,请保持网络畅通。

运行 akhelper.exe --updateakhelper-gui.exe --update 可更新到最新版本。如果最新版本存在问题,可尝试从 Actions 中下载 90 天内的旧版本覆盖 .bootstrapper 目录内的对应文件。

从源代码安装

不建议使用 GitHub 的 Download ZIP 功能下载源码包:这样做会丢失版本信息,且不便于后续更新。

请参考 wiki/从源代码安装

环境与分辨率

💡 由于游戏内文字渲染机制问题,分辨率过低可能影响识别效果,建议分辨率高度 1080 或以上。

大部分功能可以自适应分辨率(宽高比不小于 16:9,即宽度≥高度×16/9),作者测试过的分辨率有 1280x720、1440x720、1920x1080、2160x1080。

ADB 连接

请确认 adb devices 中列出了目标模拟器/设备:

$ adb devices
emulator-5554   device

如何连接 ADB 请参考各模拟器的文档、论坛等资源。

如果 adb devices 中列出了目标模拟器/设备,但脚本不能正常连接,或遇到其他问题,请尝试使用最新的 ADB 工具

常见问题

ADB server 相关
  • 部分模拟器(如 MuMu、BlueStacks)需要自行启动 ADB server。
  • 部分模拟器(如 MuMu、BlueStacks Hyper-V)不使用标准模拟器 ADB 端口,ADB server 无法自动探测,需要另行 adb connect。
  • 部分模拟器(如夜神)会频繁使用自带的旧版本 ADB 挤掉用户自行启动的新版 ADB。

可以参阅配置说明以配置自动解决以上问题。

其他
  • 部分非 VMM 模拟器(声称“不需要开启 VT”,如 MuMu 星云引擎)不提供 ADB 接口。

额外设置

关于额外设置请移步到 config/config-template.yaml 中查看

日志说明

运行日志(文本)采用import logging在log目录下生成ArknightsAutoHelper.log推荐用Excel打开,分割符号为“!”

相关配置文件在config目录下的logging.yaml,由于过于复杂 其实也没确定理解的对不对 这里请自行研究,欢迎讨论

日志目前启动按照时间自动备份功能,间隔为一天一次,保留最多7份。

图像识别日志为 log/*.html,相应识别模块初始化时会清空原有内容。

多开时日志文件名会出现实例 ID,如 ArknightsAutoHelper.1.log

报告 issue 时,建议附上日志以便定位问题。

0x02 ArknightsHelper GUI 启动

💡 Windows:如果您按照 wiki/从源代码安装 配置了 venv,则可以通过双击 启动GUI.bat 调用。

$ python3 akhelper-gui.pyw

Web GUI 将在一下第一个可用的浏览器环境中打开:

  • 内嵌浏览器
  • Google Chrome、Chromium、Microsoft Edge 的 PWA 模式*
  • 系统默认浏览器*

* 使用外部浏览器时,HTTP 服务器将在最后一个连接关闭后 3 分钟内退出。

0x03 ArknightsHelper 命令行启动

💡 Windows:命令行功能在 Windows 10 1607 (build 14393) 及以上版本上体验最佳。非简体中文系统可能无法在 Windows 命令行窗口中正确显示简体中文文字,可尝试使用 Windows Terminal。

命令行启动说明

💡 Windows:如果您按照 wiki/从源代码安装 配置了 venv,则可以通过双击 整合工具箱(新).bat 调用。

$ python3 akhelper.py
usage: akhelper.py command [command args]
    connect [connector type] [connector args ...]
        连接到设备
        支持的设备类型:
        connect adb [serial or tcpip endpoint]
    quick [+-rR[N]] [n]
        重复挑战当前画面关卡特定次数或直到理智不足
        +r/-r 是否自动回复理智,最多回复 N 次
        +R/-R 是否使用源石回复理智(需要同时开启 +r)
    auto [+-rR[N]] TARGET_DESC [TARGET_DESC]...
        按顺序挑战指定关卡。
        TARGET_DESC 可以是:
            1-7 10      特定主线、活动关卡(1-7)10 次
            grass       一键长草: 检查库存中最少的蓝材料, 然后去 aog 上推荐的地图刷材料
            plan        执行刷图计划: 使用 arkplanner 命令创建刷图计划。执行过程会自动更新计划进度。
    recruit [tags ...]
        公开招募识别/计算,不指定标签则从截图中识别
    collect
        收集每日任务和每周任务奖励
    record
        操作记录模块,使用 record --help 查看帮助。
    riic <subcommand>
        基建功能(开发中)
        riic collect
        收取制造站及贸易站
        riic shift <room> <operator1> <operator2> ...
        指定干员换班
        room: B101 B102 B103 B201 B202 B203 B301 B302 B303 dorm1 dorm2 dorm3 dorm4 meeting workshop office
    arkplanner
        输入材料需求创建刷图计划。使用 auto plan 命令执行刷图计划。

命令可使用前缀(首字母)缩写(类似 Linux iproute2),交互模式下只需输入对应命令名称即可,如:

$ python3 akhelper.py q 5

$ python3 akhelper.py i
akhelper> q 5
    ...
akhelper> c

简略战斗模块

快速启动模块需要手动选关。到如下画面,活动关卡你也可以这么刷。

* 该模块可以自适应分辨率

TIM截图20190513101009.png-1013.8kB

python3 akhelper.py quick 99
# 重复刷当前画面关卡 99 次,也可以不指定次数
python3 akhelper.py quick -r
# 重复刷当前画面关卡,禁用自动回复理智(直到理智不足停止)
python3 akhelper.py quick +r5
# 重复刷当前画面关卡,启用自动回复理智,最多回复 5 次
python3 akhelper.py quick +rR 99
# 重复刷当前画面关卡 99 次,启用自动回复理智,启用碎石回复理智

注意

  • 该模块会识别当前理智和关卡理智消耗,理智不足时会自动停止或补充理智(需在配置中启用)
  • 理论上该模块比完整的模块稳定并且不容易被系统检测。并且该模块所有的点击序列都是随机化的,不容易被检测

主战斗模块

  1. 主战斗模块可以从几乎任何位置(理论上有返回键的页面)开始任务序列。

* 该模块支持主线章节大部分关卡。

python3 akhelper.py auto   5-1 2   5-2 3
# 按顺序刷 5-1 关卡 2 次,5-2 关卡 3 次

通过输入所需材料数量创建刷图计划并执行

arkplanner 命令可以通过企鹅物流的接口, 根据输入的材料创建刷图计划 (支持自动获取当前库存):

# 缓存将在第一次启动脚本时创建, 如果没有新的地图或材料, 这个缓存没必要更新.
是否刷新企鹅物流缓存(缓存时间: ....)[y/N]:
材料列表:
序号: 0, 材料等级: 3, 名称: 赤金
序号: 1, 材料等级: 3, 名称: 提纯源岩
...
...
# 需要 10 个提纯源岩
材料序号/需求数量(输入为空时结束):1/10
材料序号/需求数量(输入为空时结束):

# 默认 n, 输入 y 将自动读取游戏中的库存, 并加入到刷图计划的计算中
是否获取当前库存材料数量(y,N):y

刷图计划:
关卡 [...] 次数 2
...
预计消耗理智: ...
刷图计划已保存至: config/plan.json

auto plan 文件将从上一步生成的 config/plan.json 获取并执行刷图计划.

如果当前的理智不足以完成刷图计划, 将保存已经刷图的次数, 并在下次运行时恢复.

如果完成刷图计划后, 当前的理智可能还有剩余,可以使用其他命令消耗剩余理智(如使用脚本连续运行命令)。

0x04 ArknightsHelper 自定义脚本启动

请参考 scripting_example.pyi 编写自定义脚本。

0x05 已知问题

  • 自动选关功能:点击随机偏移范围大小固定,且与分辨率无关
  • 某些情况下,物品、数量识别会出错

0x06 自定义开发与TODO

如果您已经有一定的 Python 基础,可以通过 wiki 中的开发文档快速上手。

关于一些常见的问题

1. 分辨率/模拟器/路径问题

环境与分辨率

2. 我想跑一些别的关卡,但是提示我关卡不支持。

这些关卡可以通过 quick 命令来启动。

3. OCR 模块可以不装嚒?

最好安装,在之后的版本迭代中会对没有OCR依赖的用户越来越不友好不可以。

4. 我不会python|我电脑里没装Python,我能用这个嚒?

可以使用二进制包

5. 之后会收费么?

不会,该项目一直开源。实际上作者还有别的事情要做,代码可能突然会有一段时间不更新了。欢迎来pull代码以及加群

6. 关于mumu模拟器的adb在哪里的问题【目前已经解决】

常见问题

7. 我想将这个脚本适配到其他服务器

Porting to Another Server

自定义开发与更多功能

详情请联系作者或者提出你的issue!祝大家玩的愉快

欢迎来加开发者QQ 2454225341 或加入QQ群 757689154 Telegram 群(有简单防爬虫验证)

arknightsautohelper's People

Contributors

alaricgilbert avatar artoria2e5 avatar at404bot avatar cubesugarcheese avatar dantmnf avatar dependabot[bot] avatar felinae98 avatar heartyyf avatar jeffersonqin avatar klarkxy avatar konano avatar koowz avatar l0snight avatar littlenightmare avatar moon-404 avatar mraru avatar neight99 avatar ninthdevilhaunster avatar prurite avatar ryuujo1573 avatar t2hhbmek avatar tkkcc avatar tr4cer0 avatar triwinds avatar xsun2001 avatar yuanyan3060 avatar yun-shan avatar zhangchi0104 avatar zhaozuohong avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

arknightsautohelper's Issues

base.py检查ocr的部分好像不太对劲

在__is_ocr_active中,这个尝试识别后结果保存在 SCREEN_SHOOT_SAVE_PATH

os.popen( "tesseract {} {}".format( STORAGE_PATH + "OCR_TEST_1.png", SCREEN_SHOOT_SAVE_PATH + "1" ) )

但是接下来检测时,并没有从SCREEN_SHOOT_SAVE_PATH读文件,而是读取了STORAGE_PATH 的文件
open(STORAGE_PATH + "ocr_test.txt", 'r', encoding="utf8")

PS:第一次用ocr我是不是安装姿势不正确,自己手动尝试识别失败

从首页进入OF-8有问题

程序不会点击OF-8这个关卡
另:同学问该程序会不会封号(我觉得是不会的但我来确认下)

截图的问题

当理智超过100后,截图缺一部分,在我的ocr中,会变得无法识别
strength
之前我更改了有关ocr的命令,因为默认函数无法识别我的截图
tesseract {} {} --psm 7
可能是我的版本问题,推荐版本我安装失败,安装了4.0版本。

baidu ocr 其妙的识别错误

在红豆背景的界面下,百度ocr只能识别出“动结束”

我打算改成识别“结束”,也许能暂时解决问题,但.......长期这样不知道行不行

文件没穿上来.....
文件在下图

ValueError: invalid literal for int() with base 10: ''

2019-09-21 09:18:31,548 ! INFO ! base ! module_battle_slim ! 178 ! 检查关卡界面
Traceback (most recent call last):
  File "E:/GitHub/ArknightsAutoHelper/start.py", line 12, in <module>
    Ark.main_handler(clear_tasks=True, task_list=TASK_LIST)
  File "E:\GitHub\ArknightsAutoHelper\Arknights\base.py", line 422, in main_handler
    flag = self.module_battle(c_id, count)
  File "E:\GitHub\ArknightsAutoHelper\Arknights\base.py", line 403, in module_battle
    self_fix=self.ocr_active)
  File "E:\GitHub\ArknightsAutoHelper\Arknights\base.py", line 180, in module_battle_slim
    recoresult = imgreco.before_operation.recognize(screenshot)
  File "E:\GitHub\ArknightsAutoHelper\imgreco\before_operation.py", line 61, in recognize
    'consume': int(consumetext)
ValueError: invalid literal for int() with base 10: ''

Process finished with exit code 1

先写个issue等我学完物理和critical thinking再查

后续计划

  • 按比例确定截图/点击位置,同时支持更多的宽高比(UI 元素大小主要与高度有关,水平对齐方式基本上是整块靠左中右)
  • (80%) 进行特定字体/特定字符特化的识别,目前的通用 OCR 仅作为备用
  • 基于图像识别(模板匹配)的关卡选择(有 prototype,主要是缺各个关卡的定位数据和截图)
  • (90%) 物品(掉落)识别
  • 公开招募识别

自动1-11

每天刷3遍1-11可以不消耗体力的刷一大堆任务,作者有空能支持下么

重构 config 接口

为了在企鹅数据网站上查询统计结果,调用企鹅数据 API 时需要提供 user id,如果没有提供,则 API 会生成并返回一个新的 user id,需要对其进行持久化存储(写入配置文件)。

同时,配置文件需要保持人类可读,最好在写入时能保留注释。

先把坑放在这

能否考虑加一个反防沉迷系统的功能

比如加一个命令行参数,用户打开后开始战斗自动断网,防止挂机时间被记入防沉迷系统。

断网这个功能在安卓模拟器的环境下应该可以用adb实现。

自适应分辨率可能的方案

(用中文算了)
虽然不玩明日方舟,但至少写过FGO的脚本。

对于16:9的界面:
我觉得可以使用OpenCV里面的cv2.resize()来把截图给调整到template image的size来进行cv2.matchTemplate(),然后根据比率返回放大后的坐标就好了。我觉得这一步可以直接在截图的步骤里解决。

实际使用的时候出的一些问题&建议

①可能会出现一个任务结束之后返回主页弹出维护公告的情况,建议加上在主页时对公告的处理。
②任何出现的不在预料中页面的情况都可以通过返回主页的形式修复……吧(刚刚它点到了招募差点把我的石头花了,幸好我石头不够),至少也不要尝试修复失败就直接当无事发生打关……

[BUG] 无法判断行动结束

在使用过程中,只能代理一次,结束受就无法判断关卡结束。如下图:
image
环境:
夜神模拟器 6.5.0.3,分辨率1280*720,开发者模式已经打开
win10

历史掉落汇总不可用

使用历史掉落汇总.bat后,物品掉落.txt里没有写入新的历史掉落信息
部分log:图片
物品掉落文档部分截图(截止当前时间`):
图片

版本:master-commit 8b136c8

baidu ocr bug 与 一些小问题

image
不应该写成未检测到文本,直接空即可,并且words_result_num没有none判断,若未识别直接判0会异常,本想创建分支提上去的,但是不会弄,尴尬。

GUI问题

C:\Users\dell\AppData\Local\Programs\Python\Python37-32\python.exe E:/GitHub/ArknightsAutoHelper/GUI_start.py E:\GitHub\ArknightsAutoHelper\GUI\Frames\Index.py:235: wxPyDeprecationWarning: Call to deprecated item. Use :meth:AddTool` instead.
wx.ITEM_NORMAL, wx.EmptyString, wx.EmptyString, None)
Traceback (most recent call last):
File "E:/GitHub/ArknightsAutoHelper/GUI_start.py", line 2, in
start_app()
File "E:\GitHub\ArknightsAutoHelper\GUI\app.py", line 110, in start_app
ArknightsAutoHelperGUI().MainLoop()
File "E:\GitHub\ArknightsAutoHelper\GUI\app.py", line 26, in init
self.backend_buffer_push()
File "E:\GitHub\ArknightsAutoHelper\GUI\app.py", line 51, in backend_buffer_push
buffer = self.ark.shell_color.get_buffer()
AttributeError: 'NoneType' object has no attribute 'shell_color'

Process finished with exit code 1
`
我是真的不知道怎么改了

已解决

任务清单功能问题

说明中提到任务清单支持click_location.LIZHI_CONSUME下关卡
其实应该是支持click_location.CLICK_LOCATION下的关卡

任务清单功能做拖动和点击后,偶尔会错过之后的点击或者拖动,可能是因为模拟器卡顿。

主战斗模块问题有点大

请大家尽量用slim模块。TASK_LIST的传入方法问题有点大。可能要考虑到大家的网速之类的问题。在我考试考完了之后会好好DEBUG的。另外我还会开发GUI的。

重要的事情说三遍。

在运行slim模块前把位置调整到正确的地方,正确的地方,正确的地方

祝大家一发抽中银老板!

  • DEBUG 主战斗模块

  • GUI 提上日程 (应该会用 wxpython)

关于mumu模拟器

mumu模拟器只要用adb connect指令连接到127.0.0.1:7555就可以用。前提是mumu模拟器必须要完整启动,希望在初始化辅助时根据路径检测一下用户的模拟器是否是mumu之后计时启动,之后再进行真正的初始化。

macOS GUI 无法运行

$ python3 GUI_start.py

Traceback (most recent call last):
  File "/Users/andychen/Documents/arkgui/GUI/app.py", line 94, in OnInit
    self.Index = Index(parent=None)
  File "/Users/andychen/Documents/arkgui/GUI/Frames/Index.py", line 294, in __init__
    wx.Font(12, wx.FONTFAMILY_DEFAULT, wx.FONTSTYLE_NORMAL, wx.FONTWEIGHT_NORMAL, False, "等线"))
wx._core.wxAssertionError: C++ assertion "IsAttached()" failed at /Users/robind/projects/buildbots/macosx-vm6/dist-osx-py37/Phoenix/ext/wxWidgets/src/osx/menu_osx.cpp(711) in Refresh(): can't refresh unatteched menubar
OnInit returned false, exiting...

待修的小 bug & 一些预想的 feature 表

如题,欢迎各位 pr。

Bug

  • clear_daily_task 函数在关闭 ocr 的情况下会用到的 TASK_COMPLETEREWARD_GET 图片缺失
  • 部分关卡和按钮的取点错误(如 1-7 ),建议整个脚本重新取点

New Feature

  • 在 battle_slim 中加入自动识别当前关卡所需理智功能,做到一键开始战斗
  • 保存每次战斗后的掉落截图,方便统计刷关情况
    • 远期目标:与企鹅物流合作
  • 整理最近的新代码,统一格式
  • 统一日志格式

截图功能

通过老方法启动后,abd正常选择了正确的模拟器,但使用中发现截图,并没有更新,好像截图失效了

ConnectionRefusedError: [WinError 10061] 由于目标计算机积极拒绝,无法连接。

Traceback (most recent call last):
  File "E:/GitHub/ArknightsAutoHelper/start.py", line 11, in <module>
    Ark = ArknightsHelper(adb_host=ADB_HOST)
  File "E:\GitHub\ArknightsAutoHelper\Arknights\base.py", line 43, in __init__
    self.adb = ADBShell(adb_host=adb_host)
  File "E:\GitHub\ArknightsAutoHelper\ADBShell.py", line 33, in __init__
    self.DEVICE_NAME = self.__adb_device_name_detector()
  File "E:\GitHub\ArknightsAutoHelper\ADBShell.py", line 39, in __adb_device_name_detector
    devices = self.host_session_factory().devices()
  File "E:\GitHub\ArknightsAutoHelper\ADBShell.py", line 32, in <lambda>
    self.host_session_factory = lambda: ADBClientSession(ADB_SERVER)
  File "E:\GitHub\ArknightsAutoHelper\ADBClientSession.py", line 43, in __init__
    sock.connect(server)
ConnectionRefusedError: [WinError 10061] 由于目标计算机积极拒绝,无法连接。

基建一键收菜

目前国服1.0版本已经实装一键收订单功能,建议改进

关于判定是否在关卡页面

可以使用OCR检测当前关卡名,这样比代理作战的图片识别更准确。不使用OCR的话就还是用代理指挥的图片吧。
PS:为什么确认当前代理指挥的时候只识别一个方框不带上字?

可以考虑使用 Windows 自带的 OCR

主要是不喜欢百度又不想装 tesseract
文档:https://docs.microsoft.com/en-us/uwp/api/windows.media.ocr
可以提供每个单词字的 bounding rect,API 返回的整行文本每个字之间都会多一个空格,demo 里做了一个根据 bounding rect 合并的,但是按照目前的用法也可以把空格全替换掉(

自己测试了一下,能识别结算画面和物品 popup,识别不了未处理过的选关画面,手上没有升级画面

WinRT Python binding 需要 Windows 10 1809 以上

因为之前也在 C++ 上做过所以顺手写了个 Python demo:
https://gist.github.com/dantmnf/23f060278585d6243ffd9b0c538beab2

结算画面的 demo 输出:

{'lines': [{'merged_text': '我做到 了 · · · · “? 我用 自 己的力',
            'merged_words': [{'bounding_rect': rect(703, 170, 95, 31), 'text': '我做到'},
                             {'bounding_rect': rect(804, 172, 27, 29), 'text': '了'},
                             {'bounding_rect': rect(836, 193, 6, 6), 'text': '·'},
                             {'bounding_rect': rect(846, 193, 6, 6), 'text': '·'},
                             {'bounding_rect': rect(856, 193, 6, 6), 'text': '·'},
                             {'bounding_rect': rect(866, 193, 6, 6), 'text': '·'},
                             {'bounding_rect': rect(876, 173, 34, 26), 'text': '“?'},
                             {'bounding_rect': rect(928, 170, 62, 31), 'text': '我用'},
                             {'bounding_rect': rect(998, 170, 24, 31), 'text': '自'},
                             {'bounding_rect': rect(1030, 170, 92, 31), 'text': '己的力'}],
            'text': '我 做 到 了 · · · · “ ? 我 用 自 己 的 力',
            'words': [{'bounding_rect': rect(703, 170, 31, 31), 'text': '我'},
                      {'bounding_rect': rect(736, 170, 31, 31), 'text': '做'},
                      {'bounding_rect': rect(770, 171, 28, 29), 'text': '到'},
                      {'bounding_rect': rect(804, 172, 27, 29), 'text': '了'},
                      {'bounding_rect': rect(836, 193, 6, 6), 'text': '·'},
                      {'bounding_rect': rect(846, 193, 6, 6), 'text': '·'},
                      {'bounding_rect': rect(856, 193, 6, 6), 'text': '·'},
                      {'bounding_rect': rect(866, 193, 6, 6), 'text': '·'},
                      {'bounding_rect': rect(876, 193, 16, 6), 'text': '“'},
                      {'bounding_rect': rect(895, 173, 15, 26), 'text': '?'},
                      {'bounding_rect': rect(928, 170, 31, 31), 'text': '我'},
                      {'bounding_rect': rect(961, 172, 29, 29), 'text': '用'},
                      {'bounding_rect': rect(998, 170, 24, 31), 'text': '自'},
                      {'bounding_rect': rect(1030, 172, 28, 28), 'text': '己'},
                      {'bounding_rect': rect(1062, 170, 28, 30), 'text': '的'},
                      {'bounding_rect': rect(1094, 170, 28, 31), 'text': '力'}]},
           {'merged_text': '量保护了大家吗?',
            'merged_words': [{'bounding_rect': rect(703, 220, 246, 31), 'text': '量保护了大家吗?'}],
            'text': '量 保 护 了 大 家 吗 ?',
            'words': [{'bounding_rect': rect(703, 221, 31, 29), 'text': '量'},
                      {'bounding_rect': rect(736, 220, 31, 31), 'text': '保'},
                      {'bounding_rect': rect(769, 220, 30, 31), 'text': '护'},
                      {'bounding_rect': rect(804, 222, 27, 29), 'text': '了'},
                      {'bounding_rect': rect(836, 220, 29, 31), 'text': '大'},
                      {'bounding_rect': rect(869, 220, 30, 31), 'text': '家'},
                      {'bounding_rect': rect(902, 222, 29, 29), 'text': '吗'},
                      {'bounding_rect': rect(934, 223, 15, 26), 'text': '?'}]},
           {'merged_text': '0 一 11',
            'merged_words': [{'bounding_rect': rect(49, 712, 56, 63), 'text': '0'},
                             {'bounding_rect': rect(115, 737, 39, 12), 'text': '一'},
                             {'bounding_rect': rect(164, 713, 72, 61), 'text': '11'}],
            'text': '0 一 11',
            'words': [{'bounding_rect': rect(49, 712, 56, 63), 'text': '0'},
                      {'bounding_rect': rect(115, 737, 39, 12), 'text': '一'},
                      {'bounding_rect': rect(164, 713, 72, 61), 'text': '11'}]},
           {'merged_text': 'OPERATION',
            'merged_words': [{'bounding_rect': rect(79, 792, 134, 19), 'text': 'OPERATION'}],
            'text': 'OPERATION',
            'words': [{'bounding_rect': rect(79, 792, 134, 19), 'text': 'OPERATION'}]},
           {'merged_text': '0',
            'merged_words': [{'bounding_rect': rect(1216, 792, 176, 176), 'text': '0'}],
            'text': '0',
            'words': [{'bounding_rect': rect(1216, 792, 176, 176), 'text': '0'}]},
           {'merged_text': '突围',
            'merged_words': [{'bounding_rect': rect(111, 814, 75, 37), 'text': '突围'}],
            'text': '突 围',
            'words': [{'bounding_rect': rect(111, 814, 36, 37), 'text': '突'},
                      {'bounding_rect': rect(152, 816, 34, 35), 'text': '围'}]},
           {'merged_text': '行动结束',
            'merged_words': [{'bounding_rect': rect(60, 878, 532, 125), 'text': '行动结束'}],
            'text': '行 动 结 束',
            'words': [{'bounding_rect': rect(60, 879, 126, 125), 'text': '行'},
                      {'bounding_rect': rect(199, 881, 121, 122), 'text': '动'},
                      {'bounding_rect': rect(331, 878, 124, 125), 'text': '结'},
                      {'bounding_rect': rect(468, 879, 124, 124), 'text': '束'}]},
           {'merged_text': 'EXP',
            'merged_words': [{'bounding_rect': rect(807, 735, 22, 9), 'text': 'EXP'}],
            'text': 'EXP',
            'words': [{'bounding_rect': rect(807, 735, 22, 9), 'text': 'EXP'}]},
           {'merged_text': '/800',
            'merged_words': [{'bounding_rect': rect(879, 725, 60, 17), 'text': '/800'}],
            'text': '/800',
            'words': [{'bounding_rect': rect(879, 725, 60, 17), 'text': '/800'}]},
           {'merged_text': '1.2倍声望&龙门币奖励',
            'merged_words': [{'bounding_rect': rect(822, 1010, 269, 25), 'text': '1.2倍声望&龙门币奖励'}],
            'text': '1.2 倍 声 望 & 龙 门 币 奖 励',
            'words': [{'bounding_rect': rect(822, 1013, 35, 21), 'text': '1.2'},
                      {'bounding_rect': rect(859, 1010, 25, 25), 'text': '倍'},
                      {'bounding_rect': rect(886, 1010, 24, 25), 'text': '声'},
                      {'bounding_rect': rect(913, 1010, 25, 25), 'text': '望'},
                      {'bounding_rect': rect(940, 1013, 18, 21), 'text': '&'},
                      {'bounding_rect': rect(959, 1010, 25, 25), 'text': '龙'},
                      {'bounding_rect': rect(987, 1010, 23, 25), 'text': '门'},
                      {'bounding_rect': rect(1014, 1011, 23, 24), 'text': '币'},
                      {'bounding_rect': rect(1040, 1010, 25, 25), 'text': '奖'},
                      {'bounding_rect': rect(1067, 1011, 24, 24), 'text': '励'}]},
           {'merged_text': '全员信赖',
            'merged_words': [{'bounding_rect': rect(1332, 718, 122, 28), 'text': '全员信赖'}],
            'text': '全 员 信 赖',
            'words': [{'bounding_rect': rect(1332, 718, 29, 28), 'text': '全'},
                      {'bounding_rect': rect(1365, 719, 26, 27), 'text': '员'},
                      {'bounding_rect': rect(1395, 718, 28, 28), 'text': '信'},
                      {'bounding_rect': rect(1426, 718, 28, 28), 'text': '赖'}]},
           {'merged_text': '常规掉落',
            'merged_words': [{'bounding_rect': rect(1259, 1010, 105, 25), 'text': '常规掉落'}],
            'text': '常 规 掉 落',
            'words': [{'bounding_rect': rect(1259, 1010, 23, 25), 'text': '常'},
                      {'bounding_rect': rect(1285, 1010, 25, 25), 'text': '规'},
                      {'bounding_rect': rect(1312, 1010, 25, 25), 'text': '掉'},
                      {'bounding_rect': rect(1339, 1010, 25, 25), 'text': '落'}]},
           {'merged_text': '额外物资',
            'merged_words': [{'bounding_rect': rect(1501, 1010, 105, 25), 'text': '额外物资'}],
            'text': '额 外 物 资',
            'words': [{'bounding_rect': rect(1501, 1010, 25, 25), 'text': '额'},
                      {'bounding_rect': rect(1528, 1010, 25, 25), 'text': '外'},
                      {'bounding_rect': rect(1555, 1010, 25, 25), 'text': '物'},
                      {'bounding_rect': rect(1582, 1010, 24, 25), 'text': '资'}]}],
 'merged_text': '我做到 了 · · · · “? 我用 自 己的力 量保护了大家吗? 0 一 11 OPERATION 0 突围 行动结束 EXP /800 1.2倍 声望&龙门币奖励 全员信赖 常规掉落 额外物资',
 'text': '我 做 到 了 · · · · “ ? 我 用 自 己 的 力 量 保 护 了 大 家 吗 ? 0 一 11 OPERATION 0 突 围 行 动 结 束 EXP /800 1.2 倍 声 望 & 龙 门 币 奖 励 全 员 信 '
         '赖 常 规 掉 落 额 外 物 资',
 'text_angle': -0.0}

主战斗模块ToDoList

这里list了建议支持的的关卡列表,列表参考了来着nga论坛攻略

列表从左到右,从上到下

  • 4-9
  • 2-10
  • 3-2
  • 4-7
  • 4-8
  • 3-3
  • 4-6
  • 3-1
  • 4-5
  • 5-8
  • S4-1
  • 3-4
  • 4-10
  • 5-10
  • 4-4
  • 3-8
  • 5-3
  • 4-2
  • S4-6
  • 1-7
  • 3-7
  • 5-7
  • S3-3
  • S3-4
  • S3-2
  • 5-3
  • S3-1
  • S4-9
  • 2-6
  • S2-5
  • 4-5
  • S2-9
  • 2-5
  • S2-8
  • 2-6
  • 2-3
  • 3-8
  • S2-7
  • 2-5
  • S2-6

感觉好多啊,是不是应该换一个方式储存什么的
如果全部实现后,也许可以开发一个根据材料选关的方法或者直接访问现有的网页工具 目前我看到了三波人

[Bug report] Support for Android network debugging

Android Device: Lineage OS 15.1
PC: Windows 7 Pro
Python dependencies are all installed.

Dear developer!
My current PC is not capable for using a Android Emu, so I decided to try with my Android phone with network debugging enabled.
But when I change ADB_HOST in the configuration files (default_setting.json and common_config.py), none of them worked. Both reported "�[96m[!] 检测到多台设备,根据 ADB_HOST 参数将自动选择设备�[0m, 自动选择设备失败,请根据上述内容自行输入数字并选择" in my cmd console.
Is there any lack of support for real Android devices connected via USB or just network debugging?
Thanks!

How about add a new function

如果加一个新功能,玩家选择要刷的材料和数量以及期望次数上限,直接在对应的本刷到数量足够多材料或者超过上限。会不会对玩家更加方便?至于一键摸头和1-11,我明白实现难度很高,但还是希望有这样的新功能。

Baidu ocr 无法识别“7”

绝了原图75票数只能识别5
strength
但是,处理后可以识别
strength
这个问题不是第一次出现了,我的想法是识别前处理所有
解决方案

  1. 全局统一设定,不区分是否使用百度ocr,你们怎么看
  2. 如果这样选择1的话还可能需要新的图片处理算法,原来的有些简陋,但可能需要新的库比如opencv ~~不是很确定,我并没有详细了解过图片处理
  3. tesseract可以支持训练字体库,我不确定有没有必要弄一个

问一下

系统有对点击时间间隔,点击位置进行检测么

ValueError: invalid thread id

在简略战斗模块,因理智不足退出战斗,再启动时提示 请先关闭主战斗模块或简略战斗模块
在单击下面的停止线程时,有错误警告
Traceback (most recent call last):
File "E:\GitHub\ArknightsAutoHelper\GUI\app.py", line 145, in kill_slim stop_thread(self.worker['slim_battle'])
File "E:\GitHub\ArknightsAutoHelper\GUI\Misc\events.py", line 25, in stop_thread _async_raise(thread.ident, SystemExit)
File "E:\GitHub\ArknightsAutoHelper\GUI\Misc\events.py", line 16, in _async_raise raise ValueError("invalid thread id")
ValueError: invalid thread id

clear_daily_task缺失一个点击

clear_daily_task清理任务时,没有进入到日常任务,我这边是还有见习任务的
真的没法改,我倒现在没看懂分辨率的计算

gui版本简易模块崩坏

关卡检测部分代码:

def task_check(self, enable_ocr_check, c_id):
        # 检测是否在关卡页面
        if enable_ocr_check:
            self.adb.get_screen_shoot(
                file_name="is_on_task.png",
                screen_range=MAP_LOCATION['ENSURE_ON_TASK_PAGE_OCR'])
            self.__ocr_check(SCREEN_SHOOT_SAVE_PATH + "is_on_task.png",
                             SCREEN_SHOOT_SAVE_PATH + "1",
                             "--psm 7", change_image=True, invert=True)
            f = open(SCREEN_SHOOT_SAVE_PATH + "1.txt", "r", encoding="utf8").readline().replace(' ', '')
            self.shell_log.debug_text("OCR 识别结果: {}".format(f))
            logger.info("OCR 识别关卡界面结果: {}".format(f))
            continue_run = c_id in f
        else:
            self.adb.get_screen_shoot(
                file_name="is_on_task.png",
                screen_range=MAP_LOCATION['ENSURE_ON_TASK_PAGE'])
            if self.adb.img_difference(
                    SCREEN_SHOOT_SAVE_PATH + "is_on_task.png",
                    STORAGE_PATH + "ENSURE_ON_TASK_PAGE.png"
            ) <= 0.8:
                self.shell_log.debug_text("相似度对比失败")
                continue_run = False
            else:
                self.shell_log.debug_text("相似度对比成功")
                continue_run = True
        if continue_run:
            self.shell_log.info_text("确认处于关卡页面")
            return False
        else:
            self.shell_log.failure_text("当前未处在关卡页面")
            return True

log:

2019-09-10 21:02:57,883 ! INFO ! base ! task_check ! 509 ! OCR 识别关卡界面结果: 1-7
2019-09-10 21:03:01,274 ! INFO ! base ! __check_is_on_notice ! 399 ! OCR 识别活动公告结果: 
2019-09-10 21:03:04,398 ! INFO ! base ! back_to_main ! 429 ! 发送坐标MAIN_RETURN_INDEX: [[13, 12], [13, 61]]
2019-09-10 21:03:04,399 ! INFO ! base ! mouse_click ! 181 ! 接收到点击坐标并传递xx:13和yy:25
2019-09-10 21:12:10,284 ! INFO ! base ! task_check ! 509 ! OCR 识别关卡界面结果: S3-1
2019-09-10 21:12:13,608 ! INFO ! base ! __check_is_on_notice ! 399 ! OCR 识别活动公告结果: 
2019-09-10 21:12:16,481 ! INFO ! base ! back_to_main ! 429 ! 发送坐标MAIN_RETURN_INDEX: [[13, 12], [13, 61]]
2019-09-10 21:12:16,481 ! INFO ! base ! mouse_click ! 181 ! 接收到点击坐标并传递xx:13和yy:54

自动关卡定位思路

或可以使用基建的加工站选择对应关卡。

每个材料选择后,除了本身,其他1-3个材料都可以点开介绍 大概叫这个名字 页面,进行跳转

也许需要储存一份材料对应关卡,或者导入一些网站如Ark Tool的数据直接或间接生成对应表,但目前尚未清楚识别成功率。

灵感来自群友的仓库跳转~~(仓库似乎有bug,有时候缓慢滑动会造成材料打乱再随着继续移动恢复)~~

运行出现问题...

C:\Users\luyim>python C:\Users\luyim\ArknightsAutoHelper\ArknightsShell.py -s -t CE-4:99
[INFO] [!] 检测到多台设备,根据 ADB_HOST 参数将自动选择设备
[0] 127.0.0.1:62001 device
[1] emulator-5558 host
[2] emulator-5584 host
[3] emulator-5582 host
[4] emulator-5580 host
[5] emulator-5576 host
[WARNING] 自动选择设备失败,请根据上述内容自行输入数字并选择

0
[INFO] [+] 确认设备名称 127.0.0.1:62001
[INFO] 战斗-选择None...启动
[INFO] 开始第 1 次战斗
Traceback (most recent call last):
File "C:\Users\luyim\ArknightsAutoHelper\ArknightsShell.py", line 4, in
shell.run_shell()
File "C:\Users\luyim\ArknightsAutoHelper\Arknights\ArknightsShell.py", line 33, in run_shell
self.handler()
File "C:\Users\luyim\ArknightsAutoHelper\Arknights\ArknightsShell.py", line 84, in handler
set_count=count,
File "C:\Users\luyim\ArknightsAutoHelper\Arknights\base.py", line 237, in module_battle_slim
self.operation_once_statemachine(c_id, )
File "C:\Users\luyim\ArknightsAutoHelper\Arknights\base.py", line 396, in operation_once_statemachine
smobj.state(smobj)
File "C:\Users\luyim\ArknightsAutoHelper\Arknights\base.py", line 279, in on_prepare
recoresult = imgreco.before_operation.recognize(screenshot)
File "C:\Users\luyim\ArknightsAutoHelper\imgreco\before_operation.py", line 24, in recognize
logger = get_logger(LOGFILE)
File "C:\Users\luyim\ArknightsAutoHelper\richlog.py", line 27, in get_logger
logger = RichLogger(file, True)
File "C:\Users\luyim\ArknightsAutoHelper\richlog.py", line 8, in init
self.f = open(file, 'wb' if overwrite else 'ab')
FileNotFoundError: [Errno 2] No such file or directory: 'log/b4op.html'

基于百度ocr的位置信息改进程序

经过测试,百度ocr的位置信息可以识别出大部分的关卡文件,所以具备了开发基于百度ocr位置识别开发点击功能, 测试结果稍后放出。

思路

  1. 在现有的坐标基础上,增加对不支持的关卡支持,并在处理后储存坐标
  • 做法:当发现不支持关卡后,运行模块,找到关卡,并储存坐标
  • 分析:应该很快完成,但是我觉得这种算是给打补丁,缺啥补啥。可以保留现有的坐标体系,也许可以试试,如果坐标有问题,可以通过删除click_location的相关项来重新生成
  1. 通过百度ocr重新确定所有的,或部分坐标数据
  • 做法:写一个自动的脚本,可以自动记录关卡坐标位置并储存
  • 分析:耗时稍长,但是对于关卡的逻辑分析已经有了,可以直接调用,或者抄下来。这个算是比较全面的,如果包括像是物资,芯片,那个界面的解析话,也许可以做到多分辨率适配。

两个思路都是要储存坐标的,毕竟这个百度ocr(位置版)有500每日的次数现在,而且现在基础版本够用,主要还是靠基础版本来检测。

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.