Роботизированная автоматизация процессов (RPA), как и люди, автоматизирует задачи с помощью программных или аппаратных систем, которые работают с различными приложениями. Программное обеспечение или боты могут изучать рабочие процессы, состоящие из нескольких шагов и приложений, таких как получение полученных форм, отправка подтверждающих сообщений, проверка целостности форм, размещение форм в папках и обновление электронных таблиц с указанием имени формы, ожидание даты отправки. Программное обеспечение RPA предназначено для того, чтобы избавить сотрудников от бремени выполнения повторяющихся простых задач.
Убедитесь, что соответствующий клиент установлен на локальном компьютере и запущены как rpa-client
, так и rpa-server
.
Текущая система поддерживает следующих клиентов:
Ид приложения | Имя |
---|---|
Вичат | Вичат |
Веком | Корпоративный WeChat |
Тенсент QQ | |
Тим | ТИМ |
болтовня | DingTalk |
жаворонок | Фейшу |
Поскольку задачи должны выполняться указанным пользователем, перед выполнением задачи необходимо убедиться, что этот пользователь существует.
http://<host>:<port>/users
POST
JSON
Body
Свойство | Тип | Необходимый | Описание |
---|---|---|---|
пользователи | Пользователь[] | Необходимый | Массив пользовательских объектов. |
└ид | Нить | Необязательный | ID пользователя. Если поле пусто, сервер автоматически сгенерирует идентификатор. |
└идентификатор приложения | Нить | Необходимый | Связанный AppID. |
└аккаунт | Нить | Необходимый | Учетная запись пользователя, используемая для сопоставления клиентов. |
└ Псевдоним | Нить | Необязательный | Никнейм пользователя, используемый для отображения. |
└ настоящее имя | Нить | Необязательный | Для отображения используется настоящее имя пользователя. |
└компания | Нить | Необязательный | Для отображения используется название компании, к которой принадлежит пользователь. |
Обратите внимание, что
企业微信
не может напрямую получитьaccount
текущего вошедшего в систему человека. В настоящее время клиент сопоставляется с помощью комбинации${realname}_${company}
.
Пример интерфейса:
curl -X POST --location " http://localhost:8080/users "
-H " Content-Type: application/json "
-d " {
" users " : [
{
" id " : " uid " ,
" appId " : " wechat " ,
" account " : " account " ,
" nickname " : " nickname "
}
]
} "
insert into user (id, app_id, account, nickname, realname, company, status, created_time, updated_time)
values ( ' uid ' , ' wechat ' , ' account ' , ' nickname ' , ' realname ' , ' company ' , 1 , now(), null );
http://<host>:<port>/tasks
POST
JSON
Body
Свойство | Тип | Необходимый | Описание |
---|---|---|---|
задачи | Задача[] | Необходимый | Массив объектов задачи. |
└ид | Нить | Необязательный | Идентификатор задачи. Если поле пусто, сервер автоматически сгенерирует идентификатор. |
└ идентификатор пользователя | Нить | Необходимый | Идентификатор связанного пользователя. |
└ тип | Нить | Необходимый | Тип задачи, обратитесь к таблице словаря типов задач. |
└ приоритет | Целое число | Необязательный | Приоритет задачи: чем меньше значение, тем выше приоритет. Если оно пусто, используется приоритет, настроенный по умолчанию. |
└данные | Нить | Необязательный | Данные задачи в формате строки JSON . |
└ расписаниеВремя | ДатаВремя | Необязательный | Время выполнения задачи, например: 2022-01-01 10:00:00 . Если пусто, оно будет выполнено немедленно. |
Пример:
curl -X PATCH --location " http://localhost:8080/tasks "
-H " Content-Type: application/json "
-d " {
" tasks " : [
{
" id " : " tid " ,
" userId " : " uid " ,
" type " : " login " ,
" priority " : " 0 " ,
" data " : "" ,
" scheduleTime " : " 2022-01-01 10:00:00 " ,
}
]
} "
insert into task (id, user_id, app_id, type, priority, data, status, created_time, updated_time, schedule_time)
values ( ' tid ' , ' uid ' , ' wechat ' , ' login ' , 0 , null , 0 , now(), null , ' 2022-01-01 10:00:00 ' );
Сервер предоставляет тестовую страницу времени выполнения, которую разработчики могут использовать для локального тестирования простых задач. Откройте браузер и посетите http://<host>:<port>/index.html
, а затем выберите клиент для тестирования.
Для входа в клиент никаких параметров не требуется.
Для выхода из клиента не требуются никакие параметры.
Формат параметра:
Свойство | Тип | Необходимый | Описание |
---|---|---|---|
цель | Нить | Необходимый | Отправить объект. |
сообщения | Сообщение[] | Необходимый | Массив объектов сообщения. |
└ тип | Нить | Необходимый | Тип сообщения. |
└ содержание | Нить | Необходимый | Содержимое сообщения, текстовое содержимое или адрес файла. |
Тип сообщения:
Код | Имя | Описание |
---|---|---|
текст | ТЕКСТ | текст |
изображение | ИЗОБРАЖЕНИЕ | картина |
видео | ВИДЕО | видео |
файл | ФАЙЛ | документ |
Пример параметра:
{
"target" : " friend " ,
"messages" : [
{
"type" : " text " ,
"content" : " message "
},
{
"type" : " image " ,
"content" : " https://rpa.leego.io/image.png "
},
{
"type" : " video " ,
"content" : " https://rpa.leego.io/video.mp4 "
},
{
"type" : " file " ,
"content" : " https://rpa.leego.io/file.zip "
}
]
}
Формат параметра:
Свойство | Тип | Необходимый | Описание |
---|---|---|---|
цель | Нить | Необходимый | Название группы. |
сообщения | Сообщение[] | Необходимый | Массив объектов сообщения. |
└ тип | Нить | Необходимый | Тип сообщения. |
└ содержание | Нить | Необходимый | Содержимое сообщения, текстовое содержимое или адрес файла. |
Тип сообщения:
Код | Имя | Описание |
---|---|---|
текст | ТЕКСТ | текст |
изображение | ИЗОБРАЖЕНИЕ | картина |
видео | ВИДЕО | видео |
файл | ФАЙЛ | документ |
упомянуть | УПОМЯНУТЬ | напоминать |
Пример параметра:
{
"target" : " group " ,
"messages" : [
{
"type" : " text " ,
"content" : " message "
},
{
"type" : " image " ,
"content" : " https://rpa.leego.io/image.png "
},
{
"type" : " video " ,
"content" : " https://rpa.leego.io/video.mp4 "
},
{
"type" : " file " ,
"content" : " https://rpa.leego.io/file.zip "
},
{
"type" : " mention " ,
"content" : " member "
}
]
}
Для входа в клиент никаких параметров не требуется.
Для выхода из клиента не требуются никакие параметры.
Формат параметра:
Свойство | Тип | Необходимый | Описание |
---|---|---|---|
цель | Нить | Необходимый | Отправить объект. |
сообщения | Сообщение[] | Необходимый | Массив объектов сообщения. |
└ тип | Нить | Необходимый | Тип сообщения. |
└ содержание | Нить | Необходимый | Содержимое сообщения, текстовое содержимое или адрес файла. |
Тип сообщения:
Код | Имя | Описание |
---|---|---|
текст | ТЕКСТ | текст |
изображение | ИЗОБРАЖЕНИЕ | картина |
видео | ВИДЕО | видео |
файл | ФАЙЛ | документ |
Пример параметра:
{
"target" : " friend " ,
"messages" : [
{
"type" : " text " ,
"content" : " message "
},
{
"type" : " image " ,
"content" : " https://rpa.leego.io/image.png "
},
{
"type" : " video " ,
"content" : " https://rpa.leego.io/video.mp4 "
},
{
"type" : " file " ,
"content" : " https://rpa.leego.io/file.zip "
}
]
}
Формат параметра:
Свойство | Тип | Необходимый | Описание |
---|---|---|---|
цель | Нить | Необходимый | Название группы. |
сообщения | Сообщение[] | Необходимый | Массив объектов сообщения. |
└ тип | Нить | Необходимый | Тип сообщения. |
└ содержание | Нить | Необходимый | Содержимое сообщения, текстовое содержимое или адрес файла. |
Тип сообщения:
Код | Имя | Описание |
---|---|---|
текст | ТЕКСТ | текст |
изображение | ИЗОБРАЖЕНИЕ | картина |
видео | ВИДЕО | видео |
файл | ФАЙЛ | документ |
упомянуть | УПОМЯНУТЬ | напоминать |
Пример параметра:
{
"target" : " group " ,
"messages" : [
{
"type" : " text " ,
"content" : " message "
},
{
"type" : " image " ,
"content" : " https://rpa.leego.io/image.png "
},
{
"type" : " video " ,
"content" : " https://rpa.leego.io/video.mp4 "
},
{
"type" : " file " ,
"content" : " https://rpa.leego.io/file.zip "
},
{
"type" : " mention " ,
"content" : " member "
}
]
}
Формат параметра:
Свойство | Тип | Необходимый | Описание |
---|---|---|---|
цель | Нить | Необходимый | Название группы. |
контакты | Контакт[] | Необходимый | Массив контактных объектов. |
└ цель | Нить | Необходимый | Номер мобильного телефона или адрес электронной почты пользователя. |
└ причина | Нить | Необязательный | Добавьте заметки о контактах. |
Пример параметра:
{
"contacts" : [
{ "target" : " phone " },
{ "target" : " email " , "reason" : " reason " }
]
}
Слишком продвинуто для отображения.
Чтобы предотвратить многократный запуск клиента, разработчики обычно создают объекты мьютекса. Мьютекс — это механизм, используемый в многопоточном программировании для защиты общих ресурсов от одновременного доступа нескольких потоков или процессов.
HANDLE CreateMutexA (
[in, optional] LPSECURITY_ATTRIBUTES lpMutexAttributes,
[in] BOOL bInitialOwner,
[in, optional] LPCSTR lpName
);
[in, optional] lpMutexAttributes
Указатель на структуру SECURITY_ATTRIBUTES. Если этот параметр имеет значение NULL
, дескриптор не может быть унаследован дочерними процессами.
Член структуры lpSecurityDescriptor
определяет дескриптор безопасности для нового мьютекса. Если lpMutexAttributes
имеет NULL
, мьютекс получает дескриптор безопасности по умолчанию. ACL
в дескрипторе безопасности мьютекса по умолчанию берется из основного токена или токена олицетворения создателя.
[in] bInitialOwner
Если это значение равно TRUE
и вызывающая сторона создает мьютекс, вызывающий поток становится первоначальным владельцем объекта мьютекса. В противном случае вызывающий поток не становится владельцем блокировки мьютекса. Чтобы определить, создал ли вызывающий объект мьютекс, см. раздел Возвращаемые значения.
[in, optional] lpName
Имя объекта мьютекса. Имя ограничено символами MAX_PATH
. Сравнение имен чувствительно к регистру.
Если lpName
соответствует имени существующего именованного мьютекса, эта функция запрашивает доступ MUTEX_ALL_ACCESS
. В этом случае параметр bInitialOwner
игнорируется, поскольку он уже установлен в процессе создания. Если параметр lpMutexAttributes
не равен NULL, он определяет, может ли дескриптор быть унаследован, но его член дескриптора безопасности игнорируется.
Если lpName
имеет NULL
, мьютекс создается без имени.
Если lpName
соответствует имени существующего события, семафора, таймера ожидания, задания или объекта сопоставления файлов, функция завершается с ошибкой, и функция GetLastError возвращает ERROR_INVALID_HANDLE
. Это связано с тем, что эти объекты используют одно и то же пространство имен.
Имя может иметь префикс «глобальный» или «локальный» для явного создания объекта в глобальном или сеансовом пространстве имен. Оставшаяся часть имени может содержать любые символы, кроме символа обратной косой черты (). Дополнительные сведения см. в разделе Пространство имен объектов ядра. Используйте сеансы служб терминалов для быстрого переключения пользователей. Имена объектов ядра должны соответствовать рекомендациям, изложенным для служб терминалов, чтобы приложения могли поддерживать несколько пользователей.
Объект может быть создан в частном пространстве имен. Дополнительные сведения см. в разделе Пространства имен объектов.
Если функция завершается успешно, возвращаемым значением является дескриптор (Handle) вновь созданного объекта мьютекса.
Если функция завершается неудачно, возвращаемое значение равно NULL
. Чтобы получить расширенную информацию об ошибке, вызовите функцию GetLastError.
Если мьютекс является именованным мьютексом и объект существовал до вызова этой функции, возвращаемым значением является дескриптор существующего объекта, а функция GetLastError возвращает ERROR_ALREADY_EXISTS
.
Process Explorer — это инструмент, официально предоставляемый Microsoft для поиска информации Handle
и DLL
, которые процесс открыл или загрузил.
Официальная страница Process Explorer: https://docs.microsoft.com/en-us/sysinternals/downloads/process-explorer.
Пример:
Возьмем WeChat в качестве примера: сначала запустите WeChat, найдите процесс с именем WeChat.exe
в главном интерфейсе Process Explorer и выберите его.
Затем найдите Handle
с Type
Mutant
и Name
Sessions1BaseNamedObjects_WeChat_App_Instance_Identity_Mutex_Name
в интерфейсе Lower Pane
.
После того, как вы щелкните правой кнопкой мыши Close Handle
, чтобы закрыть дескриптор, вы можете начать новый процесс.
handles = handler . find_handles ( process_ids = [ 10000 ], handle_names = [ r'Sessions1BaseNamedObjects_WeChat_App_Instance_Identity_Mutex_Name' ])
handler . close_handles ( handles )
Справочный исходный код: client/handler/handler.py.
tscon
Когда вы используете удаленный рабочий стол для подключения к удаленному компьютеру, закрытие удаленного рабочего стола блокирует компьютер и отображает экран входа в систему. В режиме блокировки компьютер не имеет GUI
, поэтому любые текущие или запланированные тесты GUI
завершатся неудачно.
Чтобы избежать проблем с тестированием GUI
, вы можете использовать утилиту tscon
для отключения от удаленного рабочего стола. tscon
возвращает управление исходному локальному сеансу на удаленном компьютере, минуя экран входа в систему. Все программы на удаленном компьютере продолжают работать нормально, включая тестирование GUI
.
tscon
? tscon
— это инструмент, предоставляемый системами Windows, который можно использовать для подключения к другому сеансу на сервере узла сеансов удаленных рабочих столов.
tscon
? tscon { < sessionID > | < sessionname > } [/dest: < sessionname > ] [/password: < pw > | /password: * ] [/v]
параметр | описывать |
---|---|
<sessionID> | Указывает идентификатор сеанса, к которому необходимо подключиться. Если используется необязательный параметр /dest:<sessionname> , также можно указать имя текущего сеанса. |
<sessionname> | Укажите имя сеанса, к которому необходимо подключиться. |
/dest: <sessionname> | Указывает имя текущего сеанса. При подключении к новому сеансу этот сеанс будет отключен. Вы также можете использовать этот параметр для подключения сеанса другого пользователя к другому сеансу. |
/пароль: <pw> | Укажите пароль пользователя, которому принадлежит сеанс, к которому необходимо подключиться. Этот пароль требуется, если подключающийся пользователь не является владельцем сеанса. |
/пароль: * | Запросите пароль пользователя, которому принадлежит сеанс, к которому вы хотите подключиться. |
/в | Отображение информации о выполняемой операции. |
/? | Отобразить справку в командной строке. |
Чтобы отключиться от удаленного рабочего стола, выполните на удаленном компьютере (в окне «Подключение к удаленному рабочему столу») от имени администратора следующую команду, например, из командной строки:
%windir% S ystem32 t scon.exe RDP-Tcp# # # NNN /dest:console
Где RDP-Tcp### NNN
— это ID
текущего сеанса удаленного рабочего стола, например RDP-Tcp#5
. Вы можете увидеть его в столбце «Сеанс» на вкладке «Пользователи» диспетчера задач Windows .
Вы увидите сообщение Ваш сеанс служб удаленных рабочих столов завершился, и клиент удаленного рабочего стола закроется. Однако все программы и тесты на удаленном компьютере продолжат работать нормально.
Совет: Столбец сеанса по умолчанию скрыт. Чтобы отобразить его, щелкните правой кнопкой мыши где-нибудь в строке, отображающей ЦП, Память и т. д., и в открывшемся контекстном меню выберите «Сессия».
Вы можете использовать пакетный файл для автоматизации процесса отключения. На удаленном компьютере выполните следующие действия:
for /f " skip=1 tokens=3 " %%s in ( ' query user %USERNAME% ' ) do (
%windir% S ystem32 t scon.exe %%s /dest:console
)
tscon
сохраняет удаленный компьютер разблокированным, что снижает безопасность системы. После завершения тестового запуска вы можете заблокировать машину с помощью следующей команды:
Rundll32.exe user32.dll, LockWorkStation
Если процесс rdpclip.exe
запущен на удаленном компьютере и буфер обмена не пуст при отключении от удаленного сеанса, процесс rdpclip.exe
может завершиться сбоем.
Чтобы избежать этой проблемы, вы можете завершить процесс rdpclip.exe
перед отключением сеанса.
Если вам необходимо расширить функции автоматизации или обеспечить совместимость с клиентами разных версий, вы можете добавлять или редактировать сценарии задач в модуле rpa-client/app.
В проекте в основном используются следующие два метода:
pywinauto
Это модуль Python для автоматизации графического интерфейса Microsoft Windows. В простейшем случае он позволяет отправлять операции мыши и клавиатуры в диалоговые окна и элементы управления Windows, но поддерживает более сложные операции, такие как получение текстовых данных.
Аиртест
Это кросс-платформенная среда автоматизации тестирования пользовательского интерфейса на основе распознавания изображений, созданная NetEase Games. Она подходит для игр и приложений. Поддерживаемые платформы: Windows, Android и iOS.
Убедитесь, что вы используете операционную систему Windows 7 и выше, а версию Python — 3.7.0 и выше.
Следует отметить, что текущая версия airtest зависит от pywinauto==0.6.3
, а текущий проект требует pywinauto==0.6.8
. Добавьте параметр --no-deps
при установке зависимостей или вручную выполните pip install pywinauto==0.6.8
.
git clone https://github.com/yihleego/robotic-process-automation.git
cd robotic-process-automation/rpa-client
pip install --no-deps -r requirements.txt
Файл конфигурации клиента находится в rpa-client/config.yml, и разработчики могут изменять конфигурацию в соответствии с реальными сценариями.
Свойство | Описание | По умолчанию |
---|---|---|
сервер.хост | Хост сервера | локальный хост |
сервер.порт | Порт сервера | 18888 |
путь к серверу | Путь к серверу | /рпа |
сервер.ssl | Включить ли SSL | ЛОЖЬ |
app.size | Максимальное количество программ, которые можно запустить | 32 |
путь к приложению <appid> . | Пользовательский путь к программе | Получить из реестра |
airtest.cvstrategy | Алгоритм распознавания изображений | [tpl, просеивать, быстро] |
airtest.timeout | Алгоритм распознавания изображений | 20 секунд |
airtest.timeout-tmp | Алгоритм распознавания изображений | 3 секунды |
уровень регистрации | Уровень журнала | ОТЛАЖИВАТЬ |
logging.format | Формат журнала | Формат по умолчанию |
logging.имя_файла | Имя файла журнала | ./logs/rpa-client.log |
Просто запустите rpa-client/main.py.
Убедитесь, что используемая вами версия Java — 17 или выше. Работа службы зависит от MySQL и Redis. Обязательно установите и запустите их перед развертыванием службы.
git clone https://github.com/yihleego/robotic-process-automation.git
cd robotic-process-automation/rpa-server
mvn clean install
Свойство | Описание | По умолчанию |
---|---|---|
Spring.datasource.имя-класса-драйвера | Управляется источником данных | com.mysql.cj.jdbc.Driver |
весна.datasource.url | URL-адрес источника данных | jdbc:mysql://localhost:3306/rpa |
весна.источник данных.имя пользователя | Имя пользователя источника данных | |
весна.datasource.пароль | Пароль источника данных | |
весна.данные.redis.host | Хост Redis | локальный хост |
весна.данные.redis.port | Порт Redis | 6379 |
весна.данные.redis.пароль | Пароль Redis | |
весна.данные.redis.база данных | База данных Redis | 0 |
Приведенную выше конфигурацию можно изменить в файле application.properties.
Свойство | Описание | По умолчанию |
---|---|---|
rpa.websocket.port | Порт службы WebSocket | 18888 |
rpa.websocket.path | Путь к службе WebSocket | /рпа |
rpa.websocket.idle-таймаут | Тайм-аут простоя службы WebSocket | 5 м |
rpa.converter.date-time-pattern | Глобальный формат даты и времени | гггг-ММ-дд ЧЧ:мм:сс |
rpa.converter.date-шаблон | глобальный формат даты | гггг-ММ-дд |
rpa.converter.time-шаблон | глобальный формат времени | ЧЧ:мм:сс |
rpa.client.cache-ключ | Формат ключа кэша клиента | rpa:client: <appid> : <account> |
rpa.client.cache-таймаут | Тайм-аут кэша клиента | 5 м |
Подробности см. в разделе RpaProperties.
Перед запуском службы выполните следующий скрипт в экземпляре MySQL
.
Просто запустите RpaApplication.java.
$(".btn").click();
.Чтобы определить, поддерживает ли приложение UIA, вы можете использовать официально предоставляемое Microsoft программное обеспечение Inspect, которое можно скачать с официального сайта или этого склада:
В этом примере WeChat использует режим UiaApp, поскольку он реализован на основе UIA; в то время как Enterprise WeChat использует режим AirApp, что аналогично тому, что на веб-странице имеется только один Canvas. Все элементы рисуются и визуализируются с помощью кода. , поэтому их можно позиционировать только посредством распознавания изображений.
Загрузите распространяемые пакеты Visual C++ для Visual Studio 2013 https://www.microsoft.com/zh-cn/download/confirmation.aspx?id=40784
Пожалуйста, обратитесь к: 2#проблема
Этот проект предназначен только для ознакомления, не используйте его в производственной среде.
Этот проект находится под лицензией MIT. Подробности см. в файле LICENSE.