Otomatisasi proses robotik (RPA), seperti pekerja manusia, mengotomatiskan tugas melalui sistem perangkat lunak atau perangkat keras yang berjalan di berbagai aplikasi. Perangkat lunak atau bot dapat mempelajari alur kerja dengan beberapa langkah dan aplikasi, seperti menerima formulir, mengirim pesan pengakuan, memeriksa integritas formulir, mengisi formulir ke dalam folder, dan memperbarui spreadsheet dengan nama formulir, tanggal tunggu pengiriman. Perangkat lunak RPA dirancang untuk meringankan karyawan dari beban menyelesaikan tugas yang berulang dan sederhana.
Harap pastikan bahwa klien yang sesuai telah diinstal pada komputer lokal, dan rpa-client
dan rpa-server
telah dimulai.
Sistem saat ini mendukung klien berikut:
ID Aplikasi | Nama |
---|---|
Wechat wechat | Wechat wechat |
selamat datang | Perusahaan WeChat |
Tencent QQ | |
tim | WAKTU |
dingtalk | DingTalk |
bersenang-senang | Feishu |
Karena tugas harus dijalankan oleh pengguna tertentu, Anda perlu memastikan bahwa pengguna tersebut ada sebelum menjalankan tugas.
http://<host>:<port>/users
POST
JSON
Body
Milik | Jenis | Diperlukan | Keterangan |
---|---|---|---|
pengguna | Pengguna[] | Diperlukan | Array objek pengguna. |
└id | Rangkaian | Opsional | ID Pengguna. Jika kosong, server secara otomatis akan menghasilkan ID. |
└ID aplikasi | Rangkaian | Diperlukan | ID Aplikasi Terkait. |
└akun | Rangkaian | Diperlukan | Akun pengguna, digunakan untuk mencocokkan klien. |
└ Nama panggilan | Rangkaian | Opsional | Nama panggilan pengguna, digunakan untuk tampilan. |
└ nama asli | Rangkaian | Opsional | Nama asli pengguna digunakan untuk ditampilkan. |
└perusahaan | Rangkaian | Opsional | Nama perusahaan tempat pengguna berada digunakan untuk ditampilkan. |
Perhatikan bahwa klien
企业微信
tidak dapat langsung mendapatkanaccount
orang yang masuk saat ini. Saat ini, klien dicocokkan melalui kombinasi${realname}_${company}
.
Contoh antarmuka:
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
Milik | Jenis | Diperlukan | Keterangan |
---|---|---|---|
tugas | Tugas[] | Diperlukan | Array objek tugas. |
└id | Rangkaian | Opsional | ID Tugas. Jika kosong, server secara otomatis akan menghasilkan ID. |
└ ID pengguna | Rangkaian | Diperlukan | ID pengguna terkait. |
└ ketik | Rangkaian | Diperlukan | Jenis tugas, lihat tabel kamus jenis tugas. |
└ prioritas | Bilangan bulat | Opsional | Prioritas tugas, semakin kecil nilainya maka semakin tinggi prioritasnya. Jika kosong, prioritas yang dikonfigurasi secara default akan digunakan. |
└data | Rangkaian | Opsional | Data tugas, dalam format string JSON . |
└ jadwalWaktu | TanggalWaktu | Opsional | Waktu pelaksanaan tugas, misalnya: 2022-01-01 10:00:00 . Jika kosong maka akan langsung dieksekusi. |
Contoh:
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 ' );
Server menyediakan halaman pengujian runtime yang dapat digunakan pengembang untuk menguji tugas-tugas sederhana secara lokal. Buka browser dan kunjungi http://<host>:<port>/index.html
, lalu pilih klien yang akan diuji.
Tidak ada parameter yang diperlukan untuk masuk ke klien
Tidak ada parameter yang diperlukan untuk keluar dari klien
Format parameter:
Milik | Jenis | Diperlukan | Keterangan |
---|---|---|---|
target | Rangkaian | Diperlukan | Kirim objek. |
pesan | Pesan[] | Diperlukan | Array objek pesan. |
└ ketik | Rangkaian | Diperlukan | Jenis pesan. |
└ konten | Rangkaian | Diperlukan | Konten pesan, konten teks atau alamat file. |
Jenis pesan:
Kode | Nama | Keterangan |
---|---|---|
teks | TEKS | teks |
gambar | GAMBAR | gambar |
video | VIDEO | video |
mengajukan | MENGAJUKAN | dokumen |
Contoh parameter:
{
"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 parameter:
Milik | Jenis | Diperlukan | Keterangan |
---|---|---|---|
target | Rangkaian | Diperlukan | Nama grup. |
pesan | Pesan[] | Diperlukan | Array objek pesan. |
└ ketik | Rangkaian | Diperlukan | Jenis pesan. |
└ konten | Rangkaian | Diperlukan | Konten pesan, konten teks atau alamat file. |
Jenis pesan:
Kode | Nama | Keterangan |
---|---|---|
teks | TEKS | teks |
gambar | GAMBAR | gambar |
video | VIDEO | video |
mengajukan | MENGAJUKAN | dokumen |
menyebutkan | MENYEBUTKAN | mengingatkan |
Contoh parameter:
{
"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 "
}
]
}
Tidak ada parameter yang diperlukan untuk masuk ke klien
Tidak ada parameter yang diperlukan untuk keluar dari klien
Format parameter:
Milik | Jenis | Diperlukan | Keterangan |
---|---|---|---|
target | Rangkaian | Diperlukan | Kirim objek. |
pesan | Pesan[] | Diperlukan | Array objek pesan. |
└ ketik | Rangkaian | Diperlukan | Jenis pesan. |
└ konten | Rangkaian | Diperlukan | Konten pesan, konten teks atau alamat file. |
Jenis pesan:
Kode | Nama | Keterangan |
---|---|---|
teks | TEKS | teks |
gambar | GAMBAR | gambar |
video | VIDEO | video |
mengajukan | MENGAJUKAN | dokumen |
Contoh parameter:
{
"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 parameter:
Milik | Jenis | Diperlukan | Keterangan |
---|---|---|---|
target | Rangkaian | Diperlukan | Nama grup. |
pesan | Pesan[] | Diperlukan | Array objek pesan. |
└ ketik | Rangkaian | Diperlukan | Jenis pesan. |
└ konten | Rangkaian | Diperlukan | Konten pesan, konten teks atau alamat file. |
Jenis pesan:
Kode | Nama | Keterangan |
---|---|---|
teks | TEKS | teks |
gambar | GAMBAR | gambar |
video | VIDEO | video |
mengajukan | MENGAJUKAN | dokumen |
menyebutkan | MENYEBUTKAN | mengingatkan |
Contoh parameter:
{
"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 parameter:
Milik | Jenis | Diperlukan | Keterangan |
---|---|---|---|
target | Rangkaian | Diperlukan | Nama grup. |
kontak | Kontak[] | Diperlukan | Array objek kontak. |
└ sasaran | Rangkaian | Diperlukan | Nomor ponsel atau alamat email pengguna. |
└ alasan | Rangkaian | Opsional | Tambahkan catatan kontak. |
Contoh parameter:
{
"contacts" : [
{ "target" : " phone " },
{ "target" : " email " , "reason" : " reason " }
]
}
Terlalu canggih untuk ditampilkan.
Untuk mencegah klien dimulai beberapa kali, pengembang biasanya membuat objek mutex. Mutex adalah mekanisme yang digunakan dalam pemrograman multi-thread untuk melindungi sumber daya bersama agar tidak diakses oleh banyak thread atau proses secara bersamaan.
HANDLE CreateMutexA (
[in, optional] LPSECURITY_ATTRIBUTES lpMutexAttributes,
[in] BOOL bInitialOwner,
[in, optional] LPCSTR lpName
);
[in, optional] lpMutexAttributes
Penunjuk ke struktur SECURITY_ATTRIBUTES. Jika parameter ini adalah NULL
, pegangannya tidak dapat diwarisi oleh proses anak.
Anggota struktur lpSecurityDescriptor
menentukan deskriptor keamanan untuk mutex baru. Jika lpMutexAttributes
adalah NULL
, mutex mendapatkan deskriptor keamanan default. ACL
dalam deskriptor keamanan default mutex berasal dari token utama atau token peniruan identitas pembuatnya.
[in] bInitialOwner
Jika nilai ini TRUE
dan pemanggil membuat mutex, thread pemanggil mengambil kepemilikan awal atas objek mutex. Jika tidak, thread pemanggil tidak mengambil alih kepemilikan kunci mutex. Untuk menentukan apakah pemanggil membuat mutex, lihat bagian Return Values.
[in, optional] lpName
Nama objek mutex. Nama dibatasi maksimal MAX_PATH
karakter. Perbandingan nama peka huruf besar-kecil.
Jika lpName
cocok dengan nama mutex yang sudah ada, fungsi ini meminta akses MUTEX_ALL_ACCESS
. Dalam hal ini, parameter bInitialOwner
diabaikan karena sudah disetel oleh proses pembuatan. Jika parameter lpMutexAttributes
bukan NULL, parameter ini menentukan apakah pegangan dapat diwarisi, namun anggota deskriptor keamanannya diabaikan.
Jika lpName
adalah NULL
, mutex dibuat tanpa nama.
Jika lpName
cocok dengan nama peristiwa, semafor, pengatur waktu tunggu, pekerjaan, atau objek pemetaan file yang ada, fungsinya akan gagal dan fungsi GetLastError mengembalikan ERROR_INVALID_HANDLE
. Hal ini karena objek-objek ini berbagi namespace yang sama.
Nama tersebut dapat memiliki awalan "global" atau "lokal" untuk secara eksplisit membuat objek dalam namespace global atau sesi. Sisa nama dapat berisi karakter apa saja kecuali karakter garis miring terbalik (). Untuk informasi selengkapnya, lihat Namespace Objek Kernel. Gunakan sesi Layanan Terminal untuk peralihan pengguna yang cepat. Nama objek kernel harus mengikuti pedoman yang diuraikan untuk Layanan Terminal sehingga aplikasi dapat mendukung banyak pengguna.
Objek dapat dibuat di namespace pribadi. Untuk informasi selengkapnya, lihat Ruang Nama Objek.
Jika fungsinya berhasil, nilai yang dikembalikan adalah pegangan (Handle) dari objek mutex yang baru dibuat.
Jika fungsinya gagal, nilai yang dikembalikan adalah NULL
. Untuk mendapatkan informasi kesalahan tambahan, panggil fungsi GetLastError.
Jika mutex adalah mutex bernama dan objek sudah ada sebelum fungsi ini dipanggil, nilai yang dikembalikan adalah pegangan ke objek yang ada dan fungsi GetLastError mengembalikan ERROR_ALREADY_EXISTS
.
Process Explorer adalah alat resmi yang disediakan oleh Microsoft untuk mengetahui informasi Handle
dan DLL
bahwa suatu proses telah dibuka atau dimuat.
Halaman resmi Process Explorer: https://docs.microsoft.com/en-us/sysinternals/downloads/process-explorer
Contoh:
Mengambil WeChat sebagai contoh, pertama-tama jalankan WeChat, temukan proses bernama WeChat.exe
di antarmuka utama Process Explorer dan pilih.
Kemudian temukan Handle
dengan Type
Mutant
dan Name
Sessions1BaseNamedObjects_WeChat_App_Instance_Identity_Mutex_Name
di antarmuka Lower Pane
.
Setelah Anda mengklik kanan Close Handle
untuk menutup pegangan, Anda dapat memulai proses baru.
handles = handler . find_handles ( process_ids = [ 10000 ], handle_names = [ r'Sessions1BaseNamedObjects_WeChat_App_Instance_Identity_Mutex_Name' ])
handler . close_handles ( handles )
Kode sumber referensi: client/handler/handler.py
tscon
Saat Anda menggunakan Remote Desktop untuk menyambung ke komputer jarak jauh, menutup Remote Desktop akan mengunci komputer dan menampilkan layar login. Dalam mode lockdown, komputer tidak memiliki GUI
, sehingga pengujian GUI
yang sedang berjalan atau terjadwal akan gagal.
Untuk menghindari masalah dengan pengujian GUI
, Anda dapat menggunakan utilitas tscon
untuk memutuskan sambungan dari desktop jarak jauh. tscon
mengembalikan kontrol ke sesi lokal asli di komputer jarak jauh, melewati layar login. Semua program di komputer jarak jauh tetap berjalan normal, termasuk pengujian GUI
.
tscon
? tscon
adalah alat yang disediakan oleh sistem Windows yang dapat digunakan untuk terhubung ke sesi lain di server Host Sesi Desktop Jarak Jauh.
tscon
? tscon { < sessionID > | < sessionname > } [/dest: < sessionname > ] [/password: < pw > | /password: * ] [/v]
parameter | menggambarkan |
---|---|
<sessionID> | Menentukan ID sesi yang akan dihubungkan. Jika parameter opsional /dest:<sessionname> digunakan, nama sesi saat ini juga dapat ditentukan. |
<sessionname> | Tentukan nama sesi yang akan dihubungkan. |
/ tujuan: <sessionname> | Menentukan nama sesi saat ini. Saat Anda terhubung ke sesi baru, sesi ini akan terputus. Anda juga dapat menggunakan parameter ini untuk menghubungkan sesi pengguna lain ke sesi berbeda. |
/kata sandi: <pw> | Tentukan kata sandi pengguna yang memiliki sesi untuk dihubungkan. Kata sandi ini diperlukan bila pengguna yang terhubung bukan pemilik sesi tersebut. |
/kata sandi: * | Minta kata sandi pengguna yang memiliki sesi yang ingin Anda sambungkan. |
/v | Menampilkan informasi tentang operasi yang sedang dilakukan. |
/? | Tampilkan bantuan pada prompt perintah. |
Untuk memutuskan sambungan dari desktop jarak jauh, jalankan perintah berikut pada komputer jarak jauh (di jendela Koneksi Desktop Jarak Jauh) sebagai administrator, misalnya, dari baris perintah:
%windir% S ystem32 t scon.exe RDP-Tcp# # # NNN /dest:console
Dimana RDP-Tcp### NNN
adalah ID
sesi desktop jarak jauh saat ini, seperti RDP-Tcp#5
. Anda dapat melihatnya di kolom Session pada tab Users di Windows Task Manager .
Anda akan melihat pesan Sesi Layanan Desktop Jarak Jauh Anda telah berakhir dan klien Desktop Jarak Jauh akan ditutup. Namun, semua program dan pengujian di komputer jarak jauh akan tetap berjalan normal.
Tip: Kolom sesi disembunyikan secara default. Untuk menampilkannya, klik kanan di suatu tempat di baris yang menampilkan CPU, Memori, dll. dan pilih Sesi di menu konteks yang terbuka.
Anda dapat menggunakan file batch untuk mengotomatiskan proses pemutusan sambungan. Di komputer jarak jauh, lakukan hal berikut:
for /f " skip=1 tokens=3 " %%s in ( ' query user %USERNAME% ' ) do (
%windir% S ystem32 t scon.exe %%s /dest:console
)
tscon
membuat komputer jarak jauh tidak terkunci, sehingga mengurangi keamanan sistem. Setelah uji coba selesai, Anda dapat mengunci mesin menggunakan perintah berikut:
Rundll32.exe user32.dll, LockWorkStation
Jika proses rdpclip.exe
berjalan di komputer jarak jauh dan clipboard tidak kosong saat Anda memutuskan sambungan dari sesi jarak jauh, proses rdpclip.exe
mungkin gagal.
Untuk menghindari masalah ini, Anda dapat mematikan proses rdpclip.exe
sebelum memutuskan sambungan sesi.
Jika Anda perlu memperluas fungsi otomatisasi atau kompatibel dengan klien dengan versi berbeda, Anda dapat menambahkan atau mengedit skrip tugas di modul rpa-client/app.
Dua metode berikut ini terutama digunakan dalam proyek ini:
pywinauto
Adalah modul python untuk otomatisasi GUI Microsoft Windows. Dalam kasus paling sederhana, ini memungkinkan Anda mengirim operasi mouse dan keyboard ke kotak dialog dan kontrol Windows, namun mendukung operasi yang lebih kompleks, seperti mendapatkan data teks.
uji udara
Ini adalah kerangka pengujian otomatisasi UI berbasis pengenalan gambar lintas platform yang diluncurkan oleh NetEase Games. Cocok untuk game dan aplikasi.
Harap pastikan bahwa sistem operasi yang Anda gunakan adalah Windows 7 ke atas, dan versi Python 3.7.0 ke atas.
Perlu dicatat bahwa versi airtest saat ini bergantung pada pywinauto==0.6.3
, dan proyek saat ini memerlukan pywinauto==0.6.8
. Harap tambahkan parameter --no-deps
saat menginstal dependensi, atau jalankan pip install pywinauto==0.6.8
secara manual 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
File konfigurasi klien terletak di rpa-client/config.yml, dan pengembang dapat mengubah konfigurasi sesuai dengan skenario sebenarnya.
Milik | Keterangan | Bawaan |
---|---|---|
server.host | Tuan rumah server | host lokal |
server.port | Pelabuhan server | 18888 |
server.jalur | Jalur server | /rpa |
server.ssl | Apakah akan mengaktifkan SSL | PALSU |
app.size | Jumlah maksimum program yang dapat dijalankan | 32 |
aplikasi.jalur. <appid> | Jalur program khusus | Dapatkan dari registri |
airtest.cvstrategy | Algoritma pengenalan gambar | [tpl, ayak, cepat] |
airtest.timeout | Algoritma pengenalan gambar | 20 detik |
airtest.timeout-tmp | Algoritma pengenalan gambar | 3 detik |
logging.level | tingkat log | DEBUG |
logging.format | Format catatan | Format bawaan |
logging.nama file | Nama file log | ./logs/rpa-client.log |
Jalankan saja rpa-client/main.py.
Harap pastikan bahwa versi Java yang Anda gunakan adalah 17 atau lebih tinggi. Layanan ini bergantung pada MySQL dan Redis saat dijalankan. Pastikan untuk menginstal dan memulainya sebelum menerapkan layanan.
git clone https://github.com/yihleego/robotic-process-automation.git
cd robotic-process-automation/rpa-server
mvn clean install
Milik | Keterangan | Bawaan |
---|---|---|
spring.datasource.nama kelas driver | Didorong oleh sumber data | com.mysql.cj.jdbc.Driver |
musim semi.datasource.url | URL sumber data | jdbc:mysql://localhost:3306/rpa |
spring.datasource.nama pengguna | Nama pengguna sumber data | |
pegas.datasource.kata sandi | Kata sandi sumber data | |
musim semi.data.redis.host | Tuan rumah Redis | host lokal |
musim semi.data.redis.port | Pelabuhan Redis | 6379 |
pegas.data.redis.kata sandi | Kata sandi ulang | |
pegas.data.redis.database | basis data redis | 0 |
Konfigurasi di atas dapat dimodifikasi di file application.properties.
Milik | Keterangan | Bawaan |
---|---|---|
rpa.websocket.port | Port layanan WebSocket | 18888 |
rpa.websocket.path | Jalur layanan WebSocket | /rpa |
rpa.websocket.idle-timeout | Waktu tunggu layanan WebSocket habis | 5m |
rpa.converter.pola-tanggal-waktu | Format waktu tanggal global | yyyy-MM-dd JJ:mm:ss |
rpa.converter.pola tanggal | format tanggal global | yyyy-MM-dd |
rpa.converter.pola waktu | format waktu global | HH: mm: ss |
rpa.client.cache-key | Format kunci cache klien | rpa:klien: <appid> : <account> |
rpa.client.cache-batas waktu habis | Batas waktu cache klien habis | 5m |
Lihat RpaProperties untuk detailnya.
Sebelum memulai layanan, silakan jalankan skrip berikut di instance MySQL
Jalankan saja RpaApplication.java.
$(".btn").click();
.Untuk menentukan apakah suatu aplikasi mendukung UIA, Anda dapat menggunakan perangkat lunak Inspect yang disediakan secara resmi oleh Microsoft, yang dapat diunduh dari situs resmi atau gudang ini:
Dalam contoh, WeChat menggunakan mode UiaApp karena diimplementasikan berdasarkan UIA; sedangkan Enterprise WeChat menggunakan mode AirApp, yang mirip dengan fakta bahwa hanya ada satu Canvas di halaman web. Semua elemen digambar dan dirender melalui kode , jadi mereka hanya dapat diposisikan melalui pengenalan gambar.
Unduh Paket Visual C++ Redistributable untuk Visual Studio 2013 https://www.microsoft.com/zh-cn/download/confirmation.aspx?id=40784
Silakan merujuk ke: 2#masalah
Proyek ini hanya untuk referensi pembelajaran, mohon jangan digunakan di lingkungan produksi.
Proyek ini berada di bawah lisensi MIT. Lihat file LISENSI untuk detailnya.