Skip to content

Автокликер Hamster Kombat на python

В этом мануале напишем python скрипт, который будет прокачивать самые прибыльные карточки и тапать хомяка раз в 3 часа. Потом настроим автоматическую работу этого скрипта на сервере

DANGER

Администрация проекта не одобряет использование автокликеров. Все действия выполняйте на свой страх и риск

Подготовка проекта

Для начала работы нам потребуется установить интерпретатор питона и редактор кода PyCharm

Открываем редактор, создаём проект. При создании проекта выбираем New environment using VirtualenvОкно создания проекта

В корне проекта создаём файл hamster.py

Основной файл с кодом

Написание кода

WARNING

Код написан с упором на понимание новичками, а не на качество, отказоустойчивость и расширяемость

Устанавливаем библиотеку для запросов к серверу командой:

 ./venv/bin/pip install requests

В файл hamster.py пишем следующий код. Подробности, что и зачем делается указаны в комментариях в коде

py
import requests
import time

# Код, который даст серверу понять какой именно пользователь прислал запрос
# Нужно вытащить из приложения. См. раздел после кода
ACCESS_TOKEN = '1718729242311wereGdwJu4d6H1HyGnR2C2AsleCeVVnhRmWtLYXQC0LgfpCWNOz97Q2d3msjIOGL7331323387'


# Запускаем нужные действия. Можно оставить только тап или только апгрейд карточек
def main():
    tap_hamster()
    upgrade_best(3)
    daily_reward()


# Делает максимально доступное количество тапов
def tap_hamster():
    print('Тапаем хомяка')

    # получаем с сервера количество доступных тапов
    resp = call_server('clicker/sync')
    available_taps = resp['clickerUser']['availableTaps']
    earn_per_tap = resp['clickerUser']['earnPerTap']

    # считаем количество тапов которые можно сделать
    new_count = available_taps // earn_per_tap
    new_available_taps = available_taps - new_count * earn_per_tap

    # формируем тело запроса
    data = {
        'count': new_count,
        'availableTaps': new_available_taps,
        'timestamp': int(time.time())
    }

    # отправляем запрос на тап
    resp_tap = call_server('clicker/tap', data)

    print('Монет до: ' + str(int(resp['clickerUser']['balanceCoins'])) +
          ' Монет после ' + str(int(resp_tap['clickerUser']['balanceCoins'])))


# Покупает самую выгодную карточку (одну или несколько)
def upgrade_best(count=1):
    # получаем с сервера доступные апгрейды
    upgrades = call_server('clicker/upgrades-for-buy')['upgradesForBuy']

    # получаем с сервера баланс
    balance = int(call_server('clicker/sync')['clickerUser']['balanceCoins'])

    # фильтруем карточки доступные для апгрейда
    upgrades = [
        upgrade for upgrade in upgrades
        if upgrade['isAvailable']
           and not upgrade['isExpired']
           and upgrade['price'] != 0
           and upgrade['profitPerHourDelta'] != 0
           and upgrade['price'] <= balance
           and (upgrade.get('cooldownSeconds') is None or upgrade.get('cooldownSeconds') == 0)
    ]

    # Вычисление прибыли от апгрейда
    for upgrade in upgrades:
        upgrade['upgradeCost'] = upgrade['price'] / upgrade['profitPerHourDelta']

    # Сортировка по стоимости апгрейда
    upgrades = sorted(upgrades, key=lambda x: x['upgradeCost'])

    # Берём нужное количество карточек
    upgrades = upgrades[:count]

    if len(upgrades) == 0:
        print('Недостаточно монет для апгрейда')
        return

    # Улучшаем отфильтрованные карточки
    for upgrade in upgrades:
        print(f"Улучшаем карточку {upgrade['name']}. Стоимость {upgrade['price']} Прибыль {upgrade['profitPerHour']}")
        data = {'upgradeId': upgrade['id'], 'timestamp': int(time.time())}
        upgrade_resp = call_server('clicker/buy-upgrade', data)
        if upgrade_resp.get('error_code'):
            print(f"Ошибка: {upgrade_resp['error_message']}")
            break
        else:
            print(f"Карточка улучшена. Профит в час {upgrade_resp['clickerUser']['earnPassivePerHour']}")


# Забирает ежедневную награду
def daily_reward():
    print('Получаем ежедневную награду')
    resp = call_server('clicker/check-task', {'taskId': 'streak_days'})
    print(f"Дневная награда получена. Баланс монет {int(resp['clickerUser']['balanceCoins'])}")


# отправляет POST запрос на сервер и возвращает ответ
def call_server(path, data=None):
    url = 'https://api.hamsterkombat.io/' + path

    headers = {
        'Connection': 'keep-alive',
        'accept': 'application/json',
        'authorization': 'Bearer ' + ACCESS_TOKEN,
        'User-Agent': 'Mozilla/5.0 (Linux; Android 14; SM-A205U) AppleWebKit/537.36 (KHTML, like Gecko) '
                      'Chrome/126.4.6478.71 Mobile Safari/537.36',
        'content-type': 'application/json',
        'Origin': 'https://hamsterkombat.io',
        'X-Requested-With': 'org.telegram.messenger',
        'Sec-Fetch-Site': 'same-site',
        'Sec-Fetch-Mode': 'cors',
        'Sec-Fetch-Dest': 'empty',
        'Referer': 'https://hamsterkombat.io/',
        'Accept-Language': 'en,ru-RU;q=0.8,ru;q=0.7,en-US;q=0.6'
    }

    response = requests.post(url, headers=headers, json=data)
    return response.json()


