Как сымитировать нажатие РЕАЛЬНОЙ клавиатуры?
Как сымитировать нажатие РЕАЛЬНОЙ клавиатуры?
У меня есть игра, в которой есть сервер, который, в свою очередь, игнорирует нажатия от кода.
Сама игра вполне легко принимает имитацию через библиотеки: pynput, pywin(win32), pyautogui, keyboard, cyptes и т.д.
Но на сервере нет. При этом допусти «macro recorder», программа для записи макросов, спокойно отдаёт команды игре.
Как мне обманут игру?
Язык — питон, если что.
p.s. я действительно искал долго и четно.
- Вопрос задан более двух лет назад
- 529 просмотров
11 комментариев
Средний 11 комментариев
Как в питоне имитировать нажатие на клавиатуре кнопок со стрелками
Пытаюсь сделать скрипт для автоматизации действий в компьютерной игре. Короче — скрипт должен жать кнопки вместо меня, в результате в игре (которую не я написал, я просто игрок) происходят некие действия. Вот такой код:
import time import keyboard time.sleep(1) keyboard.send('enter') time.sleep(0.2) keyboard.press('down') time.sleep(0.2) keyboard.release('down') time.sleep(0.2) keyboard.press('down') time.sleep(0.2) keyboard.release('down') time.sleep(0.2)
работает некорректно. Игра воспринимает стрелки как стрелки, нажатые на цифровой клавиатуре. А нужны обычные стрелки. Что можно сделать? Может быть стоит использовать другой модуль эмуляции клавиатуры?
Отслеживать
Iron_beatle
задан 2 дек 2023 в 12:03
Iron_beatle Iron_beatle
9 2 2 бронзовых знака
В принципе вот ссылка на готовое решение ru.stackoverflow.com/questions/1122264/…
2 дек 2023 в 12:16
Прошу прощение, если ввёл в заблуждение словом «оптимизация», там скорее «автоматизация» должна быть. В общем хочу написать скрипт, который будет жать кнопки вместо меня. Та программа, которая в примере вероятно должна считывать нажатую кнопку на клавиатуре и писать её название в терминал, мне же нужно сделать прямо противоположное. Коды стрелок оттуда в своём скрипте пробовал, но они выдали ошибку.
2 дек 2023 в 17:56
5 ответов 5
Сортировка: Сброс на вариант по умолчанию
Последний вариант — это использовать дескриптор окна и посылать команды непосредственно в него:
pip install pywin32
import win32gui import win32api import win32con set_hwnd = "Notepad" hwnd = win32gui.FindWindow(None, set_hwnd) if hwnd == 0: print("Окно не найдено!\n") lParam = win32api.MAKELONG(0, 0) win32api.PostMessage(hwnd, win32con.WM_LBUTTONDOWN, win32con.MK_LBUTTON, lParam) win32api.PostMessage(hwnd, win32con.WM_LBUTTONUP, 0, lParam)
Вместо PostMessage можно использовать SendMessage.
win32api.SendMessage(hwnd, win32con.WM_MOUSEMOVE, 0, lParam)
Разница между ними в том, что SendMessage отправляет сообщение и ожидает, пока окно-получатель сообщение обработает, а PostMessage просто установит сообщение в очередь.
Примерно так же, можно отправлять нажатия клавиш клавиатуры.
Отслеживать
ответ дан 3 дек 2023 в 1:53
2,938 2 2 золотых знака 4 4 серебряных знака 20 20 бронзовых знаков
Как вариант, попробуйте использовать event
Если защита в игре так себе, то может и сработать. а может и не сработать.
import ctypes import time # Константы для keybd_event VK_UP = 0x26 # Клавиша вверх VK_DOWN = 0x28 # Клавиша вниз # Эмуляция нажатия и отпускания клавиши вверх ctypes.windll.user32.keybd_event(VK_UP, 0, 0, 0) time.sleep(0.1) ctypes.windll.user32.keybd_event(VK_UP, 0, 2, 0) time.sleep(0.1) # Эмуляция нажатия и отпускания клавиши вниз ctypes.windll.user32.keybd_event(VK_DOWN, 0, 0, 0) time.sleep(0.1) ctypes.windll.user32.keybd_event(VK_DOWN, 0, 2, 0)
Для других клавиш используйте соответствующие коды: https://narvell.nl/keys
Отслеживать
ответ дан 3 дек 2023 в 1:19
2,938 2 2 золотых знака 4 4 серебряных знака 20 20 бронзовых знаков
Спасибо, попробовал. В блокноте работает, а в игре увы нет.
3 дек 2023 в 10:06
Хорошо сделанные игры без труда определяют не хардварные нажатия и фильтруют их. Так что не удивительно.
3 дек 2023 в 22:14
Самым крайним решением можно считать usb-устройство, которое можно запрограммировать на подачу нужного сигнала — Digispark.
pip install digispark

