Майним крипто-пойнты с помощью цветового автокликера на Python

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

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

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

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

Механика мини игры внутри этого приложения такая: в течение небольшого времени сверху падают цветочки, которые нужно ловить простым нажатием. За них и начисляют очки. Однако, недавно в игре появились еще и бомбочки, при нажатии на которые счет обнуляется.

cacc8d096b19cb1b4e046a236d79e4dc.png

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

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

import pyautogui
import keyboard
import time

Pyautogui будет управлять мышью и определять цвет пикселя, на который наведен курсор. Keyboard нужен для назначения горячих клавиш, а time для временной задержки.

Назначим три переменные.

work = False
points = [(0, 0) for _ in range(20)]
index = 0

Work будет отвечать за работу кода в бесконечном цикле. Если True- выполняется следующая функция, если False — всё останавливается. Points содержит координаты двадцати точек, изначально равные нулю, так как мы их будем назначать после запуска программы. А index нужен, чтобы демонстрировать пользователю, какую по счету точку он назначает. И сразу напишем функцию присваивания координат точкам для кликов.

def mouse_posotion():
    global index
    x, y = pyautogui.position()
    points[index] = x, y
    print(f'Координаты точки {index + 1}: X: {x}, Y: {y}', end='\r')
    index += 1
    if index > 19:
        index = 0

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

Следующая функция будем изменять значение переменной work и срабатывать так же при нажатии горячей клавиши. Она будет ставить на паузу работу автокликера.

def change_clicker():
    global work
    work = not work

Теперь функция самого кликера.

def clicker(points: list):
    for point in points:
        screenshot = pyautogui.screenshot()
        color = screenshot.getpixel((point[0], point[1]))
        if color[0] in range(134, 218) and color[1] != color[2]:
            pyautogui.click(point[0], point[1])

    time.sleep(0.0001)

В цикле for программа пробегает по всем координатам для клика мышью, но на каждой итерации делается снимок экрана, и перед нажатием определяется цвет пикселя, на который указывает курсор. Важно, что метод getpixel возвращает кортеж с тремя числами, которые характеризую цвет по системе RGB. Методом тыка я пришел к выводу, что для определения цветка нам достаточно, чтобы первое число в картеже было в диапазоне от 134 до 218, а вот если второе и третье число равны, это уже свидетельствует о сером оттенке, в которые выкрашены бомбы, и на такое кликать не стоит. Соответствующие условия я и передал в конструкцию if.

Ну и основная функция, которая будет записывать координаты для кликов нажатием на горячую клавишу »=» и запускать кликер нажатием на »~».

def main():
    keyboard.add_hotkey('`', change_clicker)
    keyboard.add_hotkey('=', mouse_posotion)

    try:
        while True:
            if work:
                clicker(points)

    except KeyboardInterrupt:
        print('\nВыход из программы')


if __name__ == '__main__':
    main()

Вот такая простенькая, но многофункциональная программа получилась. Код целиком:

"""
После запуска скрипта необходимо назначить координаты двадцати кликов:
1. Переместить курсор в нужное место.
2. Нажать клавишу '=' (равно). В коносли будут прописаны номер точки и координаты.
Повторить для каждой из 20 позиций кликов.
3. Для запуска кликера нажать тильду (Ё).
4. Остановить кликер - нажать тильду (Ё).
"""

import pyautogui
import keyboard
import time

work = False
points = [(0, 0) for _ in range(20)]
index = 0

def mouse_posotion():
    global index
    x, y = pyautogui.position()
    points[index] = x, y
    print(f'Координаты точки {index + 1}: X: {x}, Y: {y}', end='\r')
    index += 1
    if index > 19:
        index = 0

def change_clicker():
    global work
    work = not work

def clicker(points: list):
    for point in points:
        screenshot = pyautogui.screenshot()
        color = screenshot.getpixel((point[0], point[1]))
        if color[0] in range(134, 218) and color[1] != color[2]:
            pyautogui.click(point[0], point[1])

    time.sleep(0.0001)


def main():
    keyboard.add_hotkey('`', change_clicker)
    keyboard.add_hotkey('=', mouse_posotion)

    try:
        while True:
            if work:
                clicker(points)

    except KeyboardInterrupt:
        print('\nВыход из программы')


if __name__ == '__main__':
    main()

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

Поэкспериментировать же с озвученным проектом возможно только лишь в случае, если у вас есть инвайт (пригласительная ссылка). К сожалению, у меня они уже закончились, поэтому поспрашивайте у знакомых либо в моем телеграм-канале под соответствующими постами.

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

© Habrahabr.ru