# Запуск main функцию
if __name__ == '__main__':
    main()

Получение токена авторизации

Чтобы знать кто именно отправляет запрос к серверу, используется уникальный для каждого пользователь токен. Этот token отправляется игрой в каждом запросе к серверу.

Т.к. hamster это web приложение запускаемое в WebView, самый простой способ достать токен - использовать удалённую отладку браузера Chrome.

Подключение Android устройства

Сначала нужно включить режим разработчика:

  • Откройте настройки устройства
  • Перейдите в раздел "О телефоне"
  • Найдите пункт "Номер сборки"
  • Нажмите на "Номер сборки" 7 раз подряд
  • Введите PIN-код или пароль, если телефон попросит

Затем нужно включить отладку по usb:

  • Откройте настройки устройства
  • Перейдите в новый раздел "Для разработчиков"
  • Найдите и включите опцию "Отладка по USB"

Теперь нужно подключить телефон usb кабелем:

  • Подключите кабель
  • Подтвердите разрешение на подключение отладки по USB
  • В списке уведомлений нажмите на "Зарядка устройства через USB"
  • Выберите режим "Передача файлов"

Готово, теперь можно подключать отладчик

Подключение к отладчику

На телефоне запускаем телеграм и бота Hamster Kombat

На компьютере запускаем Google Chrome и открываем страницу chrome://inspect

Если предыдущие шаги выполнены верно, то увидим подключенный телефон и в нём вкладку Hamster Kombat.

Отладчик Chrome

Получение токена авторизации

Нажимаем кнопку Inspect под вкладкой Hamster Kombat.

Откроется такой же отладчик как и на обычных сайтах (да, эта игра просто сайт).

Нажимаем на хомяка пару раз и ждём когда во вкладке Сеть появится запрос оканчивающийся на tap. Нажимаем на него и на Заголовки находим authorization. Строка после Bearer и есть искомый токен. Копируем его в скрипт в переменную ACCESS_TOKEN

Token в отладчике

Запуск кода

Заменяем значение переменной ACCESS_TOKEN на своё и в функции main оставляем вызов нужных функций

Запускаем написанную программу командой в терминале:

shell
./venv/bin/python hamster.py

Или прямо из PyCharm выбрав в контекстном меню RunЗапуск из контекстого меню

Наблюдаем как скрипт тапает все доступные монеты и апгрейдит самые выгодные карточки: Результат работы скрипта

Автоматическая работа скрипта

Дорабатываем скрипт чтобы он запускал нужные нам действия в разное время. Заменяем содержимое функции main на следующее:

py
from datetime import datetime
import pytz

def main():
    # Получаем текущее время
    date = datetime.now(pytz.timezone('Europe/Moscow')).strftime('%H:%M')
    print(f'Запуск {date}')

    # В нужное время запускаем нужное дейсвие
    if date in ['09:30', '11:30', '13:30', '15:30', '17:30', '19:30']:
        tap_hamster()
    elif date in ['10:00', '12:00', '14:00', '15:00']:
        upgrade_best(2)
    elif date in ['10:00', '20:00']:
        daily_reward()
    else:
        print('Ничего не запланировано')

Импорты нужно разместить рядом с другими импортами и дополнительно установить библиотеку для работы с часовыми поясами командой

shell
./venv/bin/pip install pytz

Теперь нужно сделать чтобы скрипт автоматически работал без нашего участия

Для этого нам понадобится сервер с ubuntu работающий постоянно и подключённый к интернету. Если у вас такого нет - арендуйте самый дешёвый VPS у timeweb или adminvps или поискать что-то подешевле в каталоге

После покупки VPS у вас должен быть адрес сервера, логи и пароль. Что-то наподобие

ip: 100.31.53.154
username: root
password: PassUWd4nU4Chc72

Подключаемся к серверу используя терминал или программу putty. Из терминала делается это командой

shell
ssh root@100.31.53.154

После подключения к серверу создаём папку где будет размещён скрипт и переходим в эту папку

mkdir /hamster
cd /hamster

Устанавливаем python

shell
apt install python3-venv
python3 -m venv venv
./venv/bin/pip install requests pytz

Копируем на сервер свой скрипт. Либо командой в терминале

shell
rsync hamster.py root@65.109.133.232:/hamster

Так же можно это сделать через PyCharm использую функцию Remote Servers

Настраиваем автоматический запуск нашего скрипта через cron. Вводим команду:

shell
crontab -e

В открывшемся редакторе в конец вводим следующий текст:

* * * * * cd /hamster && ./venv/bin/python hamster.py >> hamster.log

Теперь ждём пару минут и смотрим что вывелось в лог командой:

shell
tail -100 /hamster/hamster.log

Это всё, от сервера можно отключаться. cron будет запускать скрипт самостоятельно