Как сделать убегающую кнопку python

Добавил пользователь Владимир З.
Обновлено: 04.10.2024

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

Мы будем использовать модуль клавиатуры, давайте установим его:

Хорошо, откройте интерактивную оболочку Python или записную книжку/лабораторию Jupyter и следуйте инструкциям.
Сначала импортируем модуль:

Добавление горячих клавиш и сокращений

Во-вторых, вы также можете вызывать обратный вызов каждый раз, когда нажимается горячая клавиша:

Проверка нажатия кнопки

Вы также можете проверить, действительно ли нажата кнопка:

Нажатие и отпускание кнопок

Затем вы также можете имитировать нажатие клавиш с помощью функции send() :

Будет сделано нажатие и отпускание кнопки пробела. На самом деле, есть эквивалентная функция press_and_release() , которая делает то же самое.

Вы также можете передать несколько ключей:

Оператор + означает, что мы нажимаем обе кнопки одновременно. Также можно использовать многоступенчатые горячие клавиши:

Но что, если вы хотите нажать определенную клавишу, но не хотите ее отпускать? Что ж, в игру вступают функции press() и release() :

Таким образом, вы нажмете кнопку CTRL, а затем отпустите ее, а пока можете делать все, что угодно, например, поспать несколько секунд и т.д.

Но что теперь, если вы хотите написать длинный текст, а не только определенные кнопки? send() будет неэффективным. К счастью для нас, функция write() делает именно это, она отправляет в ОС искусственные события клавиатуры, имитирующие набор заданного текста, давайте попробуем:

Установка задержки на 0,1 означает 0,1 секунды ожидания между нажатиями клавиш, это будет выглядеть причудливо, как в фильмах о взломе!

Запись и воспроизведение событий на клавиатуре

С помощью этого модуля вы можете сделать еще много интересных вещей, например, записывать события клавиатуры с помощью функции record() и воспроизводить их снова с помощью функции play() :

Я передал esc методу record() для записи нажатий и отжатий клавиш до тех пор, пока я не нажму кнопку esc , а затем мы снова проиграем эти события, используя метод play() .

Вы можете изучить, что содержит список событий, просто распечатав его, или вы можете использовать get_typed_strings() для получения типизированных строк:

Вот что я напечатал:

Еще одна интересная функция — функция on_release() , которая принимает обратный вызов, который выполняется всякий раз, когда отпускается клавиша:

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

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

Заключение

Я только что представил вам модуль, пожалуйста, просмотрите документацию или просто введите help(keyboard) в интерактивной оболочке Python для изучения других функций и методов.

Вы также можете полностью управлять своей мышью, тот же автор этого модуля сделал еще один модуль для работы с мышью!

С такими модулями вы можете создавать сценарии автоматизации рабочего стола, сочетания клавиш, клавиатурные шпионы (хотя автор не несет ответственности) и многое другое!

ст. преп. кафедры ЦЭиИТ. Автор более 130 научных и учебно-методических работ. Лауреат ВДНХ (серебряная медаль). Посмотреть больше записей

Обычные кнопки¶

Кнопки как шаблоны¶

Обратите внимание на конструкцию *buttons . Здесь вам не C++ и звёздочка используется для распаковки списка. Подробнее об операторах * и ** можно прочитать здесь.

Смотрим — действительно красиво:

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

У объекта обычной клавиатуры есть ещё две полезных опции: one_time_keyboard для скрытия кнопок после нажатия и selective для показа клавиатуры лишь некоторым участникам группы. Их использование остаётся для самостоятельного изучения.

Помимо стандартных опций, описанных выше, aiogram немного расширяет функциональность клавиатур параметром row_width . При его использовании, фреймворк автоматически разобьёт массив кнопок на строки по N элементов в каждой, где N — значение row_width , например, row_width=2 . Попробуйте!

Специальные обычные кнопки¶

По состоянию на конец ужасного 2020 года в Telegram существует три специальных вида обычных кнопок, не являющихся шаблонами: для отправки текущей геолокации, для отправки своего номера телефона и ярлык для создания опроса/викторины. Для первых двух типов достаточно установить булевый флаг, а для опросов и викторин нужно передать специальный тип KeyboardButtonPollType и, по желанию, указать тип создаваемого объекта.

Впрочем, проще один раз увидеть код:

Инлайн-кнопки¶

URL-кнопки и колбэки¶

Login- и Pay-кнопки в книге рассматриваться не будут вообще. Если у кого-то есть желание помочь хотя бы с рабочим кодом для авторизации или оплаты, пожалуйста, создайте Pull Request на GitHub. Спасибо!

