ロボット プロセス オートメーション (RPA) は、人間の作業者と同様に、さまざまなアプリケーションで実行されるソフトウェアまたはハードウェア システムを通じてタスクを自動化します。ソフトウェアまたはボットは、受信したフォームの取得、確認メッセージの送信、フォームの整合性のチェック、フォルダーへのフォームのファイル、フォーム名や送信日の待機によるスプレッドシートの更新など、複数のステップとアプリケーションを含むワークフローを学習できます。 RPA ソフトウェアは、反復的な単純なタスクを完了する従業員の負担を軽減するように設計されています。
対応するクライアントがローカル コンピューターにインストールされており、 rpa-client
とrpa-server
両方が起動していることを確認してください。
現在のシステムは次のクライアントをサポートしています。
アプリID | 名前 |
---|---|
微信 | 微信 |
ウェコム | エンタープライズ WeChat |
テンセントQQ | |
ティム | ティム |
ディントーク | ディントーク |
ヒバリ | フェイシュ |
タスクは指定されたユーザーによって実行される必要があるため、タスクを実行する前にそのユーザーが存在することを確認する必要があります。
http://<host>:<port>/users
POST
JSON
Body
財産 | タイプ | 必須 | 説明 |
---|---|---|---|
ユーザー | ユーザー[] | 必須 | ユーザー オブジェクトの配列。 |
└ID | 弦 | オプション | ユーザーID。空の場合、サーバーは自動的に ID を生成します。 |
└アプリ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
財産 | タイプ | 必須 | 説明 |
---|---|---|---|
タスク | タスク[] | 必須 | タスクオブジェクトの配列。 |
└ID | 弦 | オプション | タスクID。空の場合、サーバーは自動的に ID を生成します。 |
└ ユーザーID | 弦 | 必須 | 関連付けられたユーザー ID。 |
━ タイプ | 弦 | 必須 | タスクタイプについては、タスクタイプ辞書表を参照してください。 |
└ 優先順位 | 整数 | オプション | タスクの優先度は、値が小さいほど優先度が高くなります。空の場合、デフォルトで設定された優先順位が使用されます。 |
└データ | 弦 | オプション | 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 は、プロセスがオープンまたはロードしたHandle
とDLL
情報を見つけるために Microsoft によって公式に提供されているツールです。
Process Explorer 公式ページ: https://docs.microsoft.com/en-us/sysinternals/downloads/process-explorer
例:
WeChat を例に挙げると、まず WeChat を起動し、プロセス エクスプローラーのメイン インターフェイスでWeChat.exe
という名前のプロセスを見つけて選択します。
次に、 Lower Pane
インターフェイスでType
Mutant
、 Name
Sessions1BaseNamedObjects_WeChat_App_Instance_Identity_Mutex_Name
のHandle
を見つけます。
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
によって Windows リモート デスクトップを閉じた後も対話的な状態を維持する方法リモート デスクトップを使用してリモート コンピュータに接続する場合、リモート デスクトップを閉じるとコンピュータがロックされ、ログイン画面が表示されます。ロックダウン モードでは、コンピュータにGUI
がないため、現在実行中またはスケジュールされているGUI
テストは失敗します。
GUI
テストの問題を回避するには、 tscon
ユーティリティを使用してリモート デスクトップから切断します。 tscon
ログイン画面をバイパスして、リモート コンピューター上の元のローカル セッションに制御を返します。リモート コンピューター上のすべてのプログラムは、 GUI
テストを含め、引き続き通常どおり実行されます。
tscon
って何ですか? tscon
は、Windows システムによって提供されるツールで、リモート デスクトップ セッション ホスト サーバー上の別のセッションに接続するために使用できます。
tscon
の使い方は? tscon { < sessionID > | < sessionname > } [/dest: < sessionname > ] [/password: < pw > | /password: * ] [/v]
パラメータ | 説明する |
---|---|
<sessionID> | 接続するセッションのIDを指定します。オプションの/dest:<sessionname> パラメーターを使用する場合は、現在のセッションの名前も指定できます。 |
<sessionname> | 接続するセッションの名前を指定します。 |
/dest: <sessionname> | 現在のセッションの名前を指定します。新しいセッションに接続すると、このセッションは切断されます。このパラメータを使用して、別のユーザーのセッションを別のセッションに接続することもできます。 |
/パスワード: <pw> | 接続するセッションを所有するユーザーのパスワードを指定します。このパスワードは、接続ユーザーがセッションを所有していない場合に必要です。 |
/パスワード: * | 接続するセッションを所有するユーザーのパスワードの入力を求められます。 |
/v | 実行中の操作に関する情報を表示します。 |
/? | コマンドプロンプトでヘルプを表示します。 |
リモート デスクトップから切断するには、リモート コンピューター ([リモート デスクトップ接続] ウィンドウ内) で管理者として、たとえばコマンド ラインから次のコマンドを実行します。
%windir% S ystem32 t scon.exe RDP-Tcp# # # NNN /dest:console
RDP-Tcp### NNN
は、現在のリモート デスクトップ セッションのID
RDP-Tcp#5
など) です。これは、 Windows タスク マネージャーの[ユーザー]タブの[セッション]列で確認できます。
「リモート デスクトップ サービス セッションが終了し、リモート デスクトップ クライアントが終了します」というメッセージが表示されます。ただし、リモート コンピューター上のすべてのプログラムとテストは引き続き通常どおり実行されます。
ヒント: セッション列はデフォルトでは非表示になっています。これを表示するには、CPU、メモリなどを表示する行のどこかを右クリックし、開いたコンテキスト メニューで [セッション] を選択します。
バッチ ファイルを使用して、切断プロセスを自動化できます。リモート コンピューターで次の操作を実行します。
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 モジュールでタスク スクリプトを追加または編集できます。
このプロジェクトでは主に次の 2 つの方法が使用されます。
pywinauto
Microsoft Windows GUI オートメーション用の Python モジュールです。最も単純なケースでは、マウスやキーボードの操作を Windows のダイアログ ボックスやコントロールに送信できますが、テキスト データの取得など、より複雑な操作もサポートされています。
エアテスト
NetEase Games が開発したクロスプラットフォームの画像認識ベースの UI 自動テスト フレームワークで、サポートされているプラットフォームは 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
実行してください。 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 |
サーバーのパス | サーバーパス | /rpa |
サーバー.ssl | SSLを有効にするかどうか | 間違い |
アプリのサイズ | 実行できるプログラムの最大数 | 32 |
アプリ<appid> パス。 | カスタム プログラム パス | レジストリから取得 |
airtest.cvstrategy | 画像認識アルゴリズム | [tpl、ふるい、活発] |
エアテスト.タイムアウト | 画像認識アルゴリズム | 20秒 |
airtest.timeout-tmp | 画像認識アルゴリズム | 3秒 |
ロギングレベル | ログレベル | デバッグ |
ロギング.フォーマット | ログ形式 | デフォルトの形式 |
ロギング.ファイル名 | ログファイル名 | ./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 |
spring.datasource.url | データソースURL | jdbc:mysql://localhost:3306/rpa |
spring.datasource.ユーザー名 | データソースのユーザー名 | |
spring.datasource.パスワード | データソースのパスワード | |
spring.data.redis.host | Redisホスト | ローカルホスト |
spring.data.redis.port | Redisポート | 6379 |
spring.data.redis.パスワード | Redis パスワード | |
spring.data.redis.database | Redisデータベース | 0 |
上記の構成は、application.properties ファイルで変更できます。
財産 | 説明 | デフォルト |
---|---|---|
rpa.websocket.port | WebSocketサービスポート | 18888 |
rpa.websocket.パス | WebSocketサービスパス | /rpa |
rpa.websocket.idle-timeout | WebSocketサービスのアイドルタイムアウト | 5m |
rpa.converter.日時パターン | グローバル日付時刻形式 | yyyy-MM-dd HH:mm:ss |
rpa.converter.date-pattern | グローバル日付形式 | yyyy-MM-dd |
rpa.converter.time-pattern | グローバル時刻形式 | 高さ:mm:ss |
rpa.client.キャッシュキー | クライアントキャッシュキーの形式 | rpa:クライアント: <appid> : <account> |
rpa.client.キャッシュタイムアウト | クライアントキャッシュタイムアウト | 5m |
詳細については、「Rpaプロパティ」を参照してください。
サービスを開始する前に、 MySQL
インスタンスで次のスクリプトを実行してください。
RpaApplication.java を実行するだけです。
$(".btn").click();
アプリケーションが UIA をサポートしているかどうかを確認するには、Microsoft が公式に提供するソフトウェア Inspect を使用できます。このソフトウェアは、公式 Web サイトまたはこのウェアハウスからダウンロードできます。
この例では、WeChat は UIA に基づいて実装されているため UiaApp モードを使用しますが、Enterprise WeChat は AirApp モードを使用します。これは、Web ページに Canvas が 1 つしかないという事実と同様であり、すべての要素はコードを通じて描画およびレンダリングされます。したがって、画像認識によってのみ位置を特定できます。
Visual Studio 2013 の Visual C++ 再頒布可能パッケージをダウンロード https://www.microsoft.com/zh-cn/download/confirmation.aspx?id=40784
2#問題を参照してください。
このプロジェクトは学習の参考のみを目的としています。実稼働環境では使用しないでください。
このプロジェクトは MIT ライセンスの下にあります。詳細については、LICENSE ファイルを参照してください。