Alexell / XEmpireBot

Bot that earn money in X Empire (Musk Empire)
137 stars 35 forks source link

Error: 401 #9

Closed skanhell closed 2 months ago

skanhell commented 2 months ago

2024-07-27 15:58:24 | SUCCESS | 397 | Test| Login successful 2024-07-27 15:58:25 | ERROR | 107 | Test| Database error: 401, message='Unauthorized', url=URL('https://api.muskempire.io/dbs') 2024-07-27 15:58:28 | ERROR | 121 | Test| Profile data error: 401, message='Unauthorized', url=URL('https://api.muskempire.io/user/data/all') 2024-07-27 15:58:31 | ERROR | 511 | Test| Unknown error: 'data' 2024-07-27 15:58:34 | ERROR | 121 | Test | Profile data error: 401, message='Unauthorized', url=URL('https://api.muskempire.io/hero/balance/sync') 2024-07-27 15:58:37 | ERROR | 511 | Test| Unknown error: 'data' 2024-07-27 15:58:40 | ERROR | 391 | Test| Bot stopped (too many errors)

shelllshock commented 2 months ago

Same problem.

khosrowkhazraei commented 2 months ago

Same here as well

iLimus commented 2 months ago

То же самое... Со смартфона заходит норм.

Alexell commented 2 months ago

Musk Empire implemented a signature of all requests with a special hash, so for now the bot is dead. I will try to solve this problem if I can.

ngocbae98 commented 2 months ago

Bot stoped, to many error

avtosubaru25 commented 2 months ago

Musk Empire implemented a signature of all requests with a special hash, so for now the bot is dead. I will try to solve this problem if I can.

да пиздюки

"chatId":"",

        # "chatType":"sender",
        # "chatInstance":"8801988294589563843"}  последний можно на шару рандомайсом делать а вот чат ид непойму откуда он берет ты не нашол

еще ?

chat_instance =await self.generate_random_chat_instance()

async def generate_random_chat_instance(self, length=16):
    characters = '0123456789'
    return ''.join(random.choice(characters) for _ in range(length))
Alexell commented 2 months ago

@avtosubaru25 ты не в ту сторону вообще смотришь. Процесс авторизации у них не поменялся, он работает в моем боте и там не нужны chatId и chatInstance. Проблема не в авторизации, а в том, что они добавили заголовки Api-Hash и Api-Time к КАЖДОМУ запросу. Api-Hash генерируется каждый раз по их кастомному алгоритму, который мне не удалось пока воссоздать на Python.

seriowag commented 2 months ago

а у тебя есть значения этих Api-Hash. попробовать спросит ChatGPT,может он какой алгоритм по генерации этих хаш узнает?

Alexell commented 2 months ago

У нас есть алгоритм хеширования, он прописан у них в js и с ChatGPT я уже вчера поработал на эту тему. Алгоритм похож на md5, но отличается. Если бы это оказался обычный известный алгоритм, у меня не возникло бы проблем. В MMPro BUMP тоже сделали подпись запросов, но там было не сложно воссоздать такую же подпись и мой бот работает. Но тут даже ChatGPT не смог нормально воссоздать алгоритм на Python.

seriowag commented 2 months ago

а нет для Python библиотек которые запускают Javascript код?

avtosubaru25 commented 2 months ago

да да я понял тоже вчера сидел парсил их код они хешат время и апи кей перепробавал штук 20 алгоритмов неполучилось , пробовал их перенести на пайтон но я далек от джавы а ГПТ скотина еще тупенький для этого

сб, 27 июл. 2024 г. в 23:51, Alexander @.***>:

@avtosubaru25 https://github.com/avtosubaru25 ты не в ту сторону вообще смотришь. Процесс авторизации у них не поменялся, он работает в моем боте и там не нужны chatId и chatInstance. Проблема не в авторизации, а в том, что они добавили заголовки Api-Hash и Api-Time к КАЖДОМУ запросу. Api-Hash генерируется каждый раз по их кастомному алгоритму, который мне не удалось пока воссоздать на Python.

— Reply to this email directly, view it on GitHub https://github.com/Alexell/MuskEmpireBot/issues/9#issuecomment-2254366433, or unsubscribe https://github.com/notifications/unsubscribe-auth/ARRHIYPFI33B76REHO53DA3ZOSIHPAVCNFSM6AAAAABLR3TYEKVHI2DSMVQWIX3LMV43OSLTON2WKQ3PNVWWK3TUHMZDENJUGM3DMNBTGM . You are receiving this because you were mentioned.Message ID: @.***>

