Appearance
Автокликер 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.

Получение токена авторизации 
Нажимаем кнопку Inspect под вкладкой Hamster Kombat.
Откроется такой же отладчик как и на обычных сайтах (да, эта игра просто сайт).
Нажимаем на хомяка пару раз и ждём когда во вкладке Сеть появится запрос оканчивающийся на tap. Нажимаем на него и на Заголовки находим authorization. Строка после Bearer и есть искомый токен. Копируем его в скрипт в переменную ACCESS_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 будет запускать скрипт самостоятельно
