Pull to refresh

Майним крипту и NFT с помощью Python

Level of difficultyEasy
Reading time4 min
Views17K

Прошу сохранять спокойствие, если слова крипта и NFT у вас ассоциируются со словом скам. В этой статье не будет никаких финансовых рекомендаций, рекламы, только программирование. Вообще мне нравится автоматизировать какую-либо деятельность, которая приносит доход, и буквально вчера мне абсолютно случайно на глаза попался обзор некой игровой платформы, представляющей собой NFT-игру в жанре RPG (т.е. все игроки желают с помощью игровых механик преумножить свой капитал, добывая токены). Одна из механик игры просто не позволила мне пройти мимо и не задуматься об её автоматизации, так как выглядит она очень простым, но скучным, и долгим занятием. А это то, что нужно.

Суть её такова: с помощью нехитрых действий в браузере по подтверждению криптовалютных транзакций с шансом в 33% нам дают некие внутриигровые кристаллы обычного качества, либо с шансом в 2% легендарного. Эти кристаллы можно как-то использовать в игре, но я не углублялся. Разработчики так же обещают, что добытые кристаллы можно монетизировать следующим образом: каждый обычный кристалл стоит 10 очков, а легендарный - 120. Если набрать до конца сезона (я так и не понял когда он завершается) 10 000 очков, то в качестве вознаграждения дадут какой-то NFT, а минимум 5000 очков конвертируют в токены SKL. Сколько это человеческих денег, я не знаю, да это и не важно, наш интерес- это выполнить поставленную задачу максимально быстрым и простым способом с помощью навыков программирования.

Обещания разработчиков по поводу монетизации.
Обещания разработчиков по поводу монетизации.

И так, исходя из поставленных условий, следует, что для достижения 10 000 очков необходимо добыть аж 1000 обычных кристаллов, которые выпадают с шансом в 33%. Легендарных понадобится в разы меньше, но и выпадают они почти никогда.

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

Жмем кнопки
Жмем кнопки

Далее некоторое время транзакция обрабатывается и всплывает окно, что никаких кристаллов мы не получили, но нам обязательно повезет в следующий раз.

Повезёт в следующий раз...
Повезёт в следующий раз...

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

Хотел бы отметить, что я зашел в официальный дискорд проекта и увидел там, как тысячи англоговорящих людей жалуются на адские муки, связанные с добычей кристаллов. Бедняги тыкают по кнопкам днем и ночью на всех устройствах и теряют надежду. Жаль конечно этих добряков.

Но нам не до их страданий. Для работы робота я решил использовать свой ноутбук, который обычно стоит без дела и нужен мне только в длительных поездках, так как запущенная программа не даст во время своей работы использовать компьютер по другим назначениям. Кроме того, ноут будет выполнять работу в энергоэффективном режиме, что позволит избежать хоть и небольших, но всё же денежных потерь. И прямо сейчас ноутбук занимается своим делом, а я на основном компьютере пишу эту статью. Ну и иногда поглядываю на "улов", но об этом позже.

Логика нашей простенькой программки будет написана на Python с использованием библиотеки PyAutoGUI. Поэтому создаем новый проект, виртуальное окружение и устанавливаем библиотеку. В зависимости от вашей операционной системы для установки нужно использовать различные команды, смотрите их в документации.

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

import pyautogui
import time

try:
    while True:
        x, y = pyautogui.position()
        print(f'X: {x}, Y: {y}', end='\r')  # Обновляем координаты в одной строке
except KeyboardInterrupt:
    print('\nВыход из программы')

PyAutoGUI позволяет делать клики мышью по нужным областям без передвижения курсора, но чтобы все выглядело максимально человечно я решил курсор двигать и добавил небольшую задержку перед кликом. Кроме того, как оказалось, на ноутбуке окно подтверждения Metamask у меня открывается не полностью и кнопки просто не видно. Поэтому в скрипт я добавил небольшую прокрутку колесиком вниз. Возможно вам этот функционал даже не понадобится.

И еще, некоторые транзакции обрабатываются намного дольше остальных и существует вероятность, когда по истечению заложенной в программе временной задержки она попытается кликнуть на кнопку, пока та еще не будет активна. После этого курсор переедет на место, где обычно открывается окно Metamask, но его там тоже не будет. В итоге программа прокрутит колесиком мышки основной экран и собьёт все координаты, в связи с чем все следующие итерации цикла будут нерабочими. Чтобы этого не происходило, в программу добавлена обязательная прокрутка колесом мыши вверх. На всякий случай.

Наш скрипт незамысловатого кликера готов и выглядит вот так:

import pyautogui
import time


def clicker():
    try:
        while True:
            # Клик левой кнопкой мыши по первой области экрана
            x = 460
            y = 650
            pyautogui.moveTo(x, y)
            time.sleep(1)
            pyautogui.click(button='left')
            #pyautogui.moveRel(50, 50)


            # Ждем 12 секунд
            time.sleep(12)

            # Клик левой кнопкой мыши по второй области экрана
            x = 1515
            y = 555
            pyautogui.moveTo(x, y)
            pyautogui.scroll(-70)
            time.sleep(1)
            pyautogui.click(button='left')
            time.sleep(25)
            pyautogui.scroll(100)
            
    except KeyboardInterrupt:
        print('\nВыход из программы')



if __name__ == '__main__':
    time.sleep(10) # пауза перед запуском функции
    clicker()

На момент написания статьи этот скрипт работает уже более 10 часов и добился некоторых успехов. Внимание на скриншот.

Заработанные честным роботизированным трудом кристаллы
Заработанные честным роботизированным трудом кристаллы

Там еще и парочка легендарных затесалась.

Вот они, редкие животные.
Вот они, редкие животные.

Итого 2430 очков из 10000 за 10 часов. Не так уж и плохо. Есть и другие мысли, как реализовать этот функционал, но не уверен, что будет эффективнее. А меня зовут Тема, большую часть жизни я бегал с пистолетом, а теперь вот ударился в разработку. Но писать о каких-то сложных проектах мне лень. Если что, буду рад увидеть вас в своем telegram или запретограме.

Tags:
Hubs:
If this publication inspired you and you want to support the author, do not hesitate to click on the button
Total votes 16: ↑9 and ↓7+5
Comments25

Articles