seriowag commented 2 months ago

а что если так в питоне

def Fx(time, request_auth_payload):
command = ['node', 'md5.js', str(time/ 1000), json.dumps(request_auth_payload)]
result = subprocess.run(command, capture_output=True, text=True)
return result.stdout

а в md5.js файле

function Dx(e) {--логика из их скрипта---}
function Fx(time, payLoad) {
    return Dx(`${time}_${payLoad}`)
}

function main(time, paylod) {
    const jsonString = JSON.stringify(paylod)
    console.log(Fx(time, jsonString ? jsonString : ""));
}

// Get input from command line arguments
const argvTime = parseInt(process.argv[2]);
const argvPayload = JSON.parse(process.argv[3]);

main(argvTime, argvPayload);
avtosubaru25 commented 2 months ago

Так ты тестовых оригинал ключа возьми да сравни что бы у тебя третий получилься , понял про что ? Если нет стукни в тг @alligatorCCCP

вс, 28 июл. 2024 г., 21:52 sergio @.***>:

а что если так в питоне

def Fx(time, request_auth_payload): command = ['node', 'md5.js', str(time/ 1000), json.dumps(request_auth_payload)] result = subprocess.run(command, capture_output=True, text=True) return result.stdout

а в md5.js файле

function Dx(e) {-----} function Fx(time, payLoad) { return Dx(${time}_${payLoad}) }

function main(time, paylod) { const jsonString = JSON.stringify(paylod) console.log(Fx(time, jsonString ? jsonString : "")); }

// Get input from command line arguments const argvTime = parseInt(process.argv[2]); const argvPayload = JSON.parse(process.argv[3]);

main(argvTime, argvPayload);

— Reply to this email directly, view it on GitHub https://github.com/Alexell/MuskEmpireBot/issues/9#issuecomment-2254578785, or unsubscribe https://github.com/notifications/unsubscribe-auth/ARRHIYLHYQCQ24UWGJHK7D3ZOUOTRAVCNFSM6AAAAABLR3TYEKVHI2DSMVQWIX3LMV43OSLTON2WKQ3PNVWWK3TUHMZDENJUGU3TQNZYGU . You are receiving this because you were mentioned.Message ID: @.***>

efsfssf commented 2 months ago

Same problem

Alexell commented 2 months ago

Актуальная информация: сперва я действительно запускал хеширование через выдранные из их js функции с помощью execjs + Node.js и даже смог в одну секунду обновить страницу и сделать запрос в боте и сравнить хеш, хеш правильный. Но с ним я получал 401, потому подумал, что это не md5. Только после сравнения хешей уже оказалось что это все таки обычный md5, но тем не менее, даже с Api-Time и правильным Api-Hash, я все равно получаю 401.

Alexell commented 2 months ago

Создал отдельную ветку hast-test, прописал генерацию хеша и установку заголовков в первые функции, которые выполняются ботом по порядку. Все равно он получает 401 и в get_dbs и в get_profile, если удастся это исправить, потом в остальные можно будет прописать. У меня даже с одинаковым временем и хешем в дебагере авторизация прошла, а в боте не прошла. Вот пруф: https://prnt.sc/jnsdzQV7h7Qt Как будто, я что-то упустил и это даже не касается хеша.

avtosubaru25 commented 2 months ago

извиняюсь за флуд вот прочто я говорил берем оригенальные АПИ кей время и апи хеш из дев ХРОМА, прогоняем через прогу и смотрим получилось генерить АПИ ХЕШ

import hashlib import hmac

Оригинальные методы

def generate_md5_hash(api_key, api_time): raw_string = f"{api_key}:{api_time}" print(f"MD5 raw string: {raw_string}") return hashlib.md5(raw_string.encode()).hexdigest()

def generate_sha256_hash(api_key, api_time): raw_string = f"{api_key}:{api_time}" print(f"SHA-256 raw string: {raw_string}") return hashlib.sha256(raw_string.encode()).hexdigest()

def generate_sha1_hash(api_key, api_time): raw_string = f"{api_key}:{api_time}" print(f"SHA-1 raw string: {raw_string}") return hashlib.sha1(raw_string.encode()).hexdigest()

def generate_hmac_sha256_hash(api_key, api_time): raw_string = f"{api_key}:{api_time}" print(f"HMAC-SHA256 raw string: {raw_string}") return hmac.new(api_key.encode(), raw_string.encode(), hashlib.sha256).hexdigest()

