Друзья, приветствую! Сейчас наблюдается невероятный интерес к телеграмм игре Hamster Kombat. Все тапают этого несчастного хомяка в надежде, что когда-то можно будет продать монеты за реальные деньги. Пока мы все в ожидании, давайте я расскажу, как автоматизировать процесс фарма и тапанья хомяка через Python, используя один интересный проект.

В завершении статьи я поделюсь с вами двумя способами, которые позволят развернуть нашего бота удаленно.

Получаем токен

Для начала выполним небольшую подготовку. Нам необходимо получить специальный токен для автоматизированного тапанья и фарма в Hamster Kombat.

  • Выполняем вход в WEB версию телеграм: web.telegram.org

  • Открываем страницу с Hamster Kombat.

  • Кликаем на Play.

  • Открываем панель разработчика (обычно F12).

  • Переходим в приложение и копируем значение ключа tgWebAppData (скриншот со стрелами ниже).

  • Сохраните данные в надежном месте и не передавайте их третьим лицам!

Устанавливаем скрипт

  1. Открываем терминал.

  2. Вводим команду (клонируем репозиторий проекта):

git clone https://github.com/jawikas/hamsterkombat.git
  1. Открываем созданную директорию в IDE, с которой вы работаете. В моем случае это будет PyCharm.

  1. Устанавливаем зависимости:

pip install -r requirements.txt
  1. Открываем файл tokens.txt и добавляем в него скопированные данные с панели разработчика. Обратите внимание, добавлять нужно без кавычек в начале и в конце скопированной строки. Пример:

query_id=xxxxxxxxx-Rxxxxuj&user=%7B%22id%22%3A1323733375%2C%22first_name%22%3A%22xxxx%22%2C%22last_name%22%3A%22%E7%9A%BF%20xxxxxx%22%2C%22username%22%3A%22xxxxx%22%2C%22language_code%22%3A%22id%22%2C%22allows_write_to_pm%22%3Atrue%7D&auth_date=xxxxx&hash=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
  1. Выполняем запуск:

python main.py

Объяснение опций, которые нас встретят

После запуска скрипта у вас будут следующие опции:

  1. Auto Buy Upgrade (Автоматическое обновление покупки с 3 вариантами метода) - ВКЛ/ВЫКЛ:

    • Upgrade items with the highest profit: Улучшение предметов с наибольшей прибылью.

    • Upgrade items at the lowest price (low price with high profit): Улучшение предметов по самой низкой цене (низкая цена с высокой прибылью).

    • Upgrade items with a price less than balance: Улучшение предметов по цене меньше баланса.

  2. Auto Complete Combo (Автовыполнение ежедневного комбо) - ВКЛ/ВЫКЛ:

  3. Auto Complete Cipher (Автоматическое решение ежедневных шифров морзе) - ВКЛ/ВЫКЛ:

  4. Auto Complete Tasks (Автоматическое решение заданий) - ВКЛ/ВЫКЛ:

  5. По умолчанию, скрипт выполняет следующие действия без необходимости настройки (команда 5):

    • Taps (нажатия)

    • Boost (буст)

    • Daily Streak (ежедневные серии)

Теперь установим необходимые настройки и произведем запуск бота.

Настройки и запуск

Активирую все опции. Для запуска отправляем 5 и жмем на ENTER:

Далее выполнится много действий и на выходе мы доберемся до паузы в 30 минут:

Через 30 минут действия повторяются. Для остановки бота выполняем комбинацию клавиш CTRL + C.

Для того чтоб убедиться, что автофарм выполняется, можно открыть Hamster Combat с мобильного устройства.

У вас после первого запуска картинка будет приятнее, так как автоматически выполнятся несколько заданий и на ваш баланс упадет несколько миллионов монет.
У вас после первого запуска картинка будет приятнее, так как автоматически выполнятся несколько заданий и на ваш баланс упадет несколько миллионов монет.

Автофарм и автотапы в нескольких аккаунтах

Для запуска нескольких аккаунтов, передайте в файл tokens.txt несколько токенов токенов. Каждый новый токен необходимо передавать с новой строки:

query_id=xxxxxxxxx-Rxxxxuj&user=...
query_id=xxxxxxxxx-Rxxxxuj&user=...

В таком случае будет происходить запуск всех аккаунтов, а после будет идти одна общая пауза в 30 минут.

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

Для тех же, кто хочет действительно использовать его 24/7 – читайте далее. Там я расскажу о двух способах удаленного запуска данного проекта.

Подготовка к удаленному запуску

Прежде чем выполнять запуск бота удаленно, внесем некоторые изменения в код. Удобнее задавать опции на старте, тем самым создав условие, при котором бот будет запускаться после ввода команды python main.py.

Изменения в config.json

{
    "min_tap": 138,
    "max_tap": 738,
    "delayUpgrade": 1,
    "DelayPerAccount": 5,
    "tapDelay": true,
    "max_price": 5000000,
    "loop": 1600,
    "auto_upgrade": true,
    "combo_upgrade": true,
    "daily_cipher_on": true,
    "tasks_on": true,
    "upgrade_method": 1
}

