Вопрос или проблема
В частности, это связано с Minecraft! Изначально я написал программу, которая входила в одну из моих учетных записей и получала токен доступа, чтобы я мог общаться с API, но это было очень медленно, и я начал искать более быстрые способы сделать это, и я экспериментировал с чем-то под названием msmcauth, что помогает с аутентификацией. Оно использует запросы через API, чтобы сначала получить токен Microsoft, затем токен Xbox Live с токена MS, токен XSTS с токена Xbox Live и, наконец, токен доступа Minecraft с токена XSTS. Это работает с простыми скриптами, как таковые:
from msmcauthaio import MsMcAuth, UserProfile
client = MsMcAuth()
login: UserProfile = await client.login("ваш-имейл-здесь", "ваш-пароль-здесь")
# Login — это объект UserProfile
print(login)
И он возвращает такие вещи, как uuid и токен и прочее. Единственная проблема в том, что мне нужно быстро получать мои токены, потому что эти токены действуют всего 24 часа, и получение 3 токенов, ожидая минуту, а затем снова получение 3 токенов занимает почти час, чтобы получить все токены из моих учетных записей. Поэтому я пытался реализовать прокси! Хотя при этом в одной части скрипта xbox.py ожидается получение некоторого json в ответ на запрос, но вместо этого загружается HTML-страница. Это происходит только при использовании прокси. Мои прокси хорошие, и я их протестировал 🙂 Сообщите мне, если кто-то сможет помочь хотя бы немного 🙂
Вот msmcauthaio: https://pypi.org/project/msmcauthaio/ или вы можете поискать это сами!
Вам, конечно, не нужно смотреть во все файлы и все такое, я приму любую помощь, которую смогу ^^
Сообщите мне, если я упустил какую-либо важную информацию, которую вы хотели бы знать!
Спасибо!
Что я пробовал:
Я пытался реализовать прокси следующим образом. Не знаю, хорошо ли будет публиковать каждый скрипт или это займет слишком много места, хаха, поэтому это просто мой основной скрипт. Но я могу опубликовать и другие, они просто слегка отредактированные версии msmcauthaio, чтобы они использовали прокси.
from msmcauthaio import MsMcAuth, UserProfile
async def login_and_get_token(email, password, proxy=None):
client = MsMcAuth()
if proxy:
client.set_proxy(proxy)
login: UserProfile = await client.login(email, password)
return login.access_token if login else None
async def main():
accounts_file = "txt/Accounts.txt"
tokens_file_path = "txt/Tokens.txt"
proxies_file = "txt/Proxies.txt"
with open(tokens_file_path, "w") as f:
pass
with open(accounts_file, "r") as file:
accounts = file.readlines()
with open(proxies_file, "r") as file:
proxies = [line.strip() for line in file.readlines()]
with open(tokens_file_path, "a") as f:
for index, account in enumerate(accounts):
email, password = account.strip().split(":")
token = None
max_attempts = 3
attempts = 0
proxy_index = 0
while attempts < max_attempts:
current_proxy = proxies[proxy_index]
token = await login_and_get_token(email, password, current_proxy)
if token:
f.write(f"{token} {email}\n")
print(f"{email} {index + 1}/{len(accounts)} аутентифицирован")
break
else:
attempts += 1
print(f"{email} аутентификация не удалась. Попытка {attempts}/{max_attempts}")
if attempts == max_attempts:
print(f"Достигнуто максимальное количество попыток для {email}")
proxy_index += 1
attempts = 0
if __name__ == "__main__":
import asyncio
asyncio.run(main())
С моими прокси я получаю эту ошибку:
Response status: 200, Content-Type: text/html; charset=utf-8
Ошибка при обработке ответа: 200, сообщение="Попытка декодирования JSON с неожиданным mimetype: text/html; charset=utf-8", url="https://login.live.com/oauth20_authorize.srf?client_id=000000004C12AE6F&redirect_uri=https://login.live.com/oauth20_desktop.srf&scope=service::user.auth.xboxlive.com::MBI_SSL&display=touch&response_type=token&locale=en"
Что бы я хотел:
По сути, я хочу пройти через текстовый файл моих учетных записей, получить токен для каждой из них и затем записать этот токен в текстовый файл токенов. И я хотел бы использовать прокси, чтобы это было сделано быстрее.
Ответ или решение
Проблема аутентификации в Microsoft/Minecraft API с использованием прокси через библиотеку msmcauth
Введение
Сложности, с которыми вы столкнулись при использовании прокси-серверов в вашем проекте для аутентификации в Microsoft/Minecraft API, являются достаточно распространенной проблемой, особенно когда дело касается скорости обработки запросов. Ваша цель — получение токенов быстро и эффективно, чтобы избежать временных затрат. В этом ответе мы постараемся рассмотреть возможные решения ваших проблем, а также предоставить рекомендации по оптимизации кода.
Проблема
Судя по вашему описанию, при использовании прокси вы получаете ответ с Content-Type: text/html
, что указывает на возможные ошибки в конфигурации прокси или неправильные URL для запросов. Это может также произойти, если прокси блокирует определенные запросы или указывает на страницу с ошибкой вместо ожидаемого JSON ответа.
Решения
-
Проверка Прокси:
- Убедитесь, что используемые вами прокси действительно работают с HTTP/HTTPS запросами. Прокси могут иногда быть настроены так, что они обрабатывают только определенные типы запросов.
- Проверьте, что прокси не блокируют доступ к https://login.live.com, так как это может быть причиной возврата HTML-страницы с ошибкой.
-
Изменение Настройки Прокси в Коде:
В вашем коде при вызове методаset_proxy
вам необходимо убедиться, что прокси правильно передается в формате, ожидаемом библиотекой. Вот пример, как это может выглядеть:if proxy: client.set_proxy({ 'http': proxy, 'https': proxy, })
-
Обработка Ошибок:
В разделе, где вы обрабатываете ответ API, добавьте проверки статуса и соответствующих типов контента:response = await client.login(email, password) if response.headers['Content-Type'] == 'application/json': # Обработка JSON token = response.json().get('access_token') return token else: print(f"Unexpected response type: {response.headers['Content-Type']}") return None
-
Асинхронность и Параллелизм:
Попробуйте запустить несколько процессов аутентификации параллельно без зависания друг от друга с использованием asyncio. Это поможет вам максимально ускорить процесс получения токенов.Например, используйте
asyncio.gather
для выполнения нескольких логинов одновременно:tasks = [] for account in accounts: email, password = account.strip().split(":") tasks.append(login_and_get_token(email, password, current_proxy)) tokens = await asyncio.gather(*tasks)
-
Логирование и Отладка:
Добавьте больше логирования, чтобы видеть, какие запросы выполняются и какие ответы возвращаются. Это поможет вам отследить, на каком этапе происходят сбои или неожиданные результаты.
Заключение
Аутентификация через прокси-серверы может быть сложным процессом, особенно если речь идет о том, чтобы гарантировать, что все запросы обрабатываются корректно. Убедитесь, что ваши прокси настроены правильно и могут обрабатывать нужные запросы, и применяйте обработку ошибок, чтобы упростить отладку. Используйте асинхронные функции для параллельной обработки запросов, чтобы значительно сп ускорить процедуру получения токенов для всех ваших аккаунтов. Удачи в ваших усилиях!