L'automatisation des processus robotiques (RPA), comme les travailleurs humains, automatise les tâches via des systèmes logiciels ou matériels qui s'exécutent sur une variété d'applications. Les logiciels ou les robots peuvent apprendre des flux de travail comportant plusieurs étapes et applications, telles que l'obtention de formulaires reçus, l'envoi de messages d'accusé de réception, la vérification de l'intégrité des formulaires, le classement des formulaires dans des dossiers et la mise à jour des feuilles de calcul avec le nom du formulaire, l'attente de la date de soumission. Le logiciel RPA est conçu pour soulager les employés du fardeau que représente l’exécution de tâches simples et répétitives.
Veuillez vous assurer que le client correspondant a été installé sur l'ordinateur local et que rpa-client
et rpa-server
ont été démarrés.
Le système actuel prend en charge les clients suivants :
ID d'application | Nom |
---|---|
bienvenue | Entreprise WeChat |
Tencent QQ | |
Tim | TIM |
dingtalk | DingTalk |
alouette | Feishu |
Étant donné que les tâches doivent être exécutées par un utilisateur spécifié, vous devez vous assurer que l'utilisateur existe avant d'exécuter la tâche.
http://<host>:<port>/users
POST
JSON
Body
Propriété | Taper | Requis | Description |
---|---|---|---|
utilisateurs | Utilisateur[] | Requis | Tableau d'objets utilisateur. |
└id | Chaîne | Facultatif | ID de l'utilisateur. Lorsqu'il est vide, le serveur générera automatiquement un identifiant. |
└identifiant d'application | Chaîne | Requis | ID d’application associé. |
└compte | Chaîne | Requis | Compte utilisateur, utilisé pour faire correspondre les clients. |
└ Pseudo | Chaîne | Facultatif | Pseudonyme de l'utilisateur, utilisé pour l'affichage. |
└ vrai nom | Chaîne | Facultatif | Le vrai nom de l'utilisateur est utilisé pour l'affichage. |
└entreprise | Chaîne | Facultatif | Le nom de l'entreprise à laquelle appartient l'utilisateur est utilisé pour l'affichage. |
Notez que
企业微信
ne peut pas obtenir directementaccount
de la personne actuellement connectée. Actuellement, le client est mis en correspondance via la combinaison de${realname}_${company}
.
Exemple d'interface :
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
Propriété | Taper | Requis | Description |
---|---|---|---|
tâches | Tâche[] | Requis | Tableau d’objets de tâche. |
└id | Chaîne | Facultatif | ID de tâche. Lorsqu'il est vide, le serveur générera automatiquement un identifiant. |
└ identifiant utilisateur | Chaîne | Requis | ID utilisateur associé. |
└ tapez | Chaîne | Requis | Type de tâche, reportez-vous au tableau du dictionnaire des types de tâches. |
└ priorité | Entier | Facultatif | Priorité de la tâche, plus la valeur est petite, plus la priorité est élevée. Lorsqu'elle est vide, la priorité configurée par défaut est utilisée. |
└données | Chaîne | Facultatif | Données de tâche, au format de chaîne JSON . |
└ horaireHeure | DateHeure | Facultatif | Heure d'exécution de la tâche, par exemple : 2022-01-01 10:00:00 . S'il est vide, il sera exécuté immédiatement. |
Exemple:
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 ' );
Le serveur fournit une page de test d'exécution que les développeurs peuvent utiliser pour tester des tâches simples localement. Ouvrez le navigateur et visitez http://<host>:<port>/index.html
, puis sélectionnez le client à tester.
Aucun paramètre n'est requis pour se connecter au client
Aucun paramètre n'est requis pour se déconnecter du client
Format des paramètres :
Propriété | Taper | Requis | Description |
---|---|---|---|
cible | Chaîne | Requis | Envoyer l'objet. |
messages | Message[] | Requis | Tableau d'objets de message. |
└ tapez | Chaîne | Requis | Type de message. |
└ contenu | Chaîne | Requis | Contenu du message, contenu du texte ou adresse du fichier. |
Type de message :
Code | Nom | Description |
---|---|---|
texte | TEXTE | texte |
image | IMAGE | image |
vidéo | VIDÉO | vidéo |
déposer | DÉPOSER | document |
Exemple de paramètre :
{
"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 "
}
]
}
Format des paramètres :
Propriété | Taper | Requis | Description |
---|---|---|---|
cible | Chaîne | Requis | Nom du groupe. |
messages | Message[] | Requis | Tableau d'objets de message. |
└ tapez | Chaîne | Requis | Type de message. |
└ contenu | Chaîne | Requis | Contenu du message, contenu du texte ou adresse du fichier. |
Type de message :
Code | Nom | Description |
---|---|---|
texte | TEXTE | texte |
image | IMAGE | image |
vidéo | VIDÉO | vidéo |
déposer | DÉPOSER | document |
mention | MENTION | rappeler |
Exemple de paramètre :
{
"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 "
}
]
}
Aucun paramètre n'est requis pour se connecter au client
Aucun paramètre n'est requis pour se déconnecter du client
Format des paramètres :
Propriété | Taper | Requis | Description |
---|---|---|---|
cible | Chaîne | Requis | Envoyer l'objet. |
messages | Message[] | Requis | Tableau d'objets de message. |
└ tapez | Chaîne | Requis | Type de message. |
└ contenu | Chaîne | Requis | Contenu du message, contenu du texte ou adresse du fichier. |
Type de message :
Code | Nom | Description |
---|---|---|
texte | TEXTE | texte |
image | IMAGE | image |
vidéo | VIDÉO | vidéo |
déposer | DÉPOSER | document |
Exemple de paramètre :
{
"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 "
}
]
}
Format des paramètres :
Propriété | Taper | Requis | Description |
---|---|---|---|
cible | Chaîne | Requis | Nom du groupe. |
messages | Message[] | Requis | Tableau d'objets de message. |
└ tapez | Chaîne | Requis | Type de message. |
└ contenu | Chaîne | Requis | Contenu du message, contenu du texte ou adresse du fichier. |
Type de message :
Code | Nom | Description |
---|---|---|
texte | TEXTE | texte |
image | IMAGE | image |
vidéo | VIDÉO | vidéo |
déposer | DÉPOSER | document |
mention | MENTION | rappeler |
Exemple de paramètre :
{
"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 "
}
]
}
Format des paramètres :
Propriété | Taper | Requis | Description |
---|---|---|---|
cible | Chaîne | Requis | Nom du groupe. |
contacts | Contact[] | Requis | Tableau d'objets de contact. |
└ cible | Chaîne | Requis | Numéro de téléphone portable ou adresse e-mail de l’utilisateur. |
└ raison | Chaîne | Facultatif | Ajoutez des notes de contact. |
Exemple de paramètre :
{
"contacts" : [
{ "target" : " phone " },
{ "target" : " email " , "reason" : " reason " }
]
}
Trop avancé pour l'affichage.
Afin d'éviter que le client ne soit démarré plusieurs fois, les développeurs créent généralement des objets mutex. Un mutex est un mécanisme utilisé dans la programmation multithread pour protéger les ressources partagées contre l'accès par plusieurs threads ou processus en même temps.
HANDLE CreateMutexA (
[in, optional] LPSECURITY_ATTRIBUTES lpMutexAttributes,
[in] BOOL bInitialOwner,
[in, optional] LPCSTR lpName
);
[in, optional] lpMutexAttributes
Pointeur vers une structure SECURITY_ATTRIBUTES. Si ce paramètre est NULL
, le handle ne peut pas être hérité par les processus enfants.
Le membre lpSecurityDescriptor
de la structure spécifie le descripteur de sécurité du nouveau mutex. Si lpMutexAttributes
est NULL
, le mutex obtient un descripteur de sécurité par défaut. ACL
dans le descripteur de sécurité par défaut du mutex provient du jeton principal ou d'usurpation d'identité du créateur.
[in] bInitialOwner
Si cette valeur est TRUE
et que l'appelant crée le mutex, le thread appelant devient propriétaire initial de l'objet mutex. Sinon, le thread appelant ne devient pas propriétaire du verrou mutex. Pour déterminer si l'appelant a créé le mutex, consultez la section Valeurs de retour.
[in, optional] lpName
Le nom de l'objet mutex. Le nom est limité à MAX_PATH
caractères. Les comparaisons de noms sont sensibles à la casse.
Si lpName
correspond au nom d'un mutex nommé existant, cette fonction demande l'accès MUTEX_ALL_ACCESS
. Dans ce cas, le paramètre bInitialOwner
est ignoré car il est déjà défini par le processus de création. Si le paramètre lpMutexAttributes
n'est pas NULL, il détermine si le handle peut être hérité, mais son membre descripteur de sécurité est ignoré.
Si lpName
est NULL
, le mutex est créé sans nom.
Si lpName
correspond au nom d'un événement existant, d'un sémaphore, d'un minuteur attendu, d'un travail ou d'un objet de mappage de fichier, la fonction échoue et la fonction GetLastError renvoie ERROR_INVALID_HANDLE
. En effet, ces objets partagent le même espace de noms.
Le nom peut avoir un préfixe « global » ou « local » pour créer explicitement l'objet dans l'espace de noms global ou de session. Le reste du nom peut contenir n'importe quel caractère à l'exception de la barre oblique inverse (). Pour plus d’informations, consultez Espace de noms d’objet du noyau. Utilisez les sessions des services Terminal Server pour un changement rapide d'utilisateur. Les noms d'objet du noyau doivent suivre les directives décrites pour les services Terminal Server afin que les applications puissent prendre en charge plusieurs utilisateurs.
L'objet peut être créé dans un espace de noms privé. Pour plus d’informations, consultez Espaces de noms d’objet.
Si la fonction réussit, la valeur de retour est le handle (Handle) de l'objet mutex nouvellement créé.
Si la fonction échoue, la valeur de retour est NULL
. Pour obtenir des informations d’erreur étendues, appelez la fonction GetLastError.
Si le mutex est un mutex nommé et que l'objet existait avant l'appel de cette fonction, la valeur de retour est un handle vers l'objet existant et la fonction GetLastError renvoie ERROR_ALREADY_EXISTS
.
Process Explorer est un outil officiellement fourni par Microsoft pour rechercher les informations Handle
et DLL
qu'un processus a ouvert ou chargé.
Page officielle de Process Explorer : https://docs.microsoft.com/en-us/sysinternals/downloads/process-explorer
Exemple:
En prenant WeChat comme exemple, démarrez d'abord WeChat, recherchez le processus nommé WeChat.exe
dans l'interface principale de Process Explorer et sélectionnez-le.
Recherchez ensuite Handle
avec Type
Mutant
et Name
Sessions1BaseNamedObjects_WeChat_App_Instance_Identity_Mutex_Name
dans l'interface Lower Pane
.
Après avoir cliqué avec le bouton droit sur Close Handle
pour fermer le handle, vous pouvez démarrer un nouveau processus.
handles = handler . find_handles ( process_ids = [ 10000 ], handle_names = [ r'Sessions1BaseNamedObjects_WeChat_App_Instance_Identity_Mutex_Name' ])
handler . close_handles ( handles )
Code source de référence : client/handler/handler.py
tscon
Lorsque vous utilisez Remote Desktop pour vous connecter à un ordinateur distant, la fermeture de Remote Desktop verrouille l'ordinateur et affiche l'écran de connexion. En mode verrouillage, l'ordinateur n'a pas GUI
, donc tous les tests GUI
en cours d'exécution ou planifiés échoueront.
Pour éviter les problèmes avec les tests GUI
, vous pouvez utiliser l'utilitaire tscon
pour vous déconnecter du poste de travail distant. tscon
rend le contrôle à la session locale d'origine sur l'ordinateur distant, en contournant l'écran de connexion. Tous les programmes sur l'ordinateur distant continuent de s'exécuter normalement, y compris les tests GUI
.
tscon
? tscon
est un outil fourni par les systèmes Windows qui peut être utilisé pour se connecter à une autre session sur le serveur hôte de session Bureau à distance.
tscon
? tscon { < sessionID > | < sessionname > } [/dest: < sessionname > ] [/password: < pw > | /password: * ] [/v]
paramètre | décrire |
---|---|
<sessionID> | Spécifie l'ID de la session à laquelle se connecter. Si le paramètre facultatif /dest:<sessionname> est utilisé, le nom de la session en cours peut également être spécifié. |
<sessionname> | Spécifiez le nom de la session à laquelle se connecter. |
/dest : <sessionname> | Spécifie le nom de la session en cours. Lorsque vous vous connectez à une nouvelle session, cette session sera déconnectée. Vous pouvez également utiliser ce paramètre pour connecter la session d'un autre utilisateur à une autre session. |
/mot de passe : <pw> de passe> | Spécifiez le mot de passe de l'utilisateur propriétaire de la session à laquelle se connecter. Ce mot de passe est obligatoire lorsque l'utilisateur qui se connecte n'est pas propriétaire de la session. |
/mot de passe: * | Demander le mot de passe de l'utilisateur propriétaire de la session à laquelle vous souhaitez vous connecter. |
/v | Afficher des informations sur l'opération en cours. |
/? | Afficher l'aide à l'invite de commande. |
Pour vous déconnecter d'un poste de travail distant, exécutez la commande suivante sur l'ordinateur distant (dans la fenêtre Connexion Bureau à distance) en tant qu'administrateur, par exemple, à partir de la ligne de commande :
%windir% S ystem32 t scon.exe RDP-Tcp# # # NNN /dest:console
Où RDP-Tcp### NNN
est ID
de la session de bureau à distance actuelle, tel que RDP-Tcp#5
. Vous pouvez le voir dans la colonne Session de l'onglet Utilisateurs du Gestionnaire des tâches Windows .
Vous verrez le message Votre session des services Bureau à distance est terminée et le client Bureau à distance se fermera. Cependant, tous les programmes et tests sur l’ordinateur distant continueront de s’exécuter normalement.
Astuce : La colonne de session est masquée par défaut. Pour l'afficher, cliquez avec le bouton droit quelque part dans la ligne affichant le processeur, la mémoire, etc. et sélectionnez Session dans le menu contextuel qui s'ouvre.
Vous pouvez utiliser un fichier batch pour automatiser le processus de déconnexion. Sur l'ordinateur distant, procédez comme suit :
for /f " skip=1 tokens=3 " %%s in ( ' query user %USERNAME% ' ) do (
%windir% S ystem32 t scon.exe %%s /dest:console
)
tscon
maintient l'ordinateur distant déverrouillé, ce qui réduit la sécurité du système. Une fois le test terminé, vous pouvez verrouiller la machine à l'aide de la commande suivante :
Rundll32.exe user32.dll, LockWorkStation
Si le processus rdpclip.exe
est en cours d'exécution sur l'ordinateur distant et que le presse-papiers n'est pas vide lorsque vous vous déconnectez de la session distante, le processus rdpclip.exe
peut échouer.
Pour éviter ce problème, vous pouvez arrêter le processus rdpclip.exe
avant de déconnecter la session.
Si vous devez étendre les fonctions d'automatisation ou être compatible avec des clients de différentes versions, vous pouvez ajouter ou modifier des scripts de tâches dans le module rpa-client/app.
Les deux méthodes suivantes sont principalement utilisées dans le projet :
pywinauto
Est un module python pour l'automatisation de l'interface graphique de Microsoft Windows. Dans le cas le plus simple, il vous permet d'envoyer des opérations de souris et de clavier vers des boîtes de dialogue et des contrôles Windows, mais il prend en charge des opérations plus complexes, telles que l'obtention de données texte.
Test aérien
Il s'agit d'un cadre de test d'automatisation d'interface utilisateur multiplateforme basé sur la reconnaissance d'images lancé par NetEase Games. Il convient aux jeux et aux applications. Les plates-formes prises en charge sont Windows, Android et iOS.
Veuillez vous assurer que le système d'exploitation que vous utilisez est Windows 7 et supérieur et que la version Python est 3.7.0 et supérieure.
Il convient de noter que la version actuelle d'airtest dépend de pywinauto==0.6.3
et que le projet actuel nécessite pywinauto==0.6.8
. Veuillez ajouter le paramètre --no-deps
lors de l'installation des dépendances ou exécuter manuellement 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
Le fichier de configuration client se trouve dans rpa-client/config.yml et les développeurs peuvent modifier la configuration en fonction de scénarios réels.
Propriété | Description | Défaut |
---|---|---|
serveur.hôte | Hôte du serveur | hôte local |
serveur.port | Port du serveur | 18888 |
serveur.chemin | Chemin du serveur | /rpa |
serveur.ssl | S'il faut activer SSL | FAUX |
app.size | Nombre maximum de programmes pouvant être exécutés | 32 |
<appid> . | Chemin d'accès au programme personnalisé | Obtenir du registre |
airtest.cvstratégie | Algorithme de reconnaissance d'images | [tpl, tamiser, rapide] |
airtest.timeout | Algorithme de reconnaissance d'images | 20 secondes |
airtest.timeout-tmp | Algorithme de reconnaissance d'images | 3 secondes |
niveau de journalisation | Niveau de journalisation | DÉBOGUER |
journalisation.format | Format du journal | Format par défaut |
journalisation.nom de fichier | Nom du fichier journal | ./logs/rpa-client.log |
Exécutez simplement rpa-client/main.py.
Veuillez vous assurer que la version Java que vous utilisez est 17 ou supérieure. Le service dépend de MySQL et Redis lors de son exécution. Assurez-vous de les installer et de les démarrer avant de déployer le service.
git clone https://github.com/yihleego/robotic-process-automation.git
cd robotic-process-automation/rpa-server
mvn clean install
Propriété | Description | Défaut |
---|---|---|
spring.datasource.driver-class-name | Piloté par la source de données | com.mysql.cj.jdbc.Driver |
spring.datasource.url | URL de la source de données | jdbc:mysql://localhost:3306/rpa |
spring.datasource.username | Nom d'utilisateur de la source de données | |
spring.datasource.password | Mot de passe de la source de données | |
spring.data.redis.host | Hôte Redis | hôte local |
spring.data.redis.port | Port Redis | 6379 |
spring.data.redis.mot de passe | Mot de passe Redis | |
spring.data.redis.database | Base de données Redis | 0 |
La configuration ci-dessus peut être modifiée dans le fichier application.properties.
Propriété | Description | Défaut |
---|---|---|
rpa.websocket.port | Port de service WebSocket | 18888 |
rpa.websocket.path | Chemin du service WebSocket | /rpa |
rpa.websocket.idle-timeout | Délai d'inactivité du service WebSocket | 5m |
rpa.converter.date-time-pattern | Format de date et d'heure global | aaaa-MM-jj HH:mm:ss |
rpa.converter.date-modèle | format de date global | aaaa-MM-jj |
rpa.converter.time-pattern | format d'heure global | HH : mm : ss |
rpa.client.cache-key | Format de clé de cache client | rpa:client : <appid> : <account> |
rpa.client.cache-timeout | Délai d'expiration du cache client | 5m |
Voir RpaProperties pour plus de détails.
Avant de démarrer le service, veuillez exécuter le script suivant dans l'instance MySQL
Exécutez simplement RpaApplication.java.
$(".btn").click();
Pour déterminer si une application prend en charge UIA, vous pouvez utiliser le logiciel Inspect officiellement fourni par Microsoft, téléchargeable depuis le site officiel ou cet entrepôt :
Dans l'exemple, WeChat utilise le mode UiaApp car il est implémenté sur la base de l'UIA ; tandis qu'Enterprise WeChat utilise le mode AirApp, ce qui est similaire au fait qu'il n'y a qu'un seul canevas dans une page Web. Tous les éléments sont dessinés et rendus via du code. , ils ne peuvent donc être positionnés que par reconnaissance d'image .
Téléchargez les packages redistribuables Visual C++ pour Visual Studio 2013 https://www.microsoft.com/zh-cn/download/confirmation.aspx?id=40784
Veuillez vous référer à : 2#numéro
Ce projet est uniquement destiné à la référence d'apprentissage, veuillez ne pas l'utiliser dans un environnement de production.
Ce projet est sous licence MIT. Voir le fichier LICENSE pour plus de détails.