デスクトップ自動化で日本語入力する

デスクトップ自動化とかRPA(Robotic Process Automation)とかそういうのでデスクトップのGUIを自動で処理することがある。
Linux だとxte xautomation かxdotool, Python ならpyautogui で出来るが、日本語入力が弱いので最終的にpyperclip を利用したコピペを使った。
sagantaf.hatenablog.com

  • xte xautomation

日本語非対応
最初に手をつけたコマンド
xautomation自動マウス&キーボード操作マニュアル | 外道父の匠
xautomationでよく使うコマンド | maikokiの備忘録 - 楽天ブログ
Ubuntuマウス自動化する方法
テキストを入力する場合は以下のコマンドで出来る。

xte 'str hogetext'

変数を用いてテキストを入力したい場合はeval コマンドを使って入力する。例えば、100文字適当に文字列を発生させてテキスト欄に入力する場合は

text=$(cat /dev/urandom | tr -dc 'a-zA-Z0-9' | fold -w 100 | head -n 1)
eval "xte 'str $text'"

で入力できる。

  • xdotool

日本語は入力はできるが安定しない。
xdotool コマンド全26実例 – console dot log
テキストの入力は以下のコマンドで出来る。xautomation と違って(出来るかもしれないが)1行に複数実行したいコマンドを並べられるので楽である。
おそらくどのタイプのRPAも実行が早すぎて、GUI の項目移動とかで処理落ちしてバグるときがあるので、適宜待機時間を入力したほうがよいと思う。

xdotool sleep 0.1 type text

変数を入力するときも上記と同様にeval コマンドを使って入力する。

text=$(cat /dev/urandom | tr -dc 'a-zA-Z0-9' | fold -w 20 | head -n 1)
eval "xdotool sleep 0.5 type $text"

日本語入力は可能だが、例えば

xdotool sleep 0.1 type あいうえお

としたとき、よくて「あいう」までしか入力されない。ひどいときは「あ」のみもしくは失敗する。
ちょっと改造して、「あ」「い」「う」「え」「お」とばらして一文字ずつ入力するようにしてみたが、これも一文字すら入力失敗する場合にうまくいかなくなる。

プログラム全体の挙動としては、xdotool のほうがxautomation より安定している気がする。

  • pyautogui とpyperclip

Python にRPA ツールとしてpyautogui があり、これにテキストをクリップボードに保持しておくというpyperclip というのがあるのでこれを組み合わせて、コピペ状態からCtrl+V で貼り付ける、というのが日本語入力の代替法になる。

import pyautogui
import pyperclip
pyperclip.copy("入力したい日本語テキスト")
pyautogui.hotkey("ctrl", "v")

Python 自体で実行してもよいが、xdotool でシェルスクリプトを書いてしまっていたので上記を適当に保存して

python3 program.py

で実行してもよい。

これで日本語入力が出来るようになったのだが、実際にそれっぽい日本語というか文章を大量に作るのは面倒である。デスクトップ自動化をしてランダムな文字列をテキスト欄にいれて実行していたら、「真面目に入力してくれませんかね(怒」と指摘されてしまったので、それはそうだ、と思ったのでそれなりに真面目に文章を生成する。
例えば、とある薬剤の説明において、何を説明されたのか、という入力があったとして、全部同一文章のコピペだと怒られるので、少しずつ文言を変更した文章を生成する。
ベースの文章としては

他の施設での使用状況

としたとき、てにおはや各文節での単語は適当に変えればよい。その変更候補を乱数で発生させて、単語もしくは分節ごとに結合すれば、適当な文章の完成である。例では720通りのパターンが生成される。

import random

v = [["", "その"], ["他", "ほか"], ["", "の"], ["施設", "病院", "先生", "医師", "ドクター"], ["の", "での"], ["処方", "使用"], ["状況", "頻度", "動向", "の好み"]]
text = "".join(map(lambda x: random.choice(x), v))
text
そのほかのドクターの処方頻度
その他の医師の処方状況
ほか医師での処方の好み
その他の施設での使用頻度
その他施設での使用頻度
そのほか施設の処方状況
ほかのドクターでの処方状況
その他の施設の処方頻度
その他の施設での処方頻度
他病院での処方状況
そのほかの病院の使用状況
ほかドクターでの処方の好み
ほかドクターの使用動向
そのほか先生での使用の好み