def generate_hmac_md5_hash(api_key, api_time): raw_string = f"{api_key}:{api_time}" print(f"HMAC-MD5 raw string: {raw_string}") return hmac.new(api_key.encode(), raw_string.encode(), hashlib.md5).hexdigest()

def generate_custom_order_sha256_hash(api_key, api_time): raw_string = f"{api_time}:{api_key}" print(f"Custom Order SHA-256 raw string: {raw_string}") return hashlib.sha256(raw_string.encode()).hexdigest()

def generate_custom_order_md5_hash(api_key, api_time): raw_string = f"{api_time}:{api_key}" print(f"Custom Order MD5 raw string: {raw_string}") return hashlib.md5(raw_string.encode()).hexdigest()

Новые методы

def generate_custom_md5_variant(api_key, api_time): raw_string = f"{api_key}:{api_time}:secret" print(f"Custom MD5 Variant raw string: {raw_string}") return hashlib.md5(raw_string.encode()).hexdigest()

def generate_custom_sha256_variant(api_key, api_time): raw_string = f"{api_key}:{api_time}:secret" print(f"Custom SHA-256 Variant raw string: {raw_string}") return hashlib.sha256(raw_string.encode()).hexdigest()

def generate_hmac_sha256_variant(api_key, api_time): raw_string = f"{api_key}:{api_time}" print(f"HMAC-SHA256 Variant raw string: {raw_string}") return hmac.new("secret_key".encode(), raw_string.encode(), hashlib.sha256).hexdigest()

Функция сравнения

def compare_hashes(api_key, api_time, original_hash): methods = { "MD5": generate_md5_hash, "SHA-256": generate_sha256_hash, "SHA-1": generate_sha1_hash, "HMAC-SHA256": generate_hmac_sha256_hash, "HMAC-MD5": generate_hmac_md5_hash, "Custom Order SHA-256": generate_custom_order_sha256_hash, "Custom Order MD5": generate_custom_order_md5_hash, "Custom MD5 Variant": generate_custom_md5_variant, "Custom SHA-256 Variant": generate_custom_sha256_variant, "HMAC-SHA256 Variant": generate_hmac_sha256_variant, }