Тут, как вы видите, мы добавили следующие параметры: auto_upgrade, combo_upgrade, daily_ciper_on, task_on и upgrade_method. В старой реализации данные параметры мы указывали через терминал (1, 2 и так далее).

Вот описание для каждой настройки и их значений в файле конфигурации:

  1. min_tap: Минимальное количество нажатий. Используется для задания нижнего предела количества нажатий на хомяка.

    • Пример: 138

  2. max_tap: Максимальное количество нажатий. Используется для задания верхнего предела количества нажатий.

    • Пример: 738

  3. delayUpgrade: Задержка перед обновлением (в секундах). Указывает задержку между проверками возможности обновления.

    • Пример: 1

  4. DelayPerAccount: Задержка для каждой учетной записи (в секундах). Указывает задержку между действиями для каждой учетной записи.

    • Пример: 5

  5. tapDelay: Включение/выключение задержки для нажатий. Логическое значение, указывающее, следует ли использовать задержку для нажатий.

    • Пример: true

  6. max_price: Максимальная цена, которая будет использована при покупке обновления.

    • Пример: 5000000

  7. loop: Время цикла (в секундах). Указывает длительность одного цикла работы бота.

    • Пример: 1600

  8. auto_upgrade: Автоматическое обновление. Логическое значение, указывающее, следует ли автоматически покупать обновления.

    • Пример: false

  9. combo_upgrade: Автоматическое выполнение комбо. Логическое значение, указывающее, следует ли автоматически выполнять комбо-действия.

    • Пример: false

  10. daily_cipher_on: Автоматическое выполнение ежедневных шифров.

    • Пример: false

  11. tasks_on: Автоматическое выполнение задач. Логическое значение, указывающее, следует ли автоматически выполнять задачи.

    • Пример: false

  12. upgrade_method: Метод обновления. Указывает метод, который будет использоваться для обновлений. Возможные значения:

    • 1: Обновление по самому высокому профиту.

    • 2: Обновление по самой низкой цене.

    • 3: Обновление по цене, меньше текущего баланса.

    • Пример: 1

Изменения в core.py

import locale
import requests
from colorama import *
from src.utils import load_tokens
from src.auth import get_token, authenticate
from src.exceptions import upgrade_passive, claim_daily, execute, boost, clicker_config
from src.exceptions import _sync, exhausted, execute_combo, claim_cipher

from src.__init__ import (
    mrh, pth, hju, kng,
    read_config, _number, countdown_timer, log,
    log_line,
)

locale.setlocale(locale.LC_ALL, 'en_US.UTF-8')
init(autoreset=True)
config = read_config()

def main():
    auto_upgrade = config.get('auto_upgrade', False)
    combo_upgrade = config.get('combo_upgrade', False)
    daily_cipher_on = config.get('daily_cipher_on', False)
    tasks_on = config.get('tasks_on', False)
    _method = str(config.get('upgrade_method', '1'))

    cek_task_dict = {}
    countPerAccount = config.get('DelayPerAccount', 3)
    loop = config.get('loop', 3600)

    while True:
        try:
            while True:
                init_data_list = load_tokens('tokens.txt')

                for init_data in init_data_list:
                    token = get_token(init_data)
                    if token:
                        try:
                            res = authenticate(token)
                            if res.status_code == 200:
                                user_data = res.json()
                                username = user_data.get('telegramUser', {}).get('username',
                                                                                 'Please set username first')
                                log(kng + f"Login as {pth}{username}")
                                clicker_config(token)
                                clicker_data = _sync(token)
                                if 'clickerUser' in clicker_data:
                                    user_info = clicker_data['clickerUser']
                                    balance_coins = user_info['balanceCoins']
                                    earn_passive_per_hour = user_info['earnPassivePerHour']
                                    exchange_name = user_info['exchangeId']

                                    log(hju + f"Balance: {pth}{_number(balance_coins)}")
                                    log(hju + f"Income: {pth}{_number(earn_passive_per_hour)}/h")
                                    log(hju + f"CEO of {pth}{exchange_name} {hju}exchange")
                                claim_daily(token)
                                while True:
                                    exhausted(token)
                                    if not boost(token):
                                        break
                                if tasks_on:
                                    execute(token, cek_task_dict)
                                if daily_cipher_on:
                                    claim_cipher(token)
                                if combo_upgrade:
                                    execute_combo(token)
                                if auto_upgrade:
                                    upgrade_passive(token, _method)
                            log_line()
                            countdown_timer(countPerAccount)
                        except requests.RequestException as e:
                            log(mrh + f"Request exception for token {pth}{token[:4]}****: {str(e)}")
                    else:
                        log(mrh + f"Failed to login token {pth}{token[:4]}*********\n", flush=True)
                countdown_timer(loop)
        except Exception as e:
            log(mrh + f"An error occurred in the main loop: {kng}{str(e)}")
            countdown_timer(10)

if __name__ == '__main__':
    main()

Создание Docker контейнера

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

# Используем новый облегченный образ Python
FROM python:3.12-alpine

