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

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

  • автор:

Как сымитировать нажатие РЕАЛЬНОЙ клавиатуры?

Как сымитировать нажатие РЕАЛЬНОЙ клавиатуры?
У меня есть игра, в которой есть сервер, который, в свою очередь, игнорирует нажатия от кода.

Сама игра вполне легко принимает имитацию через библиотеки: pynput, pywin(win32), pyautogui, keyboard, cyptes и т.д.
Но на сервере нет. При этом допусти «macro recorder», программа для записи макросов, спокойно отдаёт команды игре.

Как мне обманут игру?

Язык — питон, если что.

p.s. я действительно искал долго и четно.

  • Вопрос задан более двух лет назад
  • 477 просмотров

11 комментариев

Средний 11 комментариев

PyAutoGUI — работа с клавиатурой

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

Основная функция работы клавиатуры — ввод символов в нужной строке. Делается это следующим образом:

pyautogui.write('Hello, World!')

Если же вам нужно ввести текст с неким интервалом — добавим интервал в команду:

pyautogui.write('Hello, World!', interval = 0.50)

С вводом текста разобрались. А как быть, если нужно нажать какие-либо клавиши? Для этого используем метод press():

pyautogui.press('enter') #Нажимаем клавишу "Ввод" pyautogui.press('f1') #Нажимаем клавишу F1 pyautogui.press('left') #Нажимаем клавишу "Влево"

Интересно, что функция press() — лишь обертка для функций KeyDown() и KeyUp(), которые имитируют нажатие на клавишу, а потом отпуск этой клавиши. НО! В случае необходимости можно имитировать эти действия самостоятельно:

pyautogui.keyDown('shift') #Нажимаем клавишу "Shift" pyautogui.press('left') #Нажимаем клавишу "Влево" pyautogui.press('left') #Нажимаем клавишу "Влево" pyautogui.press('left') #Нажимаем клавишу "Влево" pyautogui.keyUp('shift') #Отпускаем клавишу "Shift"

Ок, с этим разобрались, едем далее. Теперь разберемся, как оптимизировать все написанное выше (согласитесь, описывать каждое нажатие клавиш — крайне неудобно). Делаем следующее:

pyautogui.press(['left', 'left', 'left']) #Нажали клавишу "Влево" три раза подряд

а можно сделать так:

pyautogui.press('left', presses=3) #Нажали клавишу "Влево" три раза подряд ;) Согласитесь - этот вариант как-то попроще. 

Кстати, ничего не мешает удерживать одну клавишу, и нажимать другую. Реализуется это двумя методами. Первый:

with pyautogui.hold('shift'): pyautogui.press(['left', 'left', 'left']) #На нормальном языке это значит следующее: когда клавиша Shift зажата - три раза нажимаем клавишу "Влево"

Две строки — но на деле они заменяют код, написанный ниже:

pyautogui.keyDown('shift') #Нажать клавишу "Shift" pyautogui.press('left') #Нажать клавишу "Влево" pyautogui.press('left') #Нажать клавишу "Влево" pyautogui.press('left') #Нажать клавишу "Влево" pyautogui.keyUp('shift') #Отпустить клавишу "Shift"

И в конце сегодняшей записи, посвященно работе с клавиатурой с помощью библиотеки Pyautogui расскажу, как реализовать нажатие нескольких клавиш по указанной схеме. Для этого используется метод hotkey(). Пример — ниже:

pyautogui.hotkey('ctrl', 'shift', 'esc')

Одна строка! Элементарно, Ватсон! А если бы мы описывали это с помощью простых нажатий клавиш — нам пришлось бы писать код:

pyautogui.keyDown('ctrl') pyautogui.keyDown('shift') pyautogui.keyDown('esc') pyautogui.keyUp('esc') pyautogui.keyUp('shift') pyautogui.keyUp('ctrl')

Кстати, интервал в нажатии клавиш никто не отменяет �� Напоминаю: interval=0.25 — интервал между нажатиями клавиш в милисекундах.

На всякий случай — ниже укажу полный список всего, что можно использовать методаз, описанных сегодня (press(), keyDown(), keyUp(), hothey()):