for name, method in methods.items():
    generated_hash = method(api_key, api_time)
    if generated_hash == original_hash:
        print(f"Method '{name}' generated the correct hash:

{generated_hash}") else: print(f"Method '{name}' generated a different hash: {generated_hash}")

if name == "main": api_key = "01ab5671ba1c7a8fac3d379e770df491f2f70750884bf412ec5e6e244ed4c39e" api_time = "1722119719" original_hash = "fb2deda64b34b594a7a5a7edef1466b2"

compare_hashes(api_key, api_time, original_hash)

пн, 29 июл. 2024 г. в 00:11, Alexander @.***>:

Создал отдельную ветку hast-test, прописал генерацию хеша и установку заголовков в первые функции, которые выполняются ботом по порядку. Все равно он получает 401 и в get_dbs и в get_profile, если удастся это исправить, потом в остальные можно будет прописать. Посмотрите, может я что-то упустил.

— Reply to this email directly, view it on GitHub https://github.com/Alexell/MuskEmpireBot/issues/9#issuecomment-2255112696, or unsubscribe https://github.com/notifications/unsubscribe-auth/ARRHIYLPGUFTHRC2YFYCJFDZOXTKNAVCNFSM6AAAAABLR3TYEKVHI2DSMVQWIX3LMV43OSLTON2WKQ3PNVWWK3TUHMZDENJVGEYTENRZGY . You are receiving this because you were mentioned.Message ID: @.***>

avtosubaru25 commented 2 months ago

но у меня не вышло ибо не шарю в джаве может он еще что то мешает кроме этих ключей хотя хеш похож на мд5

пн, 29 июл. 2024 г. в 00:56, Дмитрий Шульц @.***>:

извиняюсь за флуд вот прочто я говорил берем оригенальные АПИ кей время и апи хеш из дев ХРОМА, прогоняем через прогу и смотрим получилось генерить АПИ ХЕШ

import hashlib import hmac

Оригинальные методы

def generate_md5_hash(api_key, api_time): raw_string = f"{api_key}:{api_time}" print(f"MD5 raw string: {raw_string}") return hashlib.md5(raw_string.encode()).hexdigest()

def generate_sha256_hash(api_key, api_time): raw_string = f"{api_key}:{api_time}" print(f"SHA-256 raw string: {raw_string}") return hashlib.sha256(raw_string.encode()).hexdigest()

def generate_sha1_hash(api_key, api_time): raw_string = f"{api_key}:{api_time}" print(f"SHA-1 raw string: {raw_string}") return hashlib.sha1(raw_string.encode()).hexdigest()

def generate_hmac_sha256_hash(api_key, api_time): raw_string = f"{api_key}:{api_time}" print(f"HMAC-SHA256 raw string: {raw_string}") return hmac.new(api_key.encode(), raw_string.encode(), hashlib.sha256).hexdigest()

def generate_hmac_md5_hash(api_key, api_time): raw_string = f"{api_key}:{api_time}" print(f"HMAC-MD5 raw string: {raw_string}") return hmac.new(api_key.encode(), raw_string.encode(), hashlib.md5).hexdigest()

def generate_custom_order_sha256_hash(api_key, api_time): raw_string = f"{api_time}:{api_key}" print(f"Custom Order SHA-256 raw string: {raw_string}") return hashlib.sha256(raw_string.encode()).hexdigest()

def generate_custom_order_md5_hash(api_key, api_time): raw_string = f"{api_time}:{api_key}" print(f"Custom Order MD5 raw string: {raw_string}") return hashlib.md5(raw_string.encode()).hexdigest()

Новые методы

def generate_custom_md5_variant(api_key, api_time): raw_string = f"{api_key}:{api_time}:secret" print(f"Custom MD5 Variant raw string: {raw_string}") return hashlib.md5(raw_string.encode()).hexdigest()

def generate_custom_sha256_variant(api_key, api_time): raw_string = f"{api_key}:{api_time}:secret" print(f"Custom SHA-256 Variant raw string: {raw_string}") return hashlib.sha256(raw_string.encode()).hexdigest()

def generate_hmac_sha256_variant(api_key, api_time): raw_string = f"{api_key}:{api_time}" print(f"HMAC-SHA256 Variant raw string: {raw_string}") return hmac.new("secret_key".encode(), raw_string.encode(), hashlib.sha256).hexdigest()

Функция сравнения

def compare_hashes(api_key, api_time, original_hash): methods = { "MD5": generate_md5_hash, "SHA-256": generate_sha256_hash, "SHA-1": generate_sha1_hash, "HMAC-SHA256": generate_hmac_sha256_hash, "HMAC-MD5": generate_hmac_md5_hash, "Custom Order SHA-256": generate_custom_order_sha256_hash, "Custom Order MD5": generate_custom_order_md5_hash, "Custom MD5 Variant": generate_custom_md5_variant, "Custom SHA-256 Variant": generate_custom_sha256_variant, "HMAC-SHA256 Variant": generate_hmac_sha256_variant, }

for name, method in methods.items():
    generated_hash = method(api_key, api_time)
    if generated_hash == original_hash:
        print(f"Method '{name}' generated the correct hash:

{generated_hash}") else: print(f"Method '{name}' generated a different hash: {generated_hash}")

if name == "main": api_key = "01ab5671ba1c7a8fac3d379e770df491f2f70750884bf412ec5e6e244ed4c39e" api_time = "1722119719" original_hash = "fb2deda64b34b594a7a5a7edef1466b2"

compare_hashes(api_key, api_time, original_hash)

пн, 29 июл. 2024 г. в 00:11, Alexander @.***>:

Создал отдельную ветку hast-test, прописал генерацию хеша и установку заголовков в первые функции, которые выполняются ботом по порядку. Все равно он получает 401 и в get_dbs и в get_profile, если удастся это исправить, потом в остальные можно будет прописать. Посмотрите, может я что-то упустил.

— Reply to this email directly, view it on GitHub https://github.com/Alexell/MuskEmpireBot/issues/9#issuecomment-2255112696, or unsubscribe https://github.com/notifications/unsubscribe-auth/ARRHIYLPGUFTHRC2YFYCJFDZOXTKNAVCNFSM6AAAAABLR3TYEKVHI2DSMVQWIX3LMV43OSLTON2WKQ3PNVWWK3TUHMZDENJVGEYTENRZGY . You are receiving this because you were mentioned.Message ID: @.***>

seriowag commented 2 months ago

похоже это чтото другое. у меня локально логин проходит без хэш и тайм.

я сточку убрал в логин методе
# await self.set_hash_headers(data=json_data)

и в консоле

2024-07-29 10:13:30 | SUCCESS  | 427 | sw-musk-1 | Login successful
2024-07-29 10:13:31 | ERROR    | 120 | sw-musk-1 | Database error: 401, message='Unauthorized', url=URL('https://api.muskempire.io/dbs')
iLimus commented 2 months ago

Я не специалист по WEB... Может чушь напишу, но... Может это время в каждом заголовке должно быть больше предыдущего? Поэтому и не прошел запрос в боте, аналогичный тому, что был в дебагере....

avtosubaru25 commented 2 months ago

ну там даже первый пост запрос не проходит ТРУ поэтому далее это уже не важно пока , а так то возможно дальше не проходил например

пн, 29 июл. 2024 г. в 03:56, iLimus @.***>:

Я не специалист по WEB... Может чушь напишу, но... Может это время в каждом заголовке должно быть больше предыдущего? Поэтому и не прошел запрос в боте, аналогичный тому, что был в дебагере....

— Reply to this email directly, view it on GitHub https://github.com/Alexell/MuskEmpireBot/issues/9#issuecomment-2255617457, or unsubscribe https://github.com/notifications/unsubscribe-auth/ARRHIYKPOYMSGP2PMWWTW3LZOYNU7AVCNFSM6AAAAABLR3TYEKVHI2DSMVQWIX3LMV43OSLTON2WKQ3PNVWWK3TUHMZDENJVGYYTONBVG4 . You are receiving this because you were mentioned.Message ID: @.***>

iLimus commented 2 months ago

Т.е. это самый первый запрос от приложения на сервер и он не проходит? До него приложение совсем ничего не получает? Можно скинуть обмен приложения, самое начало, от запуска, пару-тройку запросов? Входящие и исходящие... Может что замечу/заметим...

seriowag commented 2 months ago

может они что-то в куки прописывают. я в боте не видел чтобы они считывались и просаживались

image

Alexell commented 2 months ago

@seriowag логин действительно проходит, в нем похоже забыли или не стали делать проверки, все равно дальше него не пройти. @iLimus это и так понятно, что время и рассчет хеша с учетом времени, при каждом запросе разный, берется текущий unixtime. @seriowag нет, я не видел у них кук вообще, там только куки то ли Google Analytics, то ли CloudFlare, не помню уже.

Актуальная информация: по хешу вопрос закрыт, с ним все хорошо. Но ошибка авторизации сохранилась. Мне тут один человечек помогал тестить и у нас появилась теория о том, что проблема вообще не в хеше. Возможно скоро все починим.

BigNeam commented 2 months ago

@seriowagрегистрация действительно проходит, в нем видно забыли или не стали делать проверки, все равно дальше его не пройти. @iLimusэто и так понятно, что время и рассчет хеша с учетом времени, при каждом запросе разный, берется текущий unixtime. @seriowagнет, я не видел у них кук вообще, там только куки то ли Google Analytics, то ли CloudFlare, не помню уже.

Актуальная информация: по хешу вопрос закрыт, с ним все хорошо. Ошибка авторизации сохранилась. Мне тут один человечек вызвал тестить и у нас появилась теория о том, что проблема вообще не в хеше. Возможно скоро все починим.

Буду ждать от Вас хороших новостей. Спасибо за ваш труд.

seriowag commented 2 months ago

Похоже да, хеш и время используется только для валидации реквест пейлода. а так как веб асинхронно делают и реквесты параллельно идут, время может быть одинаковое Ждем апдейта

Duwaz commented 2 months ago

Создал отдельную ветку hast-test

Спасибо за ветку

——

Бот работает, если в ветке заменить эту строку: json_string = json.dumps(data, separators=(',', ':')) -> json_string = json.dumps(data)

Оказывается по умолчанию при отправке json'а лишние пробелы в запросе не удаляются о_О

——

Ещё меня смущает, что в запросе /dbs у бота не указывается параметр 'lang'. Вроде мелочь, но кто его знает

asafov commented 2 months ago

Подтверждаю, что метод выше работает. Нужно теперь только везде навтыкать await self.set_hash_headers(data=json_data) где требуется. Где массив не объявлен - там {} видимо.

Alexell commented 2 months ago

А я был так близок к решению... Аж смешно, что дело было в json.dumps. В ближайшее время всё проверю, допишу set_hash_headers и выкачу обнову.

asafov commented 2 months ago

А я был так близок к решению... Аж смешно, что дело было в json.dumps. В ближайшее время всё проверю, допишу set_hash_headers и выкачу обнову.

Главное - итоговый результат) Для этого и нужно комьюнити)