А если хотите обе кнопки в ряд, то уберите row_width=1 (тогда будет использоваться значение по умолчанию 3).

С URL-кнопками больше обсуждать, по сути, нечего, поэтому перейдём к гвоздю сегодняшней программы — Callback-кнопкам. Это очень мощная штука, которую вы можете встретить практически везде. Кнопки-реакции у постов (лайки), меню у @BotFather и т.д. Суть в чём: у колбэк-кнопок есть специальное значение (data), по которому ваше приложение опознаёт, что нажато и что надо сделать. И выбор правильного data очень важен! Стоит также отметить, что, в отличие от обычных кнопок, нажатие на колбэк-кнопку позволяет сделать практически что угодно, от заказа пиццы до перезагрузки сервера.

Несмотря на то, что параметр кнопки callback_data , а значение data лежит в одноимённом поле data объекта CallbackQuery, собственный фильтр aiogram называется text .

Ой, а что это за часики? Оказывается, сервер Telegram ждёт от нас подтверждения о доставке колбэка, иначе в течение 30 секунд будет показывать специальную иконку. Чтобы скрыть часики, нужно вызвать метод answer() у колбэка (или использовать метод API answer_callback_query() ). В общем случае, в метод answer() можно ничего не передавать, но можно вызвать специальное окошко (всплывающее сверху или поверх экрана):

Когда вызывать answer() ?

В общем случае, главное — просто не забыть сообщить Telegram о получении колбэк-запроса, но я рекомендую ставить вызов answer() в самом конце, и вот почему: если вдруг в процессе обработки колбэка случится какая-то ошибка и бот нарвётся на необработанное исключение, пользователь увидит неубирающиеся полминуты часики и поймёт, что что-то не так. В противном случае, часики исчезнут, а пользователь останется в неведении, выполнился его запрос успешно или нет.

И, казалось бы, всё работает:

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

Фабрика колбэков¶

В aiogram существует т.н. фабрика колбэков. Вы создаёте объект CallbackData , указываете ему префикс и произвольное количество доп. аргументов, которые в дальнейшем указываете при создании колбэка для кнопки.
Например, рассмотрим следующий объект:

В примере выше в кнопку запишется callback_data , равный post:5:like , а хэндлер на префикс post будет выглядеть так:

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

На этом глава про кнопки окончена, но про некоторые других их виды мы поговорим в следующих главах.


Анимация мыши с помощью PyAutoGUI

Цель PyAutoGUI – предоставить кроссплатформенный модуль Python для автоматизации GUI для людей . API разработан так, чтобы быть максимально простым с разумными настройками по умолчанию. Я коснусь только основ этого модуля, также вы можете посмотреть на другие атрибуты и функции в документации модуля PyAutoGUI на PyPI.

Установка

Windows

В Windows гораздо проще установить и использовать PyAutoGUI . Вы можете установить его из PyPI с помощью pip, если у вас установлен pip.

macOS:

В Os X вам необходимо установить несколько дополнительных модулей, чтобы можно было запускать PyAutoGui .

Linux:

В Linux вам нужно установить несколько пакетов.

Начало

Мы разберём следующие вещи, которые вы можете сделать используя PyAutoGUI.

Предохранители

Пауза

Пауза – это опция в PyAutoGUI, которая устанавливает паузу между каждым вызовом модуля. Например: у нас есть две функции: одна записывает а другие кликают, вторая функция выполняется после заданной продолжительности, когда установлена ​​эта опция.

Отказоустойчивость

Этот параметр больше подходит для отмены программы с помощью сочетания клавиш CTRL + C. Если для этого параметра установлено значение True, программа прерывается и выдает pyautogui.FailSafeException исключение, перемещая мышь в верхний левый угол экрана.

Движение мыши

Вы можете переместить мышь в координаты x, y экрана, используя следующую функцию класса pyautogui

где x и y – координаты XY на экране. X направляет направо, Y направляет вниз. Длительность – это время в секундах, в течении которого будет выполнятся это действие.

Есть еще одна функция, которая перемещает мышь относительно текущей позиции мыши, что означает, что она будет перемещать мышь (100 100) влево и вправо от текущей позиции мыши.

Здесь xOffset и yOffset – изменяют положение от текущей позиции мыши x и y соответственно.

Перетаскивание

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

Объяснение этих функций аналогично движению мыши.

Клики

Как вы знаете, есть разные типы кликов, которые мы можем выполнять с помощью мыши вручную. PyAutoGUI может позволить нам использовать многие из этих функций. Некоторые из них:

  • Одиночный, двойной и тройной клик
  • Кнопка мыши верх и вниз
  • Левый, правый и средний щелчок

Синтаксис:

Вы можете использовать click() функцию следующим образом:

Есть также отдельные функции, чтобы получить ту же работу.

Нажатие мыши и перетаскивание состоят из нажатия кнопки мыши, движение вниз, и отпускания ее обратно. Если вы хотите , чтобы выполнить эти действия отдельно, вызовите mouseDown() и mouseUp() функции. Они тоже имеют x , y и button .

Прокрутка

Синтаксис

Вы можете использовать scroll() функцию следующим образом:

Вы можете использовать hscroll() для прокрутки влево и вправо на платформах Linux и OSX.

Клавиатура

Написание

Вы можете написать алфавит, слово или предложение с помощью функции из класса pyautogui. Он также предлагает задержку между каждым набирающим словом, что делает его более фантастическим.

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

Нажатие клавиш

Чтобы нажать эти клавиши, вызовите press() функцию и передайте ей определенные значения в строке.

Чтобы нажать более одной клавиши, передать список, он принимает другой необязательный атрибут, presses=1 который ограничивает количество нажатий клавиш (клавиши).

Существует также еще один атрибут interval=0.0 – интервал между нажатиями клавиш.

Ключи для этой функции определены и могут быть получены с помощью следующей опции pyautogui.KEYBOARD_KEYS . Он напечатает список определенных ключей, которые он поддерживает. Например: enter , up , down , esc , f1 . Смотрите KEYBOARD_KEYS .

press() это просто обертка для keyUp() и keyDown() функций, которые имитируют нажатие клавиши, а затем отпускание.

Сочетания клавиш

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

Вышеуказанный код эквивалентен

Окно оповещения


Окно оповещения

Окно подтверждения


Окно подтверждения

Окно подсказки


Быстрое окно

Окно пароля


Окно пароля

Скриншот (поиск изображений)

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

Снимок экрана

Вызов screenshot() вернет объект Image. Передача строки имени файла сохранит снимок экрана в файл, а также вернет его как объект изображения.

Существует также необязательный region аргумент ключевого слова, если вы не хотите снимок экрана всего экрана. Вы можете передать четырехзначный кортеж left, top, width и height области для захвата:

Нахождение изображения на экране

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


Калькулятор

и у вас есть изображение кнопки, например, изображение кнопки 7


7 кнопка

Вы можете вызвать locateOnScreen('7key.jpg') функцию, чтобы получить координаты экрана. Возвращаемое значение представляет собой 4-х целочисленный кортеж: (слева, сверху, ширина, высота). Однако, если вы просто хотите получить координаты x и y изображения на экране, вы можете вызвать, locateCenterOnScreen() который вернет только координаты x и y . Если изображение на экране не найдено, оно выведет ImageNotFoundException . Если вы хотите нажать на это изображение или объект, просто передайте координаты x и y из возвращаемых значений предыдущих функций в click() функцию. Чтобы узнать больше о размещении объектов на экране, перейдите по этой ссылке .

Другие особенности

Размер экрана

Чтобы получить размер экрана, в PyAutoGUI есть функция, size() которая возвращает кортеж целых чисел: (ширина, высота) для размера основного монитора.

Положение курсора

Чтобы получить текущую позицию курсора, в PyAutoGUI есть функция, position() которая возвращает кортеж целых чисел: (x, y) для текущей позиции курсора мыши.

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

Игра Страшный лабиринт


Игра Страшный лабиринт

Цель состоит в том, чтобы переместить курсор по синему пути. Если вы дотронетесь до черного пикселя, вы вернетесь к началу.

Самым сложным, на мой взгляд, была заключительная часть, где коридор слишком узок. Что, если бы вы могли создать скрипт на python, для самостоятельного завершения лабиринта?

Игра Google Dino

Другой пример: вы наверняка знаете эту игру


Игра Google Динозавр

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

Вы можете непрерывно делать снимки экрана своего игрового экрана и анализировать следующее:

  • как быстро движется препятствие?
  • как высоко это препятствие?
  • день или ночь? примечание: пиксели чередуются между черным и белым
  • сколько препятствий отображается в данный момент?
  • где должно быть препятствие для запуска команды прыжка / приседания?

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

Откладывание текстов

Читатель диаграммы

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


График цен для EUR / USD где-то в 2017 году

Все, что вам нужно было сделать, это решить, увеличилась или снизилась цена между текущим моментом и красной линией. Вы делаете ставку, и если ваше мнение было правильным, вы получите свою ставку + 90%. Поэтому мы подумали, что нам понадобится алгоритм, который статистически корректен более чем на 56%. Мы надеялись, что сможем создать алгоритм, который будет верен, по крайней мере, на 70–80% всех прогнозов, и мы будем плавать в огромном денежном океане.

