LinSoap

LinSoap

Null

Linux也要明日方舟一鍵收菜

最近從 Windows 全面轉向 Manjaro 系統了,不得不說是真的很好用,轉向 Manjaro 後,一個重要問題是如何像以前一樣多開 MAA 明日方舟收菜,畢竟粥批每天都要收兩次菜,幾個號手動收起來太麻煩了。

模擬器#

首先是 MAA 支持三種 Linux 模擬器,一個是 AVD,一個是 Waydroid,一個是 redroid,我選擇使用 AVD,畢竟有 google 支持相對好用些吧。Waydroid 容器化的概念很好,但好像對 N 卡不支持就算了。
AVD 集成在 android-stuidio 中,先在 AUR 庫中下載 android-stuidio (不要使用 flatpak 庫,容器化會導致後續命令行啟動模擬器變得很麻煩),配置代理下載完 Sdk 後,選擇

virtualdevice

當然你也可以不選擇使用 android-stuidio 直接使用 AVD,但 android-studio 提供圖形化界面能省很多事。
新建設備,設置分辨率 16:9 並大於 720p 即可,框架選擇 (R - 30 - x86 - Android 11.0),按照自己的配置為每個模擬器分配合適的配置,記得開啟硬件加速,至此就成功創建 MAA 支持的模擬器,通過 adb 安裝明日方舟即可。

newdevice

selectimage

detailsetting

每次打開模擬器都要打開 android-studio 非常的麻煩,其實可以直接從命令行打開模擬器

~/Android/Sdk/emulator/emulator -list-avds //獲取模擬器列表
~/Android/Sdk/emulator/emulator -avd 模擬器名稱 //啟動指定模擬器 

MAA 配置#

從 MAA 官网下载並解壓後,官方提供了幾種方式調用 MAA,一個是 maa-cli,一個是 Python 接口,分別為解壓包根目錄下的 AppImage 文件和 Python 文件夾,我看了看 maa-cli 的配置,配置任務和多開都比較麻煩,所以我就選擇使用 Python 接口啟動 MAA,打開 Python 文件夾下的 sample.py 文件,修改這個文件即可完成任務配置。首先是配置 adb 地址和 adb 設備名稱,然後根據需求依照文檔添加任務和設置任務參數,直接 python sample.py 即可直接開始收菜了。
每次任務的時候,都需要改 py 文件就非常麻煩了,所以可以在執行 python 的時候接受參數,選擇要執行哪些任務即可,修改這個 sample 文件,以下給出我的任務配置

import json
import pathlib
import time
import argparse

from asst.asst import Asst
from asst.utils import Message, Version, InstanceOptionType
from asst.updater import Updater
from asst.emulator import Bluestacks

@Asst.CallBackType
def my_callback(msg, details, arg):
    m = Message(msg)
    d = json.loads(details.decode('utf-8'))

    print(m, d, arg)

if __name__ == "__main__":
    # 創建 ArgumentParser 對象
    parser = argparse.ArgumentParser(description='Arknights Assistant Script')

    # 添加每個任務的啟用選項
    parser.add_argument('--start-up', action='store_true', help='啟用 StartUp 任務')
    parser.add_argument('--recruit', action='store_true', help='啟用 Recruit 任務')
    parser.add_argument('--infrast', action='store_true', help='啟用 Infrast 任務')
    parser.add_argument('--visit', action='store_true', help='啟用 Visit 任務')
    parser.add_argument('--mall', action='store_true', help='啟用 Mall 任務')
    parser.add_argument('--fight', action='store_true', help='啟用 Fight 任務')
    parser.add_argument('--award', action='store_true', help='啟用 Award 任務')
    parser.add_argument('--stage', type=str, default=None, help='指定 Fight 任務的關卡')

    args = parser.parse_args()

    # 請設置為存放 dll 文件及資源的路徑
    path = pathlib.Path(__file__).resolve().parent.parent

    # 設置更新器的路徑和目標版本並更新
    # Updater(path, Version.Stable).update()

    Asst.load(path=path)

    asst = Asst()

    asst.set_instance_option(InstanceOptionType.touch_type, 'maatouch')

    # 請自行配置 adb 環境變量,或修改為 adb 可執行程序的路徑
    if asst.connect('/home/linsoap/Android/Sdk/platform-tools/adb', 'emulator-5554'):
        print('連接成功')
    else:
        print('連接失敗')
        exit()

    # 任務及參數請參考 docs/集成文檔.md

    if args.start_up:
        asst.append_task('StartUp', {
            'client_type': 'Official',
            'start_game_enabled': True
        })

    if args.recruit:
        asst.append_task('Recruit', {
            'enable': True,
            'select': [4],
            'confirm': [3, 4],
            'times': 4
        })

    if args.infrast:
        asst.append_task('Infrast', {
            'enable': True,
            'facility': [
                "Mfg", "Trade", "Control", "Power", "Reception", "Office", "Dorm"
            ],
            'drones': "Money"
        })

    if args.visit:
        asst.append_task('Visit')

    if args.mall:
        asst.append_task('Mall', {
            'shopping': True,
            'buy_first': ['招聘許可', '龍門幣'],
            'blacklist': ['家具', '碳'],
        })

    if args.fight:
        fight_params = {'enable': True}

        if args.stage:
            fight_params['stage'] = args.stage

        asst.append_task('Fight', fight_params)

    if args.award:
        asst.append_task('Award', {
            'enable': True,
        })

    asst.start()

    while asst.running():
        time.sleep(0)

