привет от новорега (4 года на форуме) Зачем нужна эта статья? Уже было создано +100500 тем с разными авто-кликерами для мини-игры Blum, но у них есть несколько проблем: 1. Максимум сколько мне удавалось собрать с такими авто-кликерами: 250 поинтов 2. Иногда случайно ловятся бомбыПо этой причине предлагаю вам альтернативу в виде использования Blum API для фарма поинтов в мини-игре!Плюсы использования Blum API для фарма: 1. Можно фармить практически максимальное кол-во поинтов 2. Во время работы можно использовать комп, тк в отличии от авто-кликера это не макросМинусы использования Blum API для фарма: Возможно за использование подобных возможностей API может прилететь бан! (хотя я думаю что это маловерятно, лично я использую этот метод на протяжении двух недель, и все норм. + в программу на всякий случай добавлена рандомизация поинтов от 260 до 280) Приступим к установке и настройке! Устанавливаем Python 1. Заходим на официальный сайт Python и скачиваем последнюю версию ПО 2. При установке обязательно нажмите галочку 'Add Python to PATH' Получаем токен авторизации Blum Активируем функцию инспектирования страницы в Telegram 1. В Telegram Desktop переходим в настройки, нажимаем Advanced 2. Далее листаем в самый низ и нажимаем Experimental settings 3. Листаем чуть ниже и включаем Enable webview inspecting Инспектируем страницу и получаем токен авторизации Blum 1. Заходим в Blum, нажимаем ПКМ по пустой области, и выбираем инспектирование страницы 2. Сверху выберите вкладку Сеть(Network) 3. Ниже у вас появятся множество запросов к серверу, вам нужно выбрать любой XHR запрос 4. Справа у вас появится колонка с заголовками, листайте ниже и найдите заголовок Authorization 5. Справа заголовка располагается заветный токен, скопируйте его, он должен быть такого формата Подготавливаем и запускаем скрипт 1. Для начала создайте скрипт main.py и вставьте туда следующий код import requests import random import time #constants URL_ME = "https://user-domain.blum.codes/api/v1/user/me" URL_BALANCE = "https://game-domain.blum.codes/api/v1/user/balance" URL_PLAY_GAME = "https://game-domain.blum.codes/api/v1/game/play" URL_CLAIM_REWARD = "https://game-domain.blum.codes/api/v1/game/claim" MIN_POINTS = 260 MAX_POINTS = 280 MIN_SLEEP_TIME = 35 MAX_SLEEP_TIME = 45 class InvalidToken(Exception): ... class BlumAPI: def __init__(self, authorization_token) -> None: self.headers = { 'Authorization': authorization_token } def request(self, request_method, url, payload=None): response = getattr(requests, request_method)(url, headers=self.headers, data=payload) if response.status_code in [401]: raise InvalidToken(response.text) return response def get_me(self): response = self.request('get', URL_ME) if not response.ok: raise Exception(f'Проблема при получении имени пользователя!\nТекст ошибки с сервера: {response.text}') return response.json() def get_balance(self): response = self.request('get', URL_BALANCE) if not response.ok: raise Exception('Проблема при получении баланса!\nТекст ошибки с сервера: {response.text}') return response.json() def play_game(self): response = self.request('post', URL_PLAY_GAME) if not response.ok: raise Exception(f'При попытке сыграть в игру произошла ошибка!\nТекст ошибки с сервера: {response.text}') return response.json() def claim_reward(self, game_id: str, points: int): payload = { 'gameId': game_id, 'points': points } response = self.request('post', URL_CLAIM_REWARD, payload=payload) if not response.ok: raise Exception(f'При попытке собрать награду произошла ошибка!\nТекст ошибки с сервера: {response.text}') def main(): autorization_token = input('Введи токен авторизации Blum: ') try: while True: blum_api = BlumAPI(authorization_token=autorization_token) username = blum_api.get_me().get('username') while True: print(f'\nПривет {username}! Что вы хотите сделать?\n1. Я хочу получить поинты за игры\n2. Прошлая сессия крашнулась, я хочу получить поинты за игру которая началась.') choice = input('Сделайте свой выбор (1 - 2): ') if choice == '1': balance_data = blum_api.get_balance() avilable_balance, game_passes = float(balance_data.get('availableBalance')), balance_data.get('playPasses') print(f'\nБаланс вашего аккаунта: {avilable_balance}\nКол-во доступных игр на вашем аккаунте: {game_passes}') while True: games_count = int(input(f'\nВыберите кол-во игр которое хотите сыграть: ')) if isinstance(games_count, int): if 0 < games_count <= game_passes: break print('Введите допустимое число!') continue for game_number in range(1, games_count + 1): print(f'\n[+] Игра номер {game_number} была взята в обработку!') response = blum_api.play_game() game_id = response.get('gameId') points = random.randrange(MIN_POINTS, MAX_POINTS) sleep_time = random.randrange(MIN_SLEEP_TIME, MAX_SLEEP_TIME) print(f'[+] Игра номер {game_number} была успешно начата!\nИдентификатор вашей игры: {game_id}') print(f'[+] Ждем {sleep_time} секунд до завершения игры...') time.sleep(sleep_time) blum_api.claim_reward(game_id, points) avilable_balance += points print(f'[+] Игра номер {game_number} была успешно отработана!\n\nВы получили: {points}\nБаланс: {avilable_balance}') time.sleep(1) print('\n[+] Все игры были успешно отработаны!') input('Нажмите ENTER для продолжения...') elif choice == '2': game_id = input('Введите идентификатор вашей игры: ') points = random.randrange(MIN_POINTS, MAX_POINTS) blum_api.claim_reward(game_id, points) print(f'\n[+] Успех! Вы получили {points}!\nНомер игры: {game_id}') input('Нажмите ENTER для продолжения...') else: print('\nНеверный ввод!\nПожалуйста, выберите 1 или 2!') time.sleep(1.5) except InvalidToken as e: print(f'\nОшибка с токеном, возможные причины:\n1. Токен устарел, введите новый токен!\n2. Возможно ошибка на стороне сервера, повторите попытку чуть позже!\n\nТекст ошибки полученный с сервера: {e}') except Exception as e: print(f'\nERROR! {e}') if __name__ == '__main__': main() Python import requests import random import time #constants URL_ME = "https://user-domain.blum.codes/api/v1/user/me" URL_BALANCE = "https://game-domain.blum.codes/api/v1/user/balance" URL_PLAY_GAME = "https://game-domain.blum.codes/api/v1/game/play" URL_CLAIM_REWARD = "https://game-domain.blum.codes/api/v1/game/claim" MIN_POINTS = 260 MAX_POINTS = 280 MIN_SLEEP_TIME = 35 MAX_SLEEP_TIME = 45 class InvalidToken(Exception): ... class BlumAPI: def __init__(self, authorization_token) -> None: self.headers = { 'Authorization': authorization_token } def request(self, request_method, url, payload=None): response = getattr(requests, request_method)(url, headers=self.headers, data=payload) if response.status_code in [401]: raise InvalidToken(response.text) return response def get_me(self): response = self.request('get', URL_ME) if not response.ok: raise Exception(f'Проблема при получении имени пользователя!\nТекст ошибки с сервера: {response.text}') return response.json() def get_balance(self): response = self.request('get', URL_BALANCE) if not response.ok: raise Exception('Проблема при получении баланса!\nТекст ошибки с сервера: {response.text}') return response.json() def play_game(self): response = self.request('post', URL_PLAY_GAME) if not response.ok: raise Exception(f'При попытке сыграть в игру произошла ошибка!\nТекст ошибки с сервера: {response.text}') return response.json() def claim_reward(self, game_id: str, points: int): payload = { 'gameId': game_id, 'points': points } response = self.request('post', URL_CLAIM_REWARD, payload=payload) if not response.ok: raise Exception(f'При попытке собрать награду произошла ошибка!\nТекст ошибки с сервера: {response.text}') def main(): autorization_token = input('Введи токен авторизации Blum: ') try: while True: blum_api = BlumAPI(authorization_token=autorization_token) username = blum_api.get_me().get('username') while True: print(f'\nПривет {username}! Что вы хотите сделать?\n1. Я хочу получить поинты за игры\n2. Прошлая сессия крашнулась, я хочу получить поинты за игру которая началась.') choice = input('Сделайте свой выбор (1 - 2): ') if choice == '1': balance_data = blum_api.get_balance() avilable_balance, game_passes = float(balance_data.get('availableBalance')), balance_data.get('playPasses') print(f'\nБаланс вашего аккаунта: {avilable_balance}\nКол-во доступных игр на вашем аккаунте: {game_passes}') while True: games_count = int(input(f'\nВыберите кол-во игр которое хотите сыграть: ')) if isinstance(games_count, int): if 0 < games_count <= game_passes: break print('Введите допустимое число!') continue for game_number in range(1, games_count + 1): print(f'\n[+] Игра номер {game_number} была взята в обработку!') response = blum_api.play_game() game_id = response.get('gameId') points = random.randrange(MIN_POINTS, MAX_POINTS) sleep_time = random.randrange(MIN_SLEEP_TIME, MAX_SLEEP_TIME) print(f'[+] Игра номер {game_number} была успешно начата!\nИдентификатор вашей игры: {game_id}') print(f'[+] Ждем {sleep_time} секунд до завершения игры...') time.sleep(sleep_time) blum_api.claim_reward(game_id, points) avilable_balance += points print(f'[+] Игра номер {game_number} была успешно отработана!\n\nВы получили: {points}\nБаланс: {avilable_balance}') time.sleep(1) print('\n[+] Все игры были успешно отработаны!') input('Нажмите ENTER для продолжения...') elif choice == '2': game_id = input('Введите идентификатор вашей игры: ') points = random.randrange(MIN_POINTS, MAX_POINTS) blum_api.claim_reward(game_id, points) print(f'\n[+] Успех! Вы получили {points}!\nНомер игры: {game_id}') input('Нажмите ENTER для продолжения...') else: print('\nНеверный ввод!\nПожалуйста, выберите 1 или 2!') time.sleep(1.5) except InvalidToken as e: print(f'\nОшибка с токеном, возможные причины:\n1. Токен устарел, введите новый токен!\n2. Возможно ошибка на стороне сервера, повторите попытку чуть позже!\n\nТекст ошибки полученный с сервера: {e}') except Exception as e: print(f'\nERROR! {e}') if __name__ == '__main__': main() 2. Далее нужно установить модуль requests, откройте консоль и пропишите следующую команду pip install requests Код pip install requests 3. В той же консоли пропишите команду для запуска скрипта (не забудьте перейти в директорию со скриптом) py main.py Код py main.py 4. Все готово! Следуйте дальнейшим инструкциям в консоли Ну вот и все собственно По желанию можете немного переписать код и добавить многопоточность, но я не уверен насколько это будет безопасно Если у вас появятся проблемы или возникнут вопросы - пишите, по возможности постараюсь всем ответить Надеюсь эта статья для кого то оказалась полезна. Оставляйте свой фидбек, будет интересно почитать. Спасибо за прочтение, удачи
clownery, Здарова,как создать скрипт Python? типо когда я открываю само приложение,у меня просто открывается черная консоль,туда я пишу main.py мне выбивает Traceback (most recent call last): File "<stdin>", line 1, in <module> NameError: name 'main' is not defined. Did you mean: 'min'? >>> я не знаю что делать(
clownery, была тема с ботом для блума с функцией игры за билеты. Там это как раз используется - можно хоть абсолютный максимум выставить в 300 поинтов и у тебя за каждую игру будет столько. Жаль, что за такое побреют
kekayska, хм, можешь скинуть подобную тему если не трудно. я видел ток темы с полноценными ботами которые на API работают где в том числе и абуз мини-игры есть, но там как по мне более муторная настройка, нужно Pyrogram использовать и т.д. в моем же скрипте упор идет упор исключительно на абуз мини-игры и не более. тема создавалась что бы продемонстрировать что так вообще можно абузить мини-игру, тк многие даже не знали об этом, функционал подобных ботов не читают просто включают и все
DirectorRepa, Привет, ты все пункты из инструкции выполнял? :)) В данном случае проблема в том, что винда не может обратится к менеджеру пакетов "pip". Скорее всего у тебя не выставлен путь к директории с pip в переменной среды "PATH" Что бы в этом убедится, можешь открыть консоль и прописать следующую команду: python --version Если я оказался прав, и у тебя появилась ошибка Тогда у тебя есть два пути решения этой проблемы 1. Переустановить python нажав галочку 'Add python to path' 2. Вручную добавить python в переменную среды "PATH", вот гайд (noad) Если я оказался не прав, и ты меня переиграл Тогда скорее всего у тебя в целом не установлен pip, либо возникла какая то другая проблема.
а что если я пытаюсь проинспектировать окно блум, но он у меня не открывается через десктопное приложение, просто висит вечная загрузка
clownery, Решил + по хорошему сделай более неочевидный гайд. В плане ты же через API пиздишь данные тг . Хотя-бы завуалируй инфу
KOKURO, привет! спустя 11 дней с релиза скрипта благодаря тебе была обнаружена первая недоработка в скрипте, спасибо за то что оставил фидбек :)) проблема в том, что после того как значение текущего баланса было получено с сервера, оно больше не обновлялось, и после каждой игры прибавлялось к константному значению. для примера взять твой случай: в самом начале на твоем балансе было 9.558 поинтов, это значение было получено в самом начале скрипта один раз, и поинты за каждую мини-игру прибавлялись не к обновленному балансу на твоем аккаунте, а к этому первому полученному значению :)) скрипт я поправил, если хочешь можешь заменить его. еще такой вопрос тебе: ты снизил разброс получаемых поинтов, почему? переживаешь что за 260 - 280 может прилететь бан, по этому решил снизить?
KOKURO, Все, понял :) Не знаю почему изначально так не сделал, но ты натолкнул на мысль добавить две константы для людей кто хочет задавать свои значения, спасибо
Помогите... Я короче в блокнот закинул код, в cmd написал; pip install requests, дальше чо делать? Еще я хочу спросить куда вводить свой токен и просто по подробнее распишите дальнешие действия или просто ютубчиком закиньте(((
DirectorRepa, я же все расписал в инструкции... создай на рабочем столе файл с расширением .py и запусти, дальше сам поймешь все
clownery, забей, люди, которые хоть чуть-чуть понимают в программировании, должны легко все сделать...
Zhe07Max, да не, я постарался написать гайд так, что бы человек который никогда в жизни питон не скачивал смог запустить скрипт. просто не могу понять че трудного в том что бы создать файлик с .py на конце, засунуть туда скрипт и запустить 0_о
Momobum, А по поводу хамстер комбата, у меня ферма на 12 аккаунтов и 4 ******. Стоят уже месяц. Банов никаких нет.
Долго пришлось помучиться чтобы понять, но всё получилось. Спасибо, работает. Есть ли какие-нибудь изменения?
farg32, хм, а какой в этом смысл если у тебя по умолчанию все запросы должны идти с одного айпишника. мне кажется если ты будешь делать запросы с разных айпишников на один JWT-токен на тебя больше подозрений возникнет
clownery, ясно, понятно. А с чего начать изучение, чтобы хотя бы подобные скрипты научится писать, не говоря уже о ботах? Давно хочу начать, а что куда смотреть нихрена не пойму.
флотзам, судя по этому вопросу запустить скрипт тебе не удалось после запуска в консоли скрипт попросит у тебя ввести токен...
clownery, Привет. Запускаю мейн, вставляю токен, выбираю кол-во игр, энтер жму и выкидывает. Иногда не выкидывает, успевает пару игр отыграть, но потом всё равно выключается мейн. С чем может быть связано?