# 4. Функции Keyboard ## Общее Клавиатура - это главный текстовый инструмент, который обладает 100% точностью передачи данных. С его помощью можно отправлять сообщения, ожидать нажатия и выполнять различные комбинации клавиш. На этой странице представлена вся необходимая информация по управлению клавиатурой со стороны программного робота RPA. В отличие от многих RPA платформ, pyOpenRPA обладает функциями, которые не зависят от текущей раскладки клавиатуры. За счет этого надежность и стабильность программного робота существенно возрастает. ВНИМАНИЕ! ПРИ ВЫЗОВЕ ФУНКЦИЙ ОБРАЩАЙТЕ ВНИМАНИЕ НА РЕГИСТР. ## Доп. настройки в LINUX Используется компонент setxkbmap: apt-get install x11-xkb-utils (компонент для взаимодействия с клавиатурой, [https://command-not-found.com/setxkbmap](https://command-not-found.com/setxkbmap)) Особенности ОС Linux позволяют выполнять ввод разноязычного текста только через переключение раскладок клавиатуры в режиме реального времени По умолчанию установлены следующие раскладки для Русского и английского языков: Keyboard.KEY_RUS_LAYOUT = «ru» # NEED FOR LINUX (FOR LAYOUT SWITCH) Keyboard.KEY_ENG_LAYOUT = «us» # NEED FOR LINUX (FOR LAYOUT SWITCH) Проверить, что данные раскладки работают корректно, можно с помощью следующей команды в терминале: setxkbmap -layout us,ru -option grp:alt_shift_toggle После ввода попробуйте ввести английские символы, после чего переключиться на другой язык с помощью комбинации клавиш Alt+Shift Если у вас используются другие layout, то вы можете указать их в переменных Keyboard.KEY_RUS_LAYOUT и Keyboard.KEY_ENG_LAYOUT для русского и английского языков соответственно. ## Примеры использования ``` # Keyboard: Взаимодействие с клавиатурой from pyOpenRPA.Robot import Keyboard Keyboard.HotkeyCombination(Keyboard.KEY_HOT_WIN_LEFT,Keyboard.KEY_ENG_R) Keyboard.Write("cmd") Keyboard.Send(Keyboard.KEY_HOT_ENTER, inWaitAfterSecFloat=0.6) Keyboard.Write("echo %time%") Keyboard.Send(Keyboard.KEY_HOT_ENTER) Keyboard.HotkeyCombination(Keyboard.KEY_HOT_CTRL_LEFT, Keyboard.KEY_ENG_A, inWaitAfterSecFloat=0.6) Keyboard.HotkeyCombination(Keyboard.KEY_HOT_CTRL_LEFT, Keyboard.KEY_ENG_C, inWaitAfterSecFloat=0.6) ``` Коды клавиш см. ниже ## Описание функций Описание каждой функции начинается с обозначения L+,W+, что означает, что функция поддерживается в ОС Linux (L) и Windows (W) **Functions:** | `Down`(inKeyInt[, inWaitAfterSecFloat]) | L+,W+: Нажать (опустить) клавишу. | | `HotkeyCombination`(\*inKeyList[, …]) | L+,W+: Получает перечень клавиш для одновременного нажатия. | | `HotkeyCtrlA_CtrlC`([inWaitAfterSecFloat]) | L+,W+: Выполнить выделение текста, после чего скопировать его в буфер обмена ВНИМАНИЕ! НЕ ЗАВИСИТ ОТ ТЕКУЩЕЙ РАСКЛАДКИ КЛАВИАТУРЫ | | `HotkeyCtrlV`([inWaitAfterSecFloat]) | L+,W+: Выполнить вставку текста из буфера обмена ВНИМАНИЕ! НЕ ЗАВИСИТ ОТ ТЕКУЩЕЙ РАСКЛАДКИ КЛАВИАТУРЫ | | `IsDown`(inKeyInt) | L+,W+: Проверить, опущена ли клавиша. | | `Send`(inKeyInt[, inDoPressBool, …]) | L+,W+: Имитация нажатия/отпускания любой физической клавиши. | | `Up`(inKeyInt[, inWaitAfterSecFloat]) | L+,W+: Отпустить (поднять) клавишу. | | `Wait`(inKeyInt[, inWaitAfterSecFloat]) | L-,W+: Блокирует осуществление программы, пока данная обозначенная клавиша не будет нажата. | | `Write`(inTextStr[, inDelayFloat, …]) | L+,W+: Печатает текст, который был передан в переменной inTextStr (поддерживает передачу в одной строке символов разного языка). | **Data:** | `KEY_ENG_COLON` | | | `KEY_HOT_COLON` | | | `KEY_RUS_Ж` | | ### pyOpenRPA.Robot.Keyboard.Down(inKeyInt: int, inWaitAfterSecFloat: float = 0.4) L+,W+: Нажать (опустить) клавишу. Если клавиша уже была опущена, то ничего не произойдет. ВНИМАНИЕ! ПРИ ПОПЫТКЕ ПЕЧАТИ ТЕКСТА БУДЕТ УЧИТЫВАТЬ ТЕКУЩУЮ РАСКЛАДКУ КЛАВИАТУРЫ. ДЛЯ ПЕЧАТИ ТЕКСТА ИСПОЛЬЗУЙ Write! ``` # Keyboard: Взаимодействие с клавиатурой from pyOpenRPA.Robot import Keyboard Keyboard.Down(Keyboard.KEY_ENG_A) # Отпустить клавишу A. ``` * **Параметры** * **inKeyInt** (*int*) – Перечень клавиш см. в разделе «Коды клавиш». Пример: KEY_HOT_CTRL_LEFT, KEY_ENG_A * **inWaitAfterSecFloat** (*float**, **опциональный*) – Количество секунд, которые ожидать после выполнения операции. По умолчанию установлено в настройках модуля Keyboard (базовое значение 0.4) ### pyOpenRPA.Robot.Keyboard.HotkeyCombination(\*inKeyList, inDelaySecFloat=0.3, inWaitAfterSecFloat: float = 0.4) L+,W+: Получает перечень клавиш для одновременного нажатия. Между нажатиями программа ожидания время inDelaySecFloat ВНИМАНИЕ! НЕ ЗАВИСИТ ОТ ТЕКУЩЕЙ РАСКЛАДКИ КЛАВИАТУРЫ ``` # Keyboard: Взаимодействие с клавиатурой from pyOpenRPA.Robot import Keyboard Keyboard.HotkeyCombination(Keyboard.KEY_HOT_CTRL_LEFT,Keyboard.KEY_ENG_A) # Ctrl + a Keyboard.HotkeyCombination(Keyboard.KEY_HOT_CTRL_LEFT,Keyboard.KEY_ENG_C) # Ctrl + c Keyboard.HotkeyCombination(Keyboard.KEY_HOT_CTRL_LEFT,Keyboard.KEY_ENG_A) Keyboard.HotkeyCombination(Keyboard.KEY_HOT_ALT_LEFT,Keyboard.KEY_HOT_TAB, Keyboard.KEY_HOT_TAB) ``` * **Параметры** * **inKeyList** – Список клавиш для одновременного нажатия. Перечень клавиш см. в разделе «Коды клавиш». Пример: KEY_HOT_CTRL_LEFT,KEY_ENG_A * **inDelaySecFloat** (*float**, **опциональный*) – Интервал между нажатиями. Необходим в связи с тем, что операционной системе требуется время на реакцию на нажатие клавиш, по умолчанию: 0.3 * **inWaitAfterSecFloat** (*float**, **опциональный*) – Количество секунд, которые ожидать после выполнения операции. По умолчанию установлено в настройках модуля Keyboard (базовое значение 0.4) ### pyOpenRPA.Robot.Keyboard.HotkeyCtrlA_CtrlC(inWaitAfterSecFloat: float = 0.4) L+,W+: Выполнить выделение текста, после чего скопировать его в буфер обмена ВНИМАНИЕ! НЕ ЗАВИСИТ ОТ ТЕКУЩЕЙ РАСКЛАДКИ КЛАВИАТУРЫ ``` # Keyboard: Взаимодействие с клавиатурой from pyOpenRPA.Robot import Keyboard Keyboard.HotkeyCtrlA_CtrlC() # Отправить команды: выделить все, скопировать в буфер обмена ``` * **Параметры** **inWaitAfterSecFloat** (*float**, **опциональный*) – Количество секунд, которые ожидать после выполнения операции. По умолчанию установлено в настройках модуля Keyboard (базовое значение 0.4) ### pyOpenRPA.Robot.Keyboard.HotkeyCtrlV(inWaitAfterSecFloat: float = 0.4) L+,W+: Выполнить вставку текста из буфера обмена ВНИМАНИЕ! НЕ ЗАВИСИТ ОТ ТЕКУЩЕЙ РАСКЛАДКИ КЛАВИАТУРЫ ``` # Keyboard: Взаимодействие с клавиатурой from pyOpenRPA.Robot import Keyboard Keyboard.HotkeyCtrlV() ``` * **Параметры** **inWaitAfterSecFloat** (*float**, **опциональный*) – Количество секунд, которые ожидать после выполнения операции. По умолчанию установлено в настройках модуля Keyboard (базовое значение 0.4) ### pyOpenRPA.Robot.Keyboard.IsDown(inKeyInt: int) L+,W+: Проверить, опущена ли клавиша. Вернет True если опущена; False если поднята. ВНИМАНИЕ! ПРИ ПОПЫТКЕ ПЕЧАТИ ТЕКСТА БУДЕТ УЧИТЫВАТЬ ТЕКУЩУЮ РАСКЛАДКУ КЛАВИАТУРЫ. ДЛЯ ПЕЧАТИ ТЕКСТА ИСПОЛЬЗУЙ Write! ``` # Keyboard: Взаимодействие с клавиатурой from pyOpenRPA.Robot import Keyboard lKeyAIsPressedBool = Keyboard.IsDown(Keyboard.KEY_ENG_A) # Проверить, опущена ли клавиша A. ``` * **Параметры** **inKeyInt** (*int*) – Перечень клавиш см. в разделе «Коды клавиш». Пример: KEY_HOT_CTRL_LEFT, KEY_ENG_A ### pyOpenRPA.Robot.Keyboard.KEY_ENG_COLON( = 39) ### pyOpenRPA.Robot.Keyboard.KEY_HOT_COLON( = 39) ### pyOpenRPA.Robot.Keyboard.KEY_RUS_Ж( = 39) ### pyOpenRPA.Robot.Keyboard.Send(inKeyInt: int, inDoPressBool: bool = True, inDoReleaseBool: bool = True, inWaitAfterSecFloat: float = 0.4) L+,W+: Имитация нажатия/отпускания любой физической клавиши. Посылает событие в операционную систему, которые выполняет нажатие и отпускание данной клавиши ВНИМАНИЕ! ПРИ ПОПЫТКЕ ПЕЧАТИ ТЕКСТА БУДЕТ УЧИТЫВАТЬ ТЕКУЩУЮ РАСКЛАДКУ КЛАВИАТУРЫ. ДЛЯ ПЕЧАТИ ТЕКСТА ИСПОЛЬЗУЙ Write! ``` # Keyboard: Взаимодействие с клавиатурой from pyOpenRPA.Robot import Keyboard Keyboard.Send(Keyboard.KEY_ENG_A) # Нажать клавишу A. Если будет активна русская раскладка, то будет выведена буква ф. ``` * **Параметры** * **inKeyInt** (*int*) – Перечень клавиш см. в разделе «Коды клавиш». Пример: KEY_HOT_CTRL_LEFT,KEY_ENG_A * **inDoPressBool** (*bool**, **опциональный*) – Выполнить событие нажатия клавиши, По умолчанию True * **inDoReleaseBool** (*bool**, **опциональный*) – Выполнить событие отпускания клавиши, По умолчанию True * **inWaitAfterSecFloat** (*float**, **опциональный*) – Количество секунд, которые ожидать после выполнения операции. По умолчанию установлено в настройках модуля Keyboard (базовое значение 0.4) ### pyOpenRPA.Robot.Keyboard.Up(inKeyInt: int, inWaitAfterSecFloat: float = 0.4) L+,W+: Отпустить (поднять) клавишу. Если клавиша уже была поднята, то ничего не произойдет. ВНИМАНИЕ! ПРИ ПОПЫТКЕ ПЕЧАТИ ТЕКСТА БУДЕТ УЧИТЫВАТЬ ТЕКУЩУЮ РАСКЛАДКУ КЛАВИАТУРЫ. ДЛЯ ПЕЧАТИ ТЕКСТА ИСПОЛЬЗУЙ Write! ``` # Keyboard: Взаимодействие с клавиатурой from pyOpenRPA.Robot import Keyboard Keyboard.Up(Keyboard.KEY_ENG_A) # Отпустить клавишу A. ``` * **Параметры** * **inKeyInt** (*int*) – Перечень клавиш см. в разделе «Коды клавиш». Пример: KEY_HOT_CTRL_LEFT, KEY_ENG_A * **inWaitAfterSecFloat** (*float**, **опциональный*) – Количество секунд, которые ожидать после выполнения операции. По умолчанию установлено в настройках модуля Keyboard (базовое значение 0.4) ### pyOpenRPA.Robot.Keyboard.Wait(inKeyInt: int, inWaitAfterSecFloat: float = 0.4) L-,W+: Блокирует осуществление программы, пока данная обозначенная клавиша не будет нажата. ВНИМАНИЕ! НЕ ЗАВИСИТ ОТ ТЕКУЩЕЙ РАСКЛАДКИ КЛАВИАТУРЫ. ОЖИДАЕТ НАЖАТИЕ СООТВЕТСВУЮЩЕЙ ФИЗИЧЕСКОЙ КЛАВИШИ ``` # Keyboard: Взаимодействие с клавиатурой from pyOpenRPA.Robot import Keyboard Keyboard.Wait(Keyboard.KEY_ENG_A) # Ждать нажатие клавиши A. ``` * **Параметры** * **inKeyInt** (*int*) – Перечень клавиш см. в разделе «Коды клавиш». Пример: KEY_HOT_CTRL_LEFT,KEY_ENG_A * **inWaitAfterSecFloat** (*float**, **опциональный*) – Количество секунд, которые ожидать после выполнения операции. По умолчанию установлено в настройках модуля Keyboard (базовое значение 0.4) ### pyOpenRPA.Robot.Keyboard.Write(inTextStr: str, inDelayFloat: float = 0, inRestoreStateAfterBool: bool = True, inExactBool: Optional[bool] = None, inWaitAfterSecFloat: float = 0.4) L+,W+: Печатает текст, который был передан в переменной inTextStr (поддерживает передачу в одной строке символов разного языка). Не зависит от текущей раскладки клавиатуры! Посылает искусственные клавишные события в ОС, моделируя печать данного текста. Знаки, не доступные на клавиатуре, напечатаны как явный unicode знаки, использующие определенную для ОС функциональность, такие как alt+codepoint. Чтобы гарантировать текстовую целостность, все в настоящее время нажатые ключи выпущены прежде текст напечатан, и модификаторы восстановлены впоследствии. ВНИМАНИЕ! ПЕЧАТАЕТ ЛЮБУЮ СТРОКУ, ДАЖЕ В СОЧЕТАНИИ НЕСКОЛЬКИХ ЯЗЫКОВ ОДНОВРЕМЕННО. ДЛЯ РАБОТЫ С ГОРЯЧИМИ КЛАВИШАМИ ИСПОЛЬЗУЙ ФУНКЦИЮ Send, Up, Down, HotkeyCombination ВНИМАНИЕ! В LINUX НЕ ДЕЙСТВУЮТ СЛЕДУЮЩИЕ ПАРАМЕТРЫ: inRestoreStateAfterBool, inExactBool ``` # Keyboard: Взаимодействие с клавиатурой from pyOpenRPA.Robot import Keyboard Keyboard.Write("Привет мой милый мир! Hello my dear world!") ``` * **Параметры** * **inTextStr** (*str*) – Текст, отправляемый на печать. Не зависит от текущей раскладки клавиатуры! * **inDelayFloat** (*float**, **опциональный*) – Число секунд, которое ожидать между нажатиями. По умолчанию 0 * **inRestoreStateAfterBool** (*bool**, **опциональный*) – Может использоваться, чтобы восстановить регистр нажатых ключей после того, как текст напечатан, т.е. нажимает ключи, которые были выпущены в начало. * **inExactBool** (*bool**, **опциональный*) – Печатает все знаки как явный unicode. Необязательный параметр * **inWaitAfterSecFloat** (*float**, **опциональный*) – Количество секунд, которые ожидать после выполнения операции. По умолчанию установлено в настройках модуля Keyboard (базовое значение 0.4) ## Коды клавиш Ниже представлены коды горячих клавиш, а также символов русской и английской раскладки. ``` # ШЕСТНАДЦАТИРИЧНЫЙ СКАН-КОД В РУССКОЙ РАСКЛАДКЕ (НЕЗАВИСИМО ОТ ВЫБРАННОГО ЯЗЫКА НА КЛАВИАТУРЕ) # ОТОБРАЖЕНИЕ СКАН КОДОВ НА КЛАВИАТУРЕ https://snipp.ru/handbk/scan-codes KEY_RUS_Ф = 0x1E #A KEY_RUS_И = 0x30 #B KEY_RUS_С = 0x2E #C KEY_RUS_В = 0x20 #D KEY_RUS_У = 0x12 #E KEY_RUS_А = 0x21 #F KEY_RUS_П = 0x22 #G KEY_RUS_Р = 0x23 #H KEY_RUS_Ш = 0x17 #I KEY_RUS_О = 0x24 #J KEY_RUS_Л = 0x25 #K KEY_RUS_Д = 0x26 #L KEY_RUS_Ь = 0x32 #M KEY_RUS_Т = 0x31 #N KEY_RUS_Щ = 0x18 #O KEY_RUS_З = 0x19 #P KEY_RUS_Й = 0x10 #Q KEY_RUS_К = 0x13 #R KEY_RUS_Ы = 0x1F #S KEY_RUS_Е = 0x14 #T KEY_RUS_Г = 0x16 #U KEY_RUS_М = 0x2F #V KEY_RUS_Ц = 0x11 #W KEY_RUS_Ч = 0x2D #X KEY_RUS_Н = 0x15 #Y KEY_RUS_Я = 0x2C #Z KEY_RUS_Ё = 0x29 #~ KEY_RUS_Ж = 0x27 #: KEY_RUS_Б = 0x33 #< KEY_RUS_Ю = 0x34 #> KEY_RUS_Х = 0x1A #[ KEY_RUS_Ъ = 0x1B #] KEY_RUS_Э = 0x28 #' KEY_ENG_A = 0x1E #A KEY_ENG_B = 0x30 #B KEY_ENG_C = 0x2E #C KEY_ENG_D = 0x20 #D KEY_ENG_E = 0x12 #E KEY_ENG_F = 0x21 #F KEY_ENG_G = 0x22 #G KEY_ENG_H = 0x23 #H KEY_ENG_I = 0x17 #I KEY_ENG_J = 0x24 #J KEY_ENG_K = 0x25 #K KEY_ENG_L = 0x26 #L KEY_ENG_M = 0x32 #M KEY_ENG_N = 0x31 #N KEY_ENG_O = 0x18 #O KEY_ENG_P = 0x19 #P KEY_ENG_Q = 0x10 #Q KEY_ENG_R = 0x13 #R KEY_ENG_S = 0x1F #S KEY_ENG_T = 0x14 #T KEY_ENG_U = 0x16 #U KEY_ENG_V = 0x2F #V KEY_ENG_W = 0x11 #W KEY_ENG_X = 0x2D #X KEY_ENG_Y = 0x15 #Y KEY_ENG_Z = 0x2C #Z KEY_HOT_NUMPAD_0 = 0x52 KEY_HOT_NUMPAD_1 = 0x4F KEY_HOT_NUMPAD_2 = 0x50 KEY_HOT_NUMPAD_3 = 0x51 KEY_HOT_NUMPAD_4 = 0x4B KEY_HOT_NUMPAD_5 = 0x4C KEY_HOT_NUMPAD_6 = 0x4D KEY_HOT_NUMPAD_7 = 0x47 KEY_HOT_NUMPAD_8 = 0x48 KEY_HOT_NUMPAD_9 = 0x49 KEY_HOT_NUMPAD_ASTERISK = 0x37 #* KEY_HOT_NUMPAD_PLUS = 0x4E KEY_HOT_NUMPAD_MINUS = 0x4A KEY_HOT_NUMPAD_DELETE = 0x53 KEY_HOT_NUMPAD_SOLIDUS = 0x35 #/ KEY_HOT_NUMPAD_ENTER = 0x11c KEY_HOT_F1 = 0x3B KEY_HOT_F2 = 0x3C KEY_HOT_F3 = 0x3D KEY_HOT_F4 = 0x3E KEY_HOT_F5 = 0x3F KEY_HOT_F6 = 0x40 KEY_HOT_F7 = 0x41 KEY_HOT_F8 = 0x42 KEY_HOT_F9 = 0x43 KEY_HOT_F10 = 0x44 KEY_HOT_F11 = 0x57 KEY_HOT_F12 = 0x58 KEY_HOT_F13 = 0x7C KEY_HOT_F14 = 0x7D KEY_HOT_F15 = 0x7E KEY_HOT_F16 = 0x7F KEY_HOT_F17 = 0x80 KEY_HOT_F18 = 0x81 KEY_HOT_F19 = 0x82 KEY_HOT_F20 = 0x83 KEY_HOT_F21 = 0x84 KEY_HOT_F22 = 0x85 KEY_HOT_F23 = 0x86 KEY_HOT_F24 = 0x87 KEY_HOT_TILDE = 0x29 #~ KEY_HOT_COLON = 0x27 #: KEY_HOT_PLUS = 0x0D #+ KEY_HOT_MINUS = 0x0C #- KEY_HOT_LESS_THAN = 0x33 #< , KEY_HOT_GREATER_THAN = 0x34 #> . KEY_HOT_SOLIDUS = 0x35 #/ ? KEY_HOT_SQUARE_BRACKET_LEFT = 0x1A #[ KEY_HOT_SQUARE_BRACKET_RIGHT = 0x1B #] KEY_HOT_APOSTROPHE = 0x28 #' " KEY_HOT_VERTICAL_LINE = 0x2B #| \ KEY_HOT_ESC = 0x1 KEY_HOT_BACKSPACE = 0x0E KEY_HOT_TAB = 0x0F KEY_HOT_ENTER = 0x1C KEY_HOT_CONTEXT_MENU = 0x15D KEY_HOT_SHIFT_LEFT = 0x2A KEY_HOT_SHIFT_RIGHT = 0x36 KEY_HOT_CTRL_LEFT = 0x1D KEY_HOT_CTRL_RIGHT = 0x11D KEY_HOT_ALT_LEFT = 0x38 KEY_HOT_ALT_RIGHT = 0x138 KEY_HOT_WIN_LEFT = 0x5B KEY_HOT_WIN_RIGHT = 0x5C KEY_HOT_CAPS_LOCK = 0x3A KEY_HOT_NUM_LOCK = 0x45 KEY_HOT_SCROLL_LOCK = 0x46 KEY_HOT_END = 0x4F KEY_HOT_HOME = 0x47 KEY_HOT_SPACE = 0x39 KEY_HOT_PAGE_UP = 0x49 KEY_HOT_PAGE_DOWN = 0x51 KEY_HOT_CLEAR = 0x4C KEY_HOT_LEFT = 0x4B KEY_HOT_UP = 0x48 KEY_HOT_RIGHT = 0x4D KEY_HOT_DOWN = 0x50 KEY_HOT_PRINT_SCREEN = 0x137 KEY_HOT_INSERT = 0x52 KEY_HOT_DELETE = 0x53 KEY_HOT_0 = 0xB KEY_HOT_1 = 0x2 KEY_HOT_2 = 0x3 KEY_HOT_3 = 0x4 KEY_HOT_4 = 0x5 KEY_HOT_5 = 0x6 KEY_HOT_6 = 0x7 KEY_HOT_7 = 0x8 KEY_HOT_8 = 0x9 KEY_HOT_9 = 0xA ``` ## Дополнительная функциональность Дополнительно модуль содержит функции вспомогательной библиотеки. Ознакомиться с описанием можно [Здесь](https://github.com/boppreh/keyboard#api) ``` # Пример использования функции send from pyOpenRPA.Robot import Keyboard Keyboard.send(57) ``` ## Быстрая навигация * [Сообщество pyOpenRPA (telegram)](https://t.me/pyOpenRPA) * [Сообщество pyOpenRPA (tenchat)](https://tenchat.ru/iMaslov?utm_source=19f2a84f-3268-437f-950c-d987ae42af24) * [Сообщество pyOpenRPA (вконтакте)](https://vk.com/pyopenrpa) * [Презентация pyOpenRPA](https://pyopenrpa.ru/Index/pyOpenRPA_product_service.pdf) * [Портал pyOpenRPA](https://pyopenrpa.ru) * [Репозиторий pyOpenRPA](https://gitlab.com/UnicodeLabs/OpenRPA) .. v1.2.14 replace:: v1.2.14