Как имитировать нажатие клавиши python
Перейти к содержимому

Как имитировать нажатие клавиши python

  • автор:

Руководство по модулю клавиатуры Python

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

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

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

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

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

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

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

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

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

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

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

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

keyboard.write(message, [delay])- пишет сообщение с задержкой или без нее.

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.

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

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

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

Команда write() записывает сообщение, как мы видели ранее, с необязательной задержкой при запуске. Если задержка не установлена, запись выполняется мгновенно. Это очень хорошо сочетается с функцией wait (), которая ожидает нажатия определенной клавиши.

Например, мы можем создать импровизированный макрос, привязанный, скажем, к 1, который отвечает на этот ввод новым сообщением. Обратите внимание, что вместо этого есть фактический способ создания горячих клавиш, который мы рассмотрим позже.

Мы создадим бесконечный цикл 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.

Функция press() также может принимать комбинации нажатых клавиш. Вы можете отправить комбинацию «ctrl + shift + s», например, и должен появиться диалог для сохранения файла, если вы находитесь в приложении, которое поддерживает эту операцию:

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

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

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

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

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

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

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

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

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

Заключение

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

Keyboard Control Functions¶

The primary keyboard function is write() . This function will type the characters in the string that is passed. To add a delay interval in between pressing each character key, pass an int or float for the interval keyword argument.

You can only press single-character keys with write() , so you can’t press the Shift or F1 keys, for example.

The press(), keyDown(), and keyUp() Functions¶

To press these keys, call the press() function and pass it a string from the pyautogui.KEYBOARD_KEYS such as enter , esc , f1 . See KEYBOARD_KEYS.

The press() function is really just a wrapper for the keyDown() and keyUp() functions, which simulate pressing a key down and then releasing it up. These functions can be called by themselves. For example, to press the left arrow key three times while holding down the Shift key, call the following:

To press multiple keys similar to what write() does, pass a list of strings to press() . For example:

Or you can set how many presses left :

To add a delay interval in between each press, pass an int or float for the interval keyword argument.

The hold() Context Manager¶

To make holding a key convenient, the hold() function can be used as a context manager and passed a string from the pyautogui.KEYBOARD_KEYS such as shift , ctrl , alt , and this key will be held for the duration of the with context block. See KEYBOARD_KEYS.

…is equivalent to this code:

The hotkey() Function¶

To make pressing hotkeys or keyboard shortcuts convenient, the hotkey() can be passed several key strings which will be pressed down in order, and then released in reverse order. This code:

…is equivalent to this code:

To add a delay interval in between each press, pass an int or float for the interval keyword argument.

KEYBOARD_KEYS¶

The following are the valid strings to pass to the press() , keyDown() , keyUp() , and hotkey() functions:

Simulate Keypresses In Python

This demonstrates how to press keys with Python. Using pynput we are able to simulate key presses into any window. This will show you how to press and release a key, type special keys and type a sentence.

If you haven’t used or setup pip before, go to my tutorial at how-to-setup-pythons-pip to setup pip.

We will be using the pynput module to listen to mouse events. To install this module execute pip install pynput in cmd. Watch the output to make sure no errors have occurred; it will tell you when the module has been successfully installed.

Installing pynput

To double-check that it was installed successfully, open up IDLE and execute the command import pynput ; no errors should occur.

Testing pynput

Create a new script and save it somewhere so you can easily run the script. Import Key and Controller from pynput.keyboard .

Make a variable called keyboard and set it to an instance of Controller . Now using the keyboard variable we can press and release keys.

Pressing and Releasing Keys

Using keyboard.press we can press keys and with keyboard.release we can release a key. This allows us to type a key by pressing and releasing. You can only supply this method with one key at a time. Here is an example of how to type the letter ‘a’.

Pressing and Releasing Special Keys

For special keys that can’t be put into a string like shift or control, you will need to refer to the page here to look at the Key class for supported keys. Using these in the press or release methods will press/release the key matching it. For example, if I wanted to press the Windows key, I would look at that page for the key. ‘cmd’ has the description «A generic command button. On PC platforms, this corresponds to the Super key or Windows key, and on Mac it corresponds to the Command key» which is what I am looking for. Now for the code.