# Устанавливаем рабочую директорию в контейнере
WORKDIR /app

# Копируем файл requirements.txt в рабочую директорию
COPY requirements.txt .

# Устанавливаем зависимости из requirements.txt
RUN pip install --no-cache-dir -r requirements.txt

# Копируем остальные файлы приложения в рабочую директорию
COPY . .

# Указываем команду для запуска приложения
CMD ["python", "main.py"]

Создание образа

docker build -t my-hamster-app .

Запуск контейнера

docker run -it -d --name hamster-container my-hamster-app

Для входа в терминал контейнера:

docker attach hamster-container

Команда docker attach hamster-container подключает текущую консоль к уже запущенному контейнеру hamster-container. Это позволяет вам взаимодействовать с контейнером так, как если бы вы работали напрямую в его терминале.

для выхода CTRL + P, CTRL + Q

Деплой на VPS сервере

Теперь вы можете воспользоваться DockerHub: загрузить туда созданный образ и потом скачать его с DockerHub на сервер, либо поступить следующим образом:

  1. Останавливаем контейнер:

    docker stop hamster-container
  2. Удаляем контейнер:

    docker rm hamster-container
  3. Удаляем образ:

    docker rmi my-hamster-app
  4. Подключаемся к серверу по FTP (например, с помощью FileZilla).

  5. Загружаем файлы на сервер.

  1. Создаем образ и запускаем контейнер (как в примере выше).

В рабочих проектах я обычно так не поступаю, прошу не кидать в меня тапки. Просто в данном случае не вижу смысла заморачиваться с приватным репозиторием на GitHub или с репозиторием на DockerHub.

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

ssh root@111.111.111.111
my_pass

Переходим в созданную директорию:

cd ../home/hamster_bot

Убедимся, что все файлы на месте. Теперь создаем образ:

Файлы на месте!
Файлы на месте!
docker build -t my-hamster-app .

Если на вашем сервере не установлен Docker, установите его (в интернете много информации на этот счет).

Теперь запустим контейнер:

docker run -it -d --name hamster-container my-hamster-app

Проверим, все ли работает:

docker attach hamster-container
76 - это первые 2 символа ID контейнера. Можно было вместо 76 ввести hamster-container
76 - это первые 2 символа ID контейнера. Можно было вместо 76 ввести hamster-container

Деплой на Amvera Cloud

Amvera Cloud — это отечественный аналог Heroku, который предоставляет платформу как услугу (PaaS). Это означает, что Amvera Cloud предлагает разработчикам полностью управляемую среду для развертывания, управления и масштабирования приложений без необходимости самостоятельного администрирования серверов, как это требуется при использовании VPS (виртуального частного сервера).

Почему именно этот сервис?

Amvera Cloud берет на себя все хлопоты по разворачиванию проекта. Вам достаточно просто передать файлы бота с написанным Dockerfile и после отправки файлов в сервис произойдет автоматическое разворачивание контейнера.

Другими словами: подготовили файлы бота, подготовили Dockerfile, несколькими командами отправили файлы в Amvera и проект запущен!

К тому же, для тестирования сервиса вам предоставят подарочный баланс в размере 111. Этого хватит на пару недель активного фарма и тапанья вашего хомяка.

  1. Регистрируемся на сайте Amvera Cloud.

  2. Переходим в раздел проектов.

  3. Создаем первый проект. На этом этаме вам необходимо дать название проекту и выбрать тарифный план. Для текущего бота достаточно будет пробного.

  1. Копируем ссылку, указанную стрелкой (скрин ниже).

Данная ссылка нам пригодится чуть позже
Данная ссылка нам пригодится чуть позже
  1. На новом экране нажимаем на завершить.

То есть никакие настройки нам генерировать не нужно. Мы уже все сделали, когда создали наш Dockerfile. Теперь, нам остается доставить файлы в Amvera и данный сервис сам запустит контейнер бота.

Для доставки файлов в Amvera выполним несколько команд в своем локальном терминале.

Инициализируем пустую директорию .git:

git init

Привязываем свой проект:

git remote add amvera https://git.amvera.ru/имя_пользователя/название_проекта

В моем случае это:

git remote add amvera https://git.amvera.ru/yakvenalex/hamsterbot

При первом использовании GIT в связке с Amvera, возможно, нужно будет выполнить авторизацию. Для этого укажите в появившемся окне логин и пароль от личного кабинета Amvera

Теперь загрузим файлы нашего проекта в репозиторий Amvera:

git add .
git commit -m "Init commit"
git push amvera master

Если получите ошибку, что ветка master не существует, выполните команду:

git checkout -b master
git push amvera master
Проверим что файлы доставлены
Проверим что файлы доставлены

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

Завершение

Надеюсь, этот гайд был полезен, и теперь у вас есть понимание, как автоматизировать фарм и тапанье хомяка через Python. Удачи вам в игре и пусть ваши хомяки приносят вам много монет!

Поддержите эту статью лайком, подпиской или комментарием, если хотите и дальше получать подробный разбор необычных проектов на Python. До скорого!

Комментарии (25)