Updater 類目前有一些問題,建議直接註釋掉就好了,等什麼時候修復了 bug 再取消註釋就好
安裝以上配置就可以使用以下命令啟動 MAA 了。

python emulator-54.py --start-up --recruit --infrast --visit --mall --fight --stage AP-5 --award

一鍵腳本#

一鍵啟動模擬器#

為了做到一鍵割草,還需要一個腳本一鍵啟動多個模擬器,一鍵啟動 MAA。
首先是複製多分 sample.py,修改其中的 adb 名稱即可。
遇到的第一個問題就是 AVD 的 adb 名稱不是固定的,而是按照啟動順序分配的,我有兩個官服賬戶和一個 b 服賬號,隨機的 adb 名字會導致 StarUp 任務失敗,所以在多開的時候,需要指定端口,使得對應的客戶端能夠執行對應的任務。

#!/bin/bash

while [ "$#" -gt 0 ]; do
  case "$1" in
    --start)
      shift
      while [ "$#" -gt 0 ]; do
        case "$1" in
          --all)
            echo "啟動所有模擬器..."
            /home/linsoap/Android/Sdk/emulator/emulator -avd aknz -ports 5554,5555 &
            /home/linsoap/Android/Sdk/emulator/emulator -avd aknz_1 -ports 5556,5557 &
            /home/linsoap/Android/Sdk/emulator/emulator -avd mrfz -ports 5558,5559 &
            shift
            ;;
          --list)
            echo "可用模擬器:"
            /home/linsoap/Android/Sdk/emulator/emulator -list-avds
            shift
            ;;
          -*)
            echo "未知選項: $1"
            exit 1
            ;;
          *)
            echo "啟動模擬器: $1"
            /home/linsoap/Android/Sdk/emulator/emulator -avd "$1" &
            shift
            ;;
        esac
      done
      ;;
    --stop)
      shift
      while [ "$#" -gt 0 ]; do
        case "$1" in
          --all)
            echo "停止所有模擬器..."
            /home/linsoap/Android/Sdk/platform-tools/adb -s emulator-5554 emu kill
            /home/linsoap/Android/Sdk/platform-tools/adb -s emulator-5556 emu kill
            /home/linsoap/Android/Sdk/platform-tools/adb -s emulator-5558 emu kill
            shift
            ;;
          -*)
            echo "未知選項: $1"
            exit 1
            ;;
          *)
            echo "停止模擬器: $1"
            /home/linsoap/Android/Sdk/platform-tools/adb -s "$1" emu kill
            shift
            ;;
        esac
      done
      ;;
    -*)
      echo "未知選項: $1"
      exit 1
      ;;
  esac
done

以上是我用 ChatGPT 生成的一鍵啟動腳本,按照自己對應的需求讓 GPT 生成腳本就行了。

  • 啟動所有模擬器:./your_script.sh --start --all
  • 啟動特定模擬器:./your_script.sh --start <emulator_name>
  • 查看可用模擬器列表:./your_script.sh --start --list
  • 停止所有模擬器:./your_script.sh --stop --all
  • 停止特定模擬器:./your_script.sh --stop <emulator_name>

一鍵啟動 MAA#

修改 sample.py 後,使得其能夠接受參數選擇啟用的任務,編寫一鍵啟動 MAA 腳本也變得容易,借助 ChatGPT 按照需求生成腳本就行了,以下是我的腳本。

#!/bin/bash

# 設置要執行的 Python 腳本文件列表
python_scripts=("emulator-54.py" "emulator-56.py" "emulator-58.py")

# 默認參數值
all_flag=false
only_fight_flag=false
unfight_flag=false
stage_value=""

# 解析命令行參數
while [ "$#" -gt 0 ]; do
  case "$1" in
    --all)
      all_flag=true
      ;;
    --only-fight)
      only_fight_flag=true
      ;;
    --unfight)
      unfight_flag=true
      ;;
    -stage|--stage)
      shift
      stage_value="$1"
      ;;
    *)
      echo "未知選項: $1"
      exit 1
      ;;
  esac
  shift
done

# 檢查參數組合
if [ "$all_flag" = true ] && [ "$only_fight_flag" = true ]; then
  echo "不能同時使用 --all 和 --only-fight。"
  exit 1
fi

# 構造命令行參數字符串
args="--start-up"

if [ "$all_flag" = true ] || [ "$only_fight_flag" = true ]; then
  args+=" --recruit --infrast --visit --mall --award --fight"
fi
if [ "$only_fight_flag" = true ]; then
  args+=" --fight"
fi

if [ -n "$stage_value" ]; then
  args+=" --stage $stage_value"
fi

# 串行執行三個 Python 命令
for script in "${python_scripts[@]}"; do
  # 輸出當前執行的任務
  echo "執行 $script 中的任務"

  # 串行執行
  python "$script" $args & echo "完成 $script 中的任務" || echo "執行 $script 中的任務失敗"
done

echo "所有任務完成"

這個腳本支持以下命令

  • --all: 啟動所有任務,包括 --start-up, --recruit, --infrast, --visit, --mall, --award--fight
  • --only-fight: 啟動所有任務,包括 --start-up--fight
  • --unfight: 啟動所有任務,但不包括 --fight
  • --stage <value>-stage <value>: 指定任務關卡的值。

玩明日方舟玩的#

id

載入中......
此文章數據所有權由區塊鏈加密技術和智能合約保障僅歸創作者所有。