This method also allows us to press a key while holding another key, for example, ctrl+c to copy. To do this we will need to press ctrl, press and release c and then release ctrl.

Here are a few other common special keys:

    : Left ALT : Backspace : Left Ctrl : Delete : Enter : Escape : F1 : F5 : Play/Pause : Page Down : Up Arrow Key
  • The rest can be found in the pynput docs for the Key class.

Typing Multiple Keys

A cool feature supplied by the class is the type method. This method allows us to type more than one key at a time but it has to be a string of characters. So if we wanted to type «Nitratine» we would execute:

This method does also support spaces but when it comes to enters, use a new line character (\n) and a tab character (\t) for tabs.

Putting A Random Delay Between Each Keypress

To put a random delay between each keypress, you can use time.sleep with a random number passed to it. Here is a small example function I made:

Common Issues and Questions

How can I use the keyboard and mouse controllers at the same time?

When you import the classes, Controller will be set to the last one imported. To show what the issue was, ask yourself, what controller did you use to set the mouse and what one to set the keyboard? You would have used the same, but they need to be from the different classes. So then you should use:

Now when you want to use the controller for the mouse use MouseController and KeyboardController for the keyboard.

ModuleNotFoundError/ImportError : No module named ‘pynput’

Did you install pynput? This error will not occur if you installed it properly. If you have multiple versions of Python, make sure you are installing pynput on the same version as what you are running the script with.

I got a SyntaxError

Syntax errors are caused by you and there is nothing I can offer to fix it apart from telling you to read the error. They always say where the error is in the output using a ^. Generally, people that get this issue have incorrect indentation, brackets in the wrong place or something spelt wrong. You can read about SyntaxError on Python’s docs here.

The Key Presses Work in Notepad But Not My Game

pynput uses a Win32API function called SendInput . The SendInput function will insert input events into the same queue as a hardware device but the events are marked with a LLMHF_INJECTED flag that can be detected by hooks and then filtered. To avoid this flag you probably have to write a custom driver (ref: stackoverflow/Anders).

It would be ideal for most games to look for these events if they want to reduce ‘bot’ activity as it stops packages like these being used.

In github.com/Gautam-J/Self-Driving-Car I had seen that the file directkeys.py contained the following:

The license for this piece of code can be found here.

This file demonstrates how we can press keys using DirectX key codes. The link in the file no longer exists but it can still be found on the wayback machine. This page provides other codes for keys that can be simulated.

Unfortunately it will only work on Windows (due to the usage of ctypes.windll ) but some may find that it solves their issues with the LLMHF_INJECTED flag.

Owner of PyTutorials and creator of auto-py-to-exe. I enjoy making quick tutorials for people new to particular topics in Python and tools that help fix small things.

Введение

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

  1. Извлечение данных из таблиц (Excel, Google Sheets) и перемещение их в другое место (веб-страница или другая таблица).
  2. Просмотр данных в интернете (онлайн магазины) или в журналах, сбор данных и файлов (простого текста и изображений) и копирование их в базу данных.

Каким образом можно ускорить этот процесс? В этом нам помогут модули автоматизации Python!

Предварительная подготовка

Документацию и руководство пользователя по модулю PyAutoGUI в Python можно прочитать ЗДЕСЬ. Загрузка модуля выполняется через командную строку:

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

“as pag” используется для ввода меньшего количества символов в следующем коде: pag.click() намного короче, чем pyautogui.click().

Управление клавиатурой

Примечание: инструкции в данном разделе основаны на документации PyAutoGUI и содержат несколько примеров из нее.

typewrite() — самая главная команда для управления клавиатурой. Например:

Этот фрагмент кода работает, как при написании “Hello world!” вручную, однако выполняется без нажатия клавиш. Очень удобно!

Чтобы добавить задержку между нажатиями клавиш, можно использовать следующую команду:

Она печатает каждый символ с интервалом в четверть секунды.

Примечание: с помощью этой функции можно печатать только сообщения. Внутри функции typewrite() невозможно нажать enter или использовать shift.

Список клавиш клавиатуры

