Python Linux環境下でのRPA「pyautogui」

 本記事では、Linux環境下で、Pythonとそのライブラリ「pyautogui」を用いてRPA(Robotic Process Automation)する例として、LibreOffice Calcを操作する雛形コードを載せました。仮想ソフトVirtualBox上のUbuntuで動作確認しています。

ソフトウェアの起動には、subprocess.Popen()を使用します。ウィンドウのアクティブ化にはxwininfoコマンドを使います。作成したファイルの保存と終了はショートカットキーによるメニューバー操作で自動化を実現します。

 下図はその実施例です。文字が斜めにいくつも入力されているのは、RPAで生成した結果です。(ちなみに、本当は日本語入力に変更後に、💩マークを作成したかったのですが、Linux環境下のRPAでは日本語動作が出来ませんでした。Linuxだから日本語使わなくてもいっかということで原因特定まで至っていません)

f:id:HK29:20210815180339p:plain

■本プログラム

Windows環境下での雛形コードは次のリンク先を参照下さい→Python Windows環境下でのRPA「pyautogui」 - PythonとVBAで世の中を便利にする

import os, re
import pyautogui as ag
import subprocess as sp
import time
import random
import datetime
now = datetime.datetime.now()
now = now.strftime("%y%m%d_%H%M%S")


# ウィンドウをアクティブ化する関数
def active_window_func(title):
    # Linuxコマンドxwininfoを用いて、対象アプリのウィンドウ情報(id)を取得する
    cmd_list = ['xwininfo', '-tree', '-root', '|', 'grep', title]
    cmd = ' '.join(cmd_list)
    result = sp.run(cmd, encoding='UTF-8', shell=True,
                    stdout=sp.PIPE, stderr=sp.PIPE)
    app_id = result.stdout.split()[0]
    print('app_id', app_id)

    # 上記で取得したウィンドウ情報からそのidを元に、ウィンドウ座標を取得する
    cmd_list2 = ['xwininfo', '-id', app_id, '|', 'grep', 'Absolute']
    cmd2 = ' '.join(cmd_list2)
    result2 = sp.run(cmd2, encoding='UTF-8', shell=True,
                    stdout=sp.PIPE, stderr=sp.PIPE)
    result_list = result2.stdout.split()
    print('result_list', result_list)

    print(ag.position())
    # 取得した座標にてウィンドウをアクティブ化する
    x, y = int(result_list[3]), (int(result_list[7]) - 10)
    print('x, y', x, y)
    ag.moveTo(x, y, 1)
    ag.click()
    time.sleep(1) 


# LibreOffice Calcを起動してセルを操作してファイルに保存する関数
def libreoffice_calc_func():
    # 保存するファイル名
    file_name = now + '.ods'
    # 保存するファイルパス
    save_file_path = dir_path + r'/' + file_name
    # 使用OS用に変換
    save_file_path = save_file_path.replace('/', os.sep)

    # アプリを開く。Popenにより、アプリを閉じるのを待たずに次のスクリプトへ進む
    cmd = 'libreoffice --calc'
    sp.Popen(cmd.split())
    time.sleep(6) # 6秒待つ

    # ウィンドウをアクティブ化
    active_window_func('Calc')

    # 文字をタイプする
    ag.write('Hello LibreOffice !!', interval=0.1)
    ag.press('enter')
    # 連続でボタンを押したい場合ではリストで与えることもできる
    str_list = ['enter', 'down', 'tab']
    ag.press(str_list)

    #ag.press('kanji') # 日本語に変換
    ag.write('unnko', interval=0.1)
    #for _ in range(2):
    #    ag.press('tab') # 💩マークに変換するため
    ag.press('down') # 
    ag.press('up') # 
    ag.hotkey('ctrl', 'c') # セルをコピー
    
    # 同じボタンを連続で押したい場合
    for i in range(20):
        ag.press('right')
        ag.press('down')
        ag.hotkey('ctrl', 'v') # ペースト

    # 文字入力を英数字に戻す
    #ag.press('kanji')

    # 「名前を付けて保存」を開く
    ag.hotkey('alt','f')
    ag.press('a')
    time.sleep(1) 

    # ファイ保存のパスを書く
    ag.write(save_file_path)

    # ファイルを保存する
    ag.press('enter')
    time.sleep(1)

    # 終了する
    ag.hotkey('alt', 'f')
    ag.press('x')
    print(save_file_path)


if __name__ == '__main__':
    # ディレクトリパス
    dir_path = os.getcwd()

    # RPA関数の実行
    libreoffice_calc_func() 

    print('finished')

以上

<広告>