Цена вопроса: ~500р
Отслеживать
ответ дан 3 дек 2023 в 2:20
2,938 2 2 золотых знака 4 4 серебряных знака 20 20 бронзовых знаков
Увы нет. В идеале хотелось бы получить скрип, который можно выложить в сеть для других игроков. К тому же модуль keyboard нормально эмулирует кнопки клавиатуры, тот же enter например, а вот именно со стрелками путается. Так что настолько сложные костыли явно излишни.
3 дек 2023 в 8:37
Можете так же рассмотреть PyAutoGUI — эта библиотека тоже позволяет эмулировать нажатия клавиатуры.
3 дек 2023 в 8:43
PyAutoGUI к сожалению тоже только в блокноте. Что обидно, так как модуль keyboard работает в игре. ` keyboard.press(‘enter’) ` — это воспринимается как ентер. ` pyautogui.keyDown (‘enter’)` — а на это ноль реакции.
7 дек 2023 в 17:52
Попробуйте оставшиеся ответы, и возможно вам повезёт. В целом, я предложил все возможные варианты эмуляции нажатия кнопок из мне известных. Если ничего из этого так и не сработает, вам останется смотреть только в сторону собственного драйвера, но это уже за рамками Пайтона.
8 дек 2023 в 3:10
Можете так же рассмотреть pydirectinput
14 апр в 20:31
Можно попробовать использовать SendInput , для этих целей у меня есть вот такой класс:
import ctypes import time class InputSimulator: def __init__(self): # Константы для ввода мыши self.WHEEL_DELTA = 120 self.XBUTTON1 = 0x0001 self.XBUTTON2 = 0x0002 self.MOUSEEVENTF_ABSOLUTE = 0x8000 self.MOUSEEVENTF_HWHEEL = 0x01000 self.MOUSEEVENTF_MOVE = 0x0001 self.MOUSEEVENTF_MOVE_NOCOALESCE = 0x2000 self.MOUSEEVENTF_LEFTDOWN = 0x0002 self.MOUSEEVENTF_LEFTUP = 0x0004 self.MOUSEEVENTF_RIGHTDOWN = 0x0008 self.MOUSEEVENTF_RIGHTUP = 0x0010 self.MOUSEEVENTF_MIDDLEDOWN = 0x0020 self.MOUSEEVENTF_MIDDLEUP = 0x0040 self.MOUSEEVENTF_VIRTUALDESK = 0x4000 self.MOUSEEVENTF_WHEEL = 0x0800 self.MOUSEEVENTF_XDOWN = 0x0080 self.MOUSEEVENTF_XUP = 0x0100 # Константы для типов ввода self.INPUT_MOUSE = 0 self.INPUT_KEYBOARD = 1 self.INPUT_HARDWARE = 2 # Коды клавиш self.VK_LBUTTON = 0x01 # Left mouse button self.VK_RBUTTON = 0x02 # Right mouse button self.VK_CANCEL = 0x03 # Control-break processing self.VK_MBUTTON = 0x04 # Middle mouse button (three-button mouse) self.VK_XBUTTON1 = 0x05 # X1 mouse button self.VK_XBUTTON2 = 0x06 # X2 mouse button self.VK_BACK = 0x08 # BACKSPACE key self.VK_TAB = 0x09 # TAB key self.VK_CLEAR = 0x0C # CLEAR key self.VK_RETURN = 0x0D # ENTER key self.VK_SHIFT = 0x10 # SHIFT key self.VK_CONTROL = 0x11 # CTRL key self.VK_MENU = 0x12 # ALT key self.VK_PAUSE = 0x13 # PAUSE key self.VK_CAPITAL = 0x14 # CAPS LOCK key self.VK_KANA = 0x15 # IME Kana mode self.VK_HANGUL = 0x15 # IME Hangul mode self.VK_JUNJA = 0x17 # IME Junja mode self.VK_FINAL = 0x18 # IME final mode self.VK_HANJA = 0x19 # IME Hanja mode self.VK_KANJI = 0x19 # IME Kanji mode self.VK_ESCAPE = 0x1B # ESC key self.VK_CONVERT = 0x1C # IME convert self.VK_NONCONVERT = 0x1D # IME nonconvert self.VK_ACCEPT = 0x1E # IME accept self.VK_MODECHANGE = 0x1F # IME mode change request self.VK_SPACE = 0x20 # SPACEBAR self.VK_PRIOR = 0x21 # PAGE UP key self.VK_NEXT = 0x22 # PAGE DOWN key self.VK_END = 0x23 # END key self.VK_HOME = 0x24 # HOME key self.VK_LEFT = 0x25 # LEFT ARROW key self.VK_UP = 0x26 # UP ARROW key self.VK_RIGHT = 0x27 # RIGHT ARROW key self.VK_DOWN = 0x28 # DOWN ARROW key self.VK_SELECT = 0x29 # SELECT key self.VK_PRINT = 0x2A # PRINT key self.VK_EXECUTE = 0x2B # EXECUTE key self.VK_SNAPSHOT = 0x2C # PRINT SCREEN key self.VK_INSERT = 0x2D # INS key self.VK_DELETE = 0x2E # DEL key self.VK_HELP = 0x2F # HELP key self.VK_LWIN = 0x5B # Left Windows key (Natural keyboard) self.VK_RWIN = 0x5C # Right Windows key (Natural keyboard) self.VK_APPS = 0x5D # Applications key (Natural keyboard) self.VK_SLEEP = 0x5F # Computer Sleep key self.VK_NUMPAD0 = 0x60 # Numeric keypad 0 key self.VK_NUMPAD1 = 0x61 # Numeric keypad 1 key self.VK_NUMPAD2 = 0x62 # Numeric keypad 2 key self.VK_NUMPAD3 = 0x63 # Numeric keypad 3 key self.VK_NUMPAD4 = 0x64 # Numeric keypad 4 key self.VK_NUMPAD5 = 0x65 # Numeric keypad 5 key self.VK_NUMPAD6 = 0x66 # Numeric keypad 6 key self.VK_NUMPAD7 = 0x67 # Numeric keypad 7 key self.VK_NUMPAD8 = 0x68 # Numeric keypad 8 key self.VK_NUMPAD9 = 0x69 # Numeric keypad 9 key self.VK_MULTIPLY = 0x6A # Multiply key self.VK_ADD = 0x6B # Add key self.VK_SEPARATOR = 0x6C # Separator key self.VK_SUBTRACT = 0x6D # Subtract key self.VK_DECIMAL = 0x6E # Decimal key self.VK_DIVIDE = 0x6F # Divide key self.VK_F1 = 0x70 # F1 key self.VK_F2 = 0x71 # F2 key self.VK_F3 = 0x72 # F3 key self.VK_F4 = 0x73 # F4 key self.VK_F5 = 0x74 # F5 key self.VK_F6 = 0x75 # F6 key self.VK_F7 = 0x76 # F7 key self.VK_F8 = 0x77 # F8 key self.VK_F9 = 0x78 # F9 key self.VK_F10 = 0x79 # F10 key self.VK_F11 = 0x7A # F11 key self.VK_F12 = 0x7B # F12 key self.VK_F13 = 0x7C # F13 key self.VK_F14 = 0x7D # F14 key self.VK_F15 = 0x7E # F15 key self.VK_F16 = 0x7F # F16 key self.VK_F17 = 0x80 # F17 key self.VK_F18 = 0x81 # F18 key self.VK_F19 = 0x82 # F19 key self.VK_F20 = 0x83 # F20 key self.VK_F21 = 0x84 # F21 key self.VK_F22 = 0x85 # F22 key self.VK_F23 = 0x86 # F23 key self.VK_F24 = 0x87 # F24 key self.VK_NUMLOCK = 0x90 # NUM LOCK key self.VK_SCROLL = 0x91 # SCROLL LOCK key self.VK_LSHIFT = 0xA0 # Left SHIFT key self.VK_RSHIFT = 0xA1 # Right SHIFT key self.VK_LCONTROL = 0xA2 # Left CONTROL key self.VK_RCONTROL = 0xA3 # Right CONTROL key self.VK_LMENU = 0xA4 # Left MENU key self.VK_RMENU = 0xA5 # Right MENU key self.VK_BROWSER_BACK = 0xA6 # Browser Back key self.VK_BROWSER_FORWARD = 0xA7 # Browser Forward key self.VK_BROWSER_REFRESH = 0xA8 # Browser Refresh key self.VK_BROWSER_STOP = 0xA9 # Browser Stop key self.VK_BROWSER_SEARCH = 0xAA # Browser Search key self.VK_BROWSER_FAVORITES = 0xAB # Browser Favorites key self.VK_BROWSER_HOME = 0xAC # Browser Start and Home key self.VK_VOLUME_MUTE = 0xAD # Volume Mute key self.VK_VOLUME_DOWN = 0xAE # Volume Down key self.VK_VOLUME_UP = 0xAF # Volume Up key self.VK_MEDIA_NEXT_TRACK = 0xB0 # Next Track key self.VK_MEDIA_PREV_TRACK = 0xB1 # Previous Track key self.VK_MEDIA_STOP = 0xB2 # Stop Media key self.VK_MEDIA_PLAY_PAUSE = 0xB3 # Play/Pause Media key self.VK_LAUNCH_MAIL = 0xB4 # Start Mail key self.VK_LAUNCH_MEDIA_SELECT = 0xB5 # Select Media key self.VK_LAUNCH_APP1 = 0xB6 # Start Application 1 key self.VK_LAUNCH_APP2 = 0xB7 # Start Application 2 key self.VK_OEM_1 = 0xBA # Used for miscellaneous characters; it can vary by keyboard. # For the US standard keyboard, the ';:' key self.VK_OEM_PLUS = 0xBB # For any country/region, the '+' key self.VK_OEM_COMMA = 0xBC # For any country/region, the ',' key self.VK_OEM_MINUS = 0xBD # For any country/region, the '-' key self.VK_OEM_PERIOD = 0xBE # For any country/region, the '.' key self.VK_OEM_2 = 0xBF # Used for miscellaneous characters; it can vary by keyboard. # For the US standard keyboard, the '/?' key self.VK_OEM_3 = 0xC0 # Used for miscellaneous characters; it can vary by keyboard. # For the US standard keyboard, the '`~' key self.VK_OEM_4 = 0xDB # Used for miscellaneous characters; it can vary by keyboard. # For the US standard keyboard, the '[' key self.VK_OEM_7 = 0xDE # Used for miscellaneous characters; it can vary by keyboard. # For the US standard keyboard, the 'single-quote/double-quote' key self.VK_OEM_8 = 0xDF # Used for miscellaneous characters; it can vary by keyboard. self.VK_OEM_102 = 0xE2 # Either the angle bracket key or the backslash key on the RT 102-key keyboard self.VK_PROCESSKEY = 0xE5 # IME PROCESS key self.VK_PACKET = 0xE7 # Used to pass Unicode characters as if they were keystrokes. The VK_PACKET key is the low word of a 32-bit Virtual Key value used for non-keyboard input methods. For more information, see Remark in KEYBDINPUT, SendInput, WM_KEYDOWN, and WM_KEYUP self.VK_ATTN = 0xF6 # Attn key self.VK_CRSEL = 0xF7 # CrSel key self.VK_EXSEL = 0xF8 # ExSel key self.VK_EREOF = 0xF9 # Erase EOF key self.VK_PLAY = 0xFA # Play key self.VK_ZOOM = 0xFB # Zoom key self.VK_PA1 = 0xFD # PA1 key self.VK_OEM_CLEAR = 0xFE # Clear key # Константы для ввода клавиатуры self.KEYEVENTF_EXTENDEDKEY = 0x0001 self.KEYEVENTF_KEYUP = 0x0002 self.KEYEVENTF_SCANCODE = 0x0008 self.KEYEVENTF_UNICODE = 0x0004 self.KEY_0 = 0x30 self.KEY_1 = 0x31 self.KEY_2 = 0x32 self.KEY_3 = 0x33 self.KEY_4 = 0x34 self.KEY_5 = 0x35 self.KEY_6 = 0x36 self.KEY_7 = 0x37 self.KEY_8 = 0x38 self.KEY_9 = 0x39 self.KEY_A = 0x41 self.KEY_B = 0x42 self.KEY_C = 0x43 self.KEY_D = 0x44 self.KEY_E = 0x45 self.KEY_F = 0x46 self.KEY_G = 0x47 self.KEY_H = 0x48 self.KEY_I = 0x49 self.KEY_J = 0x4A self.KEY_K = 0x4B self.KEY_L = 0x4C self.KEY_M = 0x4D self.KEY_N = 0x4E self.KEY_O = 0x4F self.KEY_P = 0x50 self.KEY_Q = 0x51 self.KEY_R = 0x52 self.KEY_S = 0x53 self.KEY_T = 0x54 self.KEY_U = 0x55 self.KEY_V = 0x56 self.KEY_W = 0x57 self.KEY_X = 0x58 self.KEY_Y = 0x59 self.KEY_Z = 0x5A # Объявление структур class MOUSEINPUT(ctypes.Structure): _fields_ = [ ('dx', ctypes.c_long), ('dy', ctypes.c_long), ('mouseData', ctypes.c_ulong), ('dwFlags', ctypes.c_ulong), ('time', ctypes.c_ulong), ('dwExtraInfo', ctypes.POINTER(ctypes.c_ulong)) ] class KEYBDINPUT(ctypes.Structure): _fields_ = [ ('wVk', ctypes.c_ushort), ('wScan', ctypes.c_ushort), ('dwFlags', ctypes.c_ulong), ('time', ctypes.c_ulong), ('dwExtraInfo', ctypes.POINTER(ctypes.c_ulong)) ] class HARDWAREINPUT(ctypes.Structure): _fields_ = [ ('uMsg', ctypes.c_ulong), ('wParamL', ctypes.c_ushort), ('wParamH', ctypes.c_ushort) ] class _INPUTunion(ctypes.Union): _fields_ = [ ('mi', MOUSEINPUT), ('ki', KEYBDINPUT), ('hi', HARDWAREINPUT) ] class INPUT(ctypes.Structure): _fields_ = [ ('type', ctypes.c_ulong), ('union', _INPUTunion) ] self.MOUSEINPUT = MOUSEINPUT self.KEYBDINPUT = KEYBDINPUT self.HARDWAREINPUT = HARDWAREINPUT self._INPUTunion = _INPUTunion self.INPUT = INPUT def SendInput(self, *inputs): nInputs = len(inputs) LPINPUT = self.INPUT * nInputs pInputs = LPINPUT(*inputs) cbSize = ctypes.c_int(ctypes.sizeof(inputs[0])) return ctypes.windll.user32.SendInput(nInputs, pInputs, cbSize) def MouseInput(self, flags, x, y, data): return self.MOUSEINPUT(x, y, data, flags, 0, None) def KeybdInput(self, code, flags): return self.KEYBDINPUT(code, code, flags, 0, None) def HardwareInput(self, message, parameter): return self.HARDWAREINPUT(message & 0xFFFFFFFF, parameter & 0xFFFF, parameter >> 16 & 0xFFFF) def Mouse(self, flags, x=0, y=0, data=0): return self.INPUT(self.INPUT_MOUSE, self._INPUTunion(mi=self.MouseInput(flags, x, y, data))) def Keyboard(self, code, flags=0): return self.INPUT(self.INPUT_KEYBOARD, self._INPUTunion(ki=self.KeybdInput(code, flags))) def Hardware(self, message, parameter=0): return self.INPUT(self.INPUT_HARDWARE, self._INPUTunion(hi=self.HardwareInput(message, parameter))) input_simulator = InputSimulator() # Ожидание некоторого времени перед выполнением симуляции, чтобы у вас было время подвести мышь time.sleep(5) # Симуляция нажатия левой кнопки мыши input_simulator.SendInput(input_simulator.Mouse(input_simulator.MOUSEEVENTF_LEFTDOWN)) # Ожидание перед отпусканием кнопки мыши time.sleep(0.1) # Симуляция отпускания левой кнопки мыши input_simulator.SendInput(input_simulator.Mouse(input_simulator.MOUSEEVENTF_LEFTUP)) time.sleep(0.1) # Симуляция нажатия левой кнопки мыши input_simulator.SendInput(input_simulator.Mouse(input_simulator.MOUSEEVENTF_LEFTDOWN)) # Ожидание перед отпусканием кнопки мыши time.sleep(0.1) # Симуляция отпускания левой кнопки мыши input_simulator.SendInput(input_simulator.Mouse(input_simulator.MOUSEEVENTF_LEFTUP)) # Ожидание перед симуляцией движения мыши (абсолютное) time.sleep(0.1) # Симуляция абсолютного движения мыши в точку (500, 500) input_simulator.SendInput(input_simulator.Mouse(input_simulator.MOUSEEVENTF_MOVE | input_simulator.MOUSEEVENTF_ABSOLUTE, 500, 500, 0)) # Ожидание перед симуляцией относительного движения мыши time.sleep(0.1) # Симуляция относительного движения мыши на 50 пикселей вправо и 50 пикселей вниз от текущей позиции input_simulator.SendInput(input_simulator.Mouse(input_simulator.MOUSEEVENTF_MOVE, 50, 50, 0)) # Ожидание перед симуляцией нажатия клавиши вверх time.sleep(0.1) # Симуляция нажатия клавиши вверх input_simulator.SendInput(input_simulator.Keyboard(input_simulator.VK_UP)) # Ожидание перед отпусканием клавиши вверх time.sleep(0.1) # Симуляция отпускания клавиши вверх input_simulator.SendInput(input_simulator.Keyboard(input_simulator.VK_UP, input_simulator.KEYEVENTF_KEYUP)) # Ожидание перед симуляцией нажатия клавиши вниз time.sleep(0.1) # Симуляция нажатия клавиши вниз input_simulator.SendInput(input_simulator.Keyboard(input_simulator.VK_DOWN)) # Ожидание перед отпусканием клавиши вниз time.sleep(0.1) # Симуляция отпускания клавиши вниз input_simulator.SendInput(input_simulator.Keyboard(input_simulator.VK_DOWN, input_simulator.KEYEVENTF_KEYUP))
Руководство по модулю клавиатуры 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
Saved searches
Use saved searches to filter your results more quickly
Cancel Create saved search
You signed in with another tab or window. Reload to refresh your session. You signed out in another tab or window. Reload to refresh your session. You switched accounts on another tab or window. Reload to refresh your session.
Auskas / ruautogui Public
Программное нажатие клавиш клавиатуры, включая кириллические символы, ввод строк с имитацией человеческого поведения. Программный контроль курсора мыши с имитацией человеческого поведения.
License
Auskas/ruautogui
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Go to file
Folders and files
Last commit message
Last commit date
Latest commit
History
View all files
Repository files navigation
RuAutoGUI
RuAutoGUI программный пакет для языка программирования Python с имитацией человеческого поведения для программного управления мышью и клавиатурой.
Возможности модуля
- Последовательное нажатие клавиш клавиатуры для ввода текста в формы web страниц и т.п.
- Поддержка кириллических символов при вводе текста.
- Поддержка горячих клавиш, например Alt+Tab или Alt+Shift.
- Настраиваемая случайная задержка между вводом символов.
- Опция исправляемых ошибок при вводе текста с настраиваемой частотой ошибок.
- Перемещение курсора мыши в заданную точку по так называемой кривой Безье.
- Случайный или настраиваемый порядок кривой Безье.
- Случайное движение курсора мыши для имитации "хватания" рукой мыши.
- Клик и двойной клик.
Системные требования
- OS Windows 10 (не проверялось на ранних версиях)
- Python 3.6 и выше
Установка
В данный момент поддерживается установка из репозитария github:
https://github.com/Auskas/ruautogui.git
Примеры использования модуля клавиатуры
from ruautogui import keyboard as kb text = "Пример использования модуля клавиатуры!" kb.type(text, mode="fast")
from ruautogui import keyboard as kb text = "Пример использования с исправляемыми опечатками!" kb.type(text, mode="ultrafast", typo=True)
Пример использования модуля мыши
from ruautogui import mouse as ms import time ms.grab() # Имитация захвата рукой мыши time.sleep(1) # Таймаут перед следующим действием ms.move((300,300)) # Движение мыши по кривой Безье до точки 300,300
Пример совместного использования с пакетом Selenium
В случае, если вы хотите имитировать поведение реального человека на web странице, простое использование пакета Selenium не является достаточным. При использовании ресурсом технологии webvisor, если вы переживаете, что ваш робот или парсер может быть выявлен, используёте RuAutoGUI совместно с Selenium.
from selenium.webdriver import Chrome from selenium.webdriver.chrome.options import Options as ChromeOptions from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.common.by import By from selenium.webdriver.support import expected_conditions as EC from ruautogui import keyboard as kb from ruautogui import mouse as ms import sys, random, time chrome_options = ChromeOptions() chrome_options.add_experimental_option('useAutomationExtension', False) chrome_options.add_experimental_option('excludeSwitches', ['enable-automation']) driver = Chrome(options=chrome_options) driver.get('https://github.com') kb.press('f11') # Полноэкранный режим браузера try: input_field = WebDriverWait(driver, 10).until( EC.presence_of_element_located((By.XPATH, "//input[contains(@class, 'form-control')]")) ) except Exception as exc: print('Невозможно найти поле ввода. ') driver.quit() sys.exit() input_field = driver.find_element_by_xpath("//input[contains(@class, 'form-control')]") ms.grab() time.sleep(1) field_location = (input_field.location['x'], input_field.location['y']) field_size = (input_field.size['width'], input_field.size['height']) target_loc = ( field_location[0] + random.randint(field_size[0] // 4, field_size[0] // 2), field_location[1] + random.randint(field_size[1] // 4, field_size[1] // 2) ) ms.move(target_loc) time.sleep(1) ms.click() time.sleep(1) kb.type('ruautogui', mode='ultrafast') time.sleep(1) kb.press('enter') time.sleep(5) driver.quit()
Ограничения в использовании RuAutoGUI
- Переключение между латиницей и кириллицей осуществляется горячими клавишами (Alt+Shift по умолчанию). При необходимости вы можете изменить горячие клавиши переключения раскладки в модуле keyboard.py: константы CHANGE_KEYBOARD_LAYOUT_KEY1 и CHANGE_KEYBOARD_LAYOUT_KEY2.
TODO
- Необходимо изменить порядок переключения между раскладками. Вместо использования горячих клавиш необходимо программное изменение раскладки клавиатуры. В Windows мне известен вариант переключения раскладки для текущего процесса, однако пока не нашёл вариант переключения для произвольного процесса.
- Необходима поддержка Linux и MacOS.
- Реализация скроллинга.