Ниже приведен список клавиш клавиатуры, которые можно передать функциям press(), keyUp(), keyDown() или hotkey():

Функции keyDown() и keyUp() имитируют нажатие и отпускание клавиши. Например:

Этот фрагмент кода нажимает и отпускает клавишу enter. Будьте осторожны и никогда не оставляйте клавишу нажатой 🙂

Функция press() объединяет две предыдущих. Клавиша, передаваемая функции, нажата и отпущена:

Два предыдущих фрагмента кода выдают одинаковый результат!

Чтобы нажать несколько клавиш, аргументы передаются в виде списка:

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

Эквивалентно следующему коду:

Управление мышью

Места расположения мыши на экране обозначены координатами X и Y: X начинается с 0 с левой стороны и увеличивается вправо, а Y начинается с 0 в верхней части экрана и увеличивается с понижением.

Чтобы узнать размер экрана, используйте функцию size:

Она возвращает кортеж, например (1920×1080), обозначающий разрешение экрана.

Список других функций мыши:

Более подробную информацию можно найти ЗДЕСЬ или ЗДЕСЬ.

Применение на практике

Предположим, что вы руководите большой компанией и хотите, чтобы весь 1 000 000 сотрудников были зарегистрированы на популярном веб-сайте. Первый способ — выполнить это вручную. Если для регистрации одного пользователя требуется 30 секунд, а работа будет выполняться 24 часа в сутки, то этот процесс займет более 347 дней. Достаточно долго. Вместо этого можно потратить несколько часов на написание программы и предоставить выполнение работы компьютерам. Приступим!

Допустим, вы уже определили список адресов электронной почты всех сотрудников:

Приступим к созданию кода. Он начинается с импортов и открытия платформы crazycoolwebsite.

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

  1. Главная страница -> нажатие “Get started”
  2. Всплывающее окно -> нажатие “Sign up with email”
  3. Окно ввода электронной почты -> ввод адреса электронной почты и нажатие Enter
  4. Готово! Закройте окно, а пользователь получит дальнейшие инструкции на электронную почту.

В коде это выглядит так:

Вот и все! Если указаны точные координаты нажатия (xcoord1, ycoord1, xcoord2 и ycoord2), то код сделает свое дело. Не советуем использовать этот метод как способ рассылки спама.

Примечание: при автоматизации следует учитывать временной фактор. Вы не можете предсказать, сколько времени займет открытие файла или загрузка веб-страницы. Найдите безопасные интервалы для “приостановки кода” или реализации функций, которые определяют, загружена ли страница (PyAutoGUI проверяет, является ли определенное количество пикселей белым (страница все еще загружается) или обозначено другим цветом (страница загружена!).

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

Добавим немного воображения

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

Игра Scary maze

Цель игры Scary maze состоит в том, чтобы перемещать курсор по синему пути. При соприкосновении с черным пикселем вы возвращаетесь к началу.

Заключительная часть с узким коридором, конечно, самая сложная. А что, если создать сценарий python для завершения лабиринта?

Игра Google Dino

Другой пример: помните этого парня?

Он, вероятно,самый нелюбимый друг всех пользователей Chrome, поскольку он приходит в гости лишь при отсутствии интернета. Попробовать игру можно ЗДЕСЬ. Цель состоит в обходе препятствий, приближающихся к Dino.

Сделайте несколько скриншотов игрового экрана и проанализируйте следующее:

  • С какой скоростью движется препятствие?
  • На какой высоте оно находится?
  • Событие происходит днем или ночью? Примечание: пиксели чередуются между черным и белымцветами.
  • Сколько препятствий отображается в данный момент?
  • Где должно находиться препятствие для запуска команды прыжка/уклонения?

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

Отсрочка отправки текста

Сталкивались ли вы с такой ситуацией, когда, закончив писать письмо/сообщение в 3 часа ночи, вы не знаете, отправлять ли его сейчас или подождать до утра, чтобы избежать таких вопросов, как “почему вы не спите ночью, как нормальные люди?” Есть простое решение:

Этот сценарий откладывает отправку сообщения на 6 часов (время задержки можно изменить).

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *