Аутентификация API Microsoft/Minecraft с использованием прокси при использовании Msmcauthaio

Вопрос или проблема

В частности, это связано с 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 ответа.

Решения

  1. Проверка Прокси:

    • Убедитесь, что используемые вами прокси действительно работают с HTTP/HTTPS запросами. Прокси могут иногда быть настроены так, что они обрабатывают только определенные типы запросов.
    • Проверьте, что прокси не блокируют доступ к https://login.live.com, так как это может быть причиной возврата HTML-страницы с ошибкой.
  2. Изменение Настройки Прокси в Коде:
    В вашем коде при вызове метода set_proxy вам необходимо убедиться, что прокси правильно передается в формате, ожидаемом библиотекой. Вот пример, как это может выглядеть:

    if proxy:
       client.set_proxy({
           'http': proxy,
           'https': proxy,
       })
  3. Обработка Ошибок:
    В разделе, где вы обрабатываете ответ 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
  4. Асинхронность и Параллелизм:
    Попробуйте запустить несколько процессов аутентификации параллельно без зависания друг от друга с использованием 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)
  5. Логирование и Отладка:
    Добавьте больше логирования, чтобы видеть, какие запросы выполняются и какие ответы возвращаются. Это поможет вам отследить, на каком этапе происходят сбои или неожиданные результаты.

Заключение

Аутентификация через прокси-серверы может быть сложным процессом, особенно если речь идет о том, чтобы гарантировать, что все запросы обрабатываются корректно. Убедитесь, что ваши прокси настроены правильно и могут обрабатывать нужные запросы, и применяйте обработку ошибок, чтобы упростить отладку. Используйте асинхронные функции для параллельной обработки запросов, чтобы значительно сп ускорить процедуру получения токенов для всех ваших аккаунтов. Удачи в ваших усилиях!

Оцените материал
Добавить комментарий

Капча загружается...