Часть 1. Установка и обход авторизации mojang
Привет, Хабр!
Я начал разработку своего личного лаунчера для майнкрафт, но столкнулся с проблемой, это поиск информации о создании лаунчера. После того как я поискал в интернете, то столкнулся с гайдами на ютуб, где показываю, как создать свой лаунчер для майнкрафт на C#, Python и т. д., но они показывают пример с документации, а нюансы типа как указывать java аргументы или установить там forge или optifine не объясняют, но зато узнал про такую библиотеку, как minecraft launcher lib, так ещё и на питоне, что не может не радовать. Так вот разобравшись во всём этом я хочу поделиться с интернетом о создании своего лаунчера для майнкрафт. Я сделаю серию гайдов по реализации тех или иных фич.
Начинаем!
Установка библиотеки
Сначала нам нужно создать папку, где будет храниться наш лаунчер и открыть её в IDE, я буду использовать vs code.
После мы переходим в неё с помощью cd в терминале или cmd, после выполняем команды:
# Linux python3 -m venv .venv # Создаем venv source .venv/bin/activate # Активируем venv # Windows python -m venv .venv # Создаем venv .venv\Scripts\activate # Активируем venv
Устанавливаем библиотеку с помощью команды:
# Linux
pip3 install minecraft_launcher_lib
# Windows
pip install minecraft_launcher_lib
Всё, библиотека установлена, ура!
Теперь создадим в нашей директории файл ` main.py `, после импортируем библиотеку minecraft launcher lib и subprocess для запуска
import minecraft_launcher_lib as mll
import subprocess
Я же ещё сделаю псевдоним mll, для удобства.
Всё, основное мы сделали, теперь переходим к сладкому.
Установка майнкрафта и запуск
Давайте сначала создадим переменные, путь к майнкрафту и версию с ником.
path = "/path/to/minecraft"
version = "1.16.5"
nickname = "Guid"
Если вам нужен путь по умолчанию, то можно указать путь с помощью функции:
path = mll.utils.get_minecraft_directory() # Путь по умолчанию: ~/.minecraft на линуксе или ~\AppData\local\.minecraft на виндовсе
Я вам советую для тестов использовать новую версию, так как мы будем обходить авторизацию через microsoft, а проверить это можем через версию, ну или через логи, которые будут.
После нам надо будет установить саму версию версию майнкрафт, что можем сделать через функцию install_minecraft_version(), которая находится в модуле install:
mll.install.install_minecraft_version(versionid=version, minecraft_directory=path)
В функции указываем параметры
versionid - версия игры, указываем нашу переменную version
minecraft_directory - путь, где храниться наш майнкрафт, указываем переменную path"
Также есть ещё параметр callback, но о нем позже.
После чего создадим options, это словарь, где будут храниться настройки лаунчера и пользователя(никнейм, токен, uuid, jvm arguments и т.д)
Можно создать свой словарь или сгенерировать, удобнее будет свой создать:
options = {
"username": nickname # Наш ник
}
В словаре указываем элемент username
Сейчас для запуска нам хватит и никнейма, но потом мы разберём более подробно этот словарь.
Дальше нам нужно сформировать команды для запуска майнкрафт, это можно сделать с помощью функции get_minecraft_command(), которая находится в модуле command:
command = mll.command.get_minecraft_command(version=version, minecraft_directory=path, options=options)
Эту функцию помещаем в переменную для удобства, после чего указываем параметры:
version - версия игры, указываем нашу переменную version
minecraft_directory - путь, где лежит наш майнкрафт, указываем переменную path
options - настройки лаунчера и запуска игры, тоже указваем наш словарь
Ура! Остался один штрих.
Теперь будем запускать, наш майнкрафт, для этого мы используем библиотеку subprocess, которую импортировали в начале, у него будем использовать функцию run:
subprocess.run(command)
В функцию осталось поместить нашу переменную command, где хранится команда для запуска майнкрафт.
Вот весь код:
import minecraft_launcher_lib as mll
import subprocess
path = "C:\\Users\\<username>\\Documents\\guid_mine"
version = "1.16.5"
nickname = "Guid"
mll.install.install_minecraft_version(versionid=version, minecraft_directory=path)
options = {
"username": nickname
}
command = mll.command.get_minecraft_command(version=version, minecraft_directory=path, options=options)
subprocess.run(command)
Ура! *Если все получилось
Теперь можно запустить код
Обход авторизации mojang
После запуска вы наверное заметили, что у вас не работает сетевая игра, и мы сейчас это поправим.
Объясняю, при запуске майнкрафта идёт проверка на аккаунт через сервера майкрософт, если вы тестили на старой версии, то там явно работала сетевая игра, а на новых уже нет, так как там сделали проерку на аккаунт, но если сменить сервер авторизации, то мы спокойно сможем играть в сетевую игру, но минус того что играть сможем только на серверах, где не нужна лицензия.
Чтобы провернуть трюк со сменой сервера авторизации, нам нужно установить authlib injector и указать его запуск в jvm-arguments, вот ссылка на гитхаб, где можно его установить: https://github.com/yushijinhun/authlib-injector.
После установки закидываем его в папку с майнкрафтом, ну или в любое другое место, где удобно в общем. После этого мы добавляем ключ-пару в наш словарь options:
options = {
"username": nickname,
"jvmArguments": [
"-javaagent:path/to/authlib-injector.jar=ely.by"
]
}
Если у вас authlib injector называется по-другому, то лучше переименовать его в authlib-injector.jar или в пути, где javaagent:path, указать в конце название скачанного файла authlib-injector-1_2_5.jar например, через равно указываем сервер авторизации, я указываю elyby.
После этого сохраняем и запускаем код.
[authlib-injector] [ERROR] Failed to fetch metadata: javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
Если у вас вышла такая ошибка, то не переживайте, её можно исправить.
Для этого мы устанавливаем java jre с официального сайта. После этого находим путь к запускаемому файлу java и копируем, вот:
Windows: "C:\Program Files\Java\jre<версия>\bin\java.exe"
Linux: "/usr/local/bin/java" (точно не знаю как выглядить запускаемый файл java в линуксе)
После этого добавляем аргумент executablePath в наш словарь options:
options = {
"username": nickname,
"jvmArguments": [
"-javaagent:C:\\Users\\Pasha\\Documents\\mine\\authlib-injector.jar=ely.by"
],
"executablePath": "C:\\Program Files\\Java\\jre1.8.0_451\\bin\\java.exe"
}
Теперь снова запускаем код(не забываем экранировать бекслеш на виндовсе)
Ура! У нас теперь работает сетевая игра, а эта часть создания лаунчера закончена!
Вот весь получившийся код:
import minecraft_launcher_lib as mll
import subprocess
path = "C:\\Users\\<username>\\Documents\\mine"
version = "1.16.5"
nickname = "Guid"
#mll.install.install_minecraft_version(versionid=version, minecraft_directory=path, callback={"setProgress":lambda e: print(e)})
options = {
"username": nickname,
"jvmArguments": [
"-javaagent:C:\\Users\\<username>\\Documents\\mine\\authlib-injector.jar=ely.by"
],
"executablePath": "C:\\Program Files\\Java\\jre1.8.0_451\\bin\\java.exe"
}
command = mll.command.get_minecraft_command(version=version, minecraft_directory=path, options=options)
subprocess.run(command)