‘\t’, ‘\n’, ‘\r’, ‘ ‘, ‘!’, ‘»‘, ‘#’, ‘$’, ‘%’, ‘&’, «‘», ‘(‘,
‘)’, ‘*’, ‘+’, ‘,’, ‘-‘, ‘.’, ‘/’, ‘0’, ‘1’, ‘2’, ‘3’, ‘4’, ‘5’, ‘6’, ‘7’,
‘8’, ‘9’, ‘:’, ‘;’, ‘’, ‘?’, ‘@’, ‘[‘, ‘\’, ‘]’, ‘^’, ‘_’, ‘`’,
‘a’, ‘b’, ‘c’, ‘d’, ‘e’,’f’, ‘g’, ‘h’, ‘i’, ‘j’, ‘k’, ‘l’, ‘m’, ‘n’, ‘o’,
‘p’, ‘q’, ‘r’, ‘s’, ‘t’, ‘u’, ‘v’, ‘w’, ‘x’, ‘y’, ‘z’, ‘’, ‘~’,
‘accept’, ‘add’, ‘alt’, ‘altleft’, ‘altright’, ‘apps’, ‘backspace’,
‘browserback’, ‘browserfavorites’, ‘browserforward’, ‘browserhome’,
‘browserrefresh’, ‘browsersearch’, ‘browserstop’, ‘capslock’, ‘clear’,
‘convert’, ‘ctrl’, ‘ctrlleft’, ‘ctrlright’, ‘decimal’, ‘del’, ‘delete’,
‘divide’, ‘down’, ‘end’, ‘enter’, ‘esc’, ‘escape’, ‘execute’, ‘f1’, ‘f10’,
‘f11’, ‘f12’, ‘f13’, ‘f14’, ‘f15’, ‘f16’, ‘f17’, ‘f18’, ‘f19’, ‘f2’, ‘f20’,
‘f21’, ‘f22’, ‘f23’, ‘f24’, ‘f3’, ‘f4’, ‘f5’, ‘f6’, ‘f7’, ‘f8’, ‘f9’,
‘final’, ‘fn’, ‘hanguel’, ‘hangul’, ‘hanja’, ‘help’, ‘home’, ‘insert’, ‘junja’,
‘kana’, ‘kanji’, ‘launchapp1’, ‘launchapp2’, ‘launchmail’,
‘launchmediaselect’, ‘left’, ‘modechange’, ‘multiply’, ‘nexttrack’,
‘nonconvert’, ‘num0’, ‘num1’, ‘num2’, ‘num3’, ‘num4’, ‘num5’, ‘num6’,
‘num7’, ‘num8’, ‘num9’, ‘numlock’, ‘pagedown’, ‘pageup’, ‘pause’, ‘pgdn’,
‘pgup’, ‘playpause’, ‘prevtrack’, ‘print’, ‘printscreen’, ‘prntscrn’,
‘prtsc’, ‘prtscr’, ‘return’, ‘right’, ‘scrolllock’, ‘select’, ‘separator’,
‘shift’, ‘shiftleft’, ‘shiftright’, ‘sleep’, ‘space’, ‘stop’, ‘subtract’, ‘tab’,
‘up’, ‘volumedown’, ‘volumemute’, ‘volumeup’, ‘win’, ‘winleft’, ‘winright’, ‘yen’,
‘command’, ‘option’, ‘optionleft’, ‘optionright’

На этом все что я хотел рассказать сегодня о работе с клавиатурой с помощью библиотеки Pyautogui в Python — заканчивается. Продолжение — скоро (раньше, чем через год, обещаю). И как всегда — в случае возникновения вопросов пишите на почту, или в Телеграм ��

Эмуляция нажатий клавиш клавиатуры на Python 3 под Windows

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

Отслеживать
задан 16 янв 2017 в 13:11
Constantor Constantor
567 3 3 золотых знака 6 6 серебряных знаков 18 18 бронзовых знаков

Существовал SendKeys модуль, который легко позволял специальные клавиши использовать. Не знаю, работает ли на Python 3. Вот пример использования (в конце ответа.

16 янв 2017 в 14:00

Проблема в том, что через pip3 install sendkeys он не устанавливается, падает с ошибками, никак не исключёнными!

16 янв 2017 в 14:02

вполне вероятно. Модуль древний и главное его (варианта) достоинство было это простота и отсутствие зависимостей кроме ctypes (не могу сейчас исходник найти, вот пример как он мог выглядеть). pywinauto менее простой модуль, который также SendInput() API использует. Единственный недостаток pyautogui по сравнению с SendKeys, то что pillow является зависимостью, а так одни плюсы: также простой, но переносимый, поддерживает не только клавиши.

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

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

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

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

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

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

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

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

ImportError: You must be root to use this library on linux.

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

$ sudo pip3 install keyboard $ sudo python3 my_script.py

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

$ pip install keyboard $ python my_script.py

Примечание: Для 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.

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

>>> import keyboard >>> keyboard.write("Hello") >>> Hello

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

>>> import keyboard >>> keyboard.write("exit()"); keyboard.send("enter"); keyboard.write("curl https://www.google.com"); keyboard.send("enter"); >>> exit() curl https://www.google.com $ curl https://www.google.com  

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

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

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

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

import keyboard while True: keyboard.wait("1") keyboard.write("\n The key '1' was pressed!")

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

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

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

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

>>> import keyboard >>> from time import sleep >>> keyboard.press("a") >>> sleep(1) >>> keyboard.release("a") >>> a

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

>>> keyboard.press("shift") >>> keyboard.write("lowercase") >>> keyboard.release("shift") >>> LOWERCASE

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

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

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

import keyboard recorded_events = keyboard.record("esc") keyboard.play(recorded_events)

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

KeyboardEvent(w up), KeyboardEvent(o down), . ]

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

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

import keyboard recorded_events = keyboard.record("s") keyboard.send("w") keyboard.send("a") keyboard.play(recorded_events)

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

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

import keyboard while True: keyboard.wait("s") keyboard.press("ctrl+shift+s") # Or for MacOS keyboard.press("command+shift+s)

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

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

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

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

>>> import keyboard >>> keyboard.add_abbreviation("@", "john@stackabuse.com")

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

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

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

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

import keyboard keyboard.add_hotkey("ctrl+alt+j", lambda: print("ctrl+alt+j was pressed"))

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

Заключение

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

  • модульное программирование
  • phyton

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

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