При создании торгового алгоритма я не нашел способа получить доступ к тем же ценовым данным. Поэтому я создал функцию, которая читает график с захваченным скриншотом. Идея была проста: я перебрал ось X с простым циклом for. Если указана x-координата, я итерировал по оси y с другим для цикла, пока цвет пикселя не стал белым, а не оранжевым. Этот метод возвращает список относительных высот точек данных на рисунке. Соответствующий код был:

Вывод

PyAutoGUI – это удивительный инструмент для автоматизации, и с творческим подходом нет ограничений.

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

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

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

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

В этом руководстве мы рассмотрим, как настроить и использовать модуль клавиатуры в Python.

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

Установка модуля клавиатуры

Версия Python, используемая в этом руководстве, равна 3.8. Однако модуль клавиатуры может работать как с Python 2.x, так и с Python 3.x.

Если вы используете Linnux, чтобы использовать эту библиотеку, вы должны установить ее от root. Если вы этого не сделаете, вы получите:

Кроме того, при запуске сценария вы должны запускать его с правами суперпользователя:

В Windows и macOS, поскольку привилегии работают совсем по-другому - вы можете установить его просто через pip и запустить сценарии:

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

Функция модуля клавиатуры

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

keyboard.wait(key) - блокирует программу до тех пор, пока не будет нажата клавиша. Ключ передается в виде строки ("пробел", "esc" и т.д.)

keyboard.press(key)- нажимает клавишу и удерживается до вызова функции release(key)

keyboard.release(key)- выпускает ключ.

keyboard.send(key)- нажимает и отпускает клавишу.

keyboard.add_hotkey(hotkey, function)- создает hotkey, которая при нажатии выполняет function.

keyboard.record(key)- записывает активность клавиатуры до нажатия key.

keyboard.play(recorded_events, [speed_factor]) - воспроизводит события, записанные with keyboard.record(key) функция, с дополнительным speed_factor.

Тем не менее, мы рассмотрим все это. Вот быстрый пример:

Функции write() и wait() клавиатуры

Мы создадим бесконечный цикл True, чтобы проверить, нажата ли клавиша, и вы можете запустить сценарий в фоновом режиме:

Примечание: Специальные символы не поддерживаются этой функцией, поэтому, если вы добавите, скажем, ! - вы получите исключение остановки.

Функции клавиши press() и release()

Поскольку сложно имитировать press () и release(), чтобы действия были видны, мы также увидим в действии record() и play() .

Функция press() нажимает клавишу и отпускает ее, когда вы вызываете release() на той же клавише.

Тем не менее, вы можете удерживать некоторые специальные клавиши, такие как [SHIFT] или [CTRL] следующим образом:

Функции клавиатуры record() и play()

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

Функция record() принимает ключ запуска, до которого она записывает, и возвращает последовательность событий типа KeyboardEvent. Затем вы можете поместить эту последовательность событий в функцию play(), которая точно воспроизводит их, с дополнительным аргументом speed_factor. Он действует как множитель скорости исходных событий:

Если мы напечатаем recorded_events, они будут выглядеть примерно так:

Функция клавиатуры send()

Функция send() включает в себя press () и release () вместе и используется для отдельных клавиш, в отличие от функции write(), которая используется для целых предложений:

После нажатия клавиши s воспроизводятся клавиши w и a.

Хотя это неправильный способ добавить горячие клавиши. Также вы можете использовать функцию add_hotkey().

Функция клавиатуры add_abreviation()

Функция add_abbreviation() является довольно изящной, так как она позволяет определять сокращения для длинных входных данных и заменяет сокращенные версии сохраненными полными версиями.

Например, подобно тому, как такие службы, как Google, сохраняют вашу электронную почту для большинства форм ввода, вы можете создать свою собственную аббревиатуру и запустить ее через [SPACE]:

Во время выполнения, если вы введете @, за которым следует [ПРОБЕЛ] - ввод в длинной форме заменит введенный @.

Функция клавиатуры add_hotkey()

Функция add_hotkey() принимает горячую клавишу, которую вы хотите сохранить, или комбинацию клавиш и функцию. Здесь легко передать анонимные лямбда-функции, хотя вы также можете добавить именованные функции.

Например, давайте добавим горячую клавишу для CTRL+j, которая запускает лямбда-функцию, регистрирующей это:

Горячая клавиша ctrl + alt + p сохраняется, и при нажатии этой комбинации вы должны увидеть вывод лямбды.

Заключение

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

Читайте также: