Hamster Kombat: Автоматизация фарма и тапанья хомяка через Python с деплоем

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

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

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

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

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

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

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

79bcfd477c074563a40e410d9d932592.jpgdfd968cca540c1874bc54108f2973d29.jpg

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

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

8c23f1ab3f02324cae60a984444d0122.jpg

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

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

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

git clone https://github.com/jawikas/hamsterkombat.git

ffb2e0fffc66ecf6c2dca994562261f9.jpg

  1. Открываем созданную директорию в IDE, с которой вы работаете. В моем случае это будет PyCharm.

1ed57d9a972f1878e33623cee540c221.jpg

  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

5e4c18123f73b8b792b0a0801018c465.jpg

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

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

  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):

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

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

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

0000aa7dc4ac2e15c3ee83e71d3f4f18.jpg

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

33420c50aa73e397b65bf5422009cdb0.jpg82d54a82ee224d2cdea5373160431ff8.jpg

Через 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 .

ef716962203d7f4ef70cd41cb70b39b5.jpg

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

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. Загружаем файлы на сервер.

f790b48046a01946060e1a83b48a277f.jpg

  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

Вместо использования VPS сервера с Linux и многочисленными командами по настройке, можно воспользоваться отечественным аналогом Heroku — Amvera Cloud.

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

Я решил рассказать о нем, потому что работа с терминалом Linux может отпугнуть новичков: настройка, ввод команд, SSH, установка Docker, деплой файлов и прочее. Для проекта, как данный бот, нет смысла платить 600 рублей и больше, так как требования к железу практически отсутствуют.

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

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

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

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

  3. Создаем первый проект, заполняя следующие поля: На стартовом экране указываем имя проекта, выбираем «приложение» и подбираем тарифный план. Средства с баланса снимаются постепенно, так что в бесплатной версии можно выбрать даже самый мощный тариф. Для примера я возьму самый простой (пробный).

5930dec811fb9513af098ec19b2509e1.jpg

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

62f12d43a46e5a92ff8c6dff5e1f3619.png

  1. На новом экране нажимаем на завершить.

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

Далее выполним несколько команд в своей консоли для доставки файлов в 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

96bb799519d53584fb0dbe92a3543ecf.jpg

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

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

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

git checkout -b master
git push amvera master

Проверим что файлы доставлены

Проверим что файлы доставлены

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

66769af4cdc6297397bc1dc2b9e4892f.png

Завершение

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

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

© Habrahabr.ru