pythonでショートカットウィンドウみたいなRPAを作った備忘録（１）

**Pythonのpyautoguiなどのライブラリを使った自作RPAの備忘録。
ライブラリの使い方と実装サンプル。**

**↓↓↓自作RPAのソースコード↓↓↓**
テキストと画像で簡単操作。
ゲームのスキルやアイテムをセットできるショートカットウィンドウをイメージ。
[ソースコード](https://github.com/kayanoke/anata "Git Hub anata")
動画
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">RPAでお絵かきしてみた。 <a href="https://t.co/KaFQPcJKrr">pic.twitter.com/KaFQPcJKrr</a></p>&mdash; ぽこんpͪoͣnͬpͣoͥnͭpͣa͡inͥ 🚀 (@okahpokon) <a href="https://twitter.com/okahpokon/status/1392084470568677383?ref_src=twsrc%5Etfw">May 11, 2021</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

#インストール
* pyautogui 自動化ライブラリ
* opencv [^1]
* pynput キー・マウス監視ライブラリ（バージョン1.6.4）[^2]
* pyperclip クリップボード操作ライブラリ
* playsound 音楽再生ライブラリ

[^1]: pyautoguiのオプションに必要
[^2]: 1.6.4以外だとpyinstallerでexe化できない

```dosbatch:install
pip install pyautogui
pip install opencv-python
pip install pynput==1.6.4
pip instal pyperclip
pip install playsound
```
#pyautoguiチュートリアル
できること

* マウス操作
* キーボード操作
* 画面認識（画面の座標・スクリーンショット取得、画面から画像認識）


**マウス操作**

```python:pyautogui-click
# GUI automation
import pyautogui

# 画面サイズの取得
x, y = pyautogui.size()
x, y = x / 2, y / 2
x2, y2 = x / 3, y / 3
# カーソルの移動速度（秒）
clickduration = 0.5
# クリック
pyautogui.click(x,y,duration=clickduration)
# ダブルクリック
pyautogui.doubleClick(x2,y2,duration=clickduration)
# 右クリック
pyautogui.rightClick(x,y,duration=clickduration)
# カーソル移動
pyautogui.moveTo(x2,y2,duration=clickduration)
# ドラッグ（クリック）
pyautogui.dragTo(x,y,duration=clickduration,button='left')
# スクロール（ーは下方向）
pyautogui.scroll(-100)
```

**キーボード操作**
typewriteは半角全角の制御が別途必要。
回避策は
入力文字をクリップボードにコピーし、hotkeyを使いctrl+vによる貼り付けなど

```python:pyautogui-keyboard
# GUI automation
import pyautogui

# キー入力
pyautogui.press('p')
# キーを押し続ける
pyautogui.keyDown('ctrl')
# キーを離す
pyautogui.keyUp('ctrl')
# ２キー入力
pyautogui.hotkey('ctrl','c')
# 文字列入力
pyautogui.typewrite('typewrite',interval=1)
# 複数キー入力は以下で実装可能
pyautogui.keyDown('win')
pyautogui.keyDown('shift')
pyautogui.press('s')
pyautogui.keyUp('win')
pyautogui.keyUp('shift')
```

**画面の取得と画像認識**

```python:pyautogui-locateonscreen
# GUI automation
import pyautogui

# ターゲット画像のパス
imgpath = 'sample1.png'
# 画像認識精度（0.0～1.0：値が大きいほど精度が高くなる）
confidence = 0.8
# 画面からターゲット画像を取得
target = pyautogui.locateOnScreen(imgpath,confidence=confidence)
# ターゲットの中心座標を取得
x, y = pyautogui.center(target)
# クリック
pyautogui.click(x,y)
```

#pynputチュートリアル
できること

* マウス操作の検出
* キーボード操作の検出

```python:pynput
# マウス・キーボード監視
import pynput

# キーを押したときの処理
def press(key):
    try:
        # 英字キーを入力したときはこっちに行くみたい
        print(key.char)
    except AttributeError:
        # Enterやタブなど特殊なキーはこっち
        print(key)

# キーを離したときの処理
def release(key):
    print(key)
    if key == pynput.keyboard.Key.esc:
        return False

# クリックしたときの処理
def click(x, y, button, pressed):
    print(x, y)
    # 押したときだけ処理するならpressedを追加
    if pressed:
        print('pressed')
    else:
        print('release')

# キーボードリスナー起動 押したときと離したときのイベントを取得
keylistener = pynput.keyboard.Listener(on_press=press,on_release=release)
keylistener.start()

# マウスリスナー起動 クリックしたときのイベントを取得
with pynput.mouse.Listener(on_click=click) as mouselistener:
    mouselistener.join()
```

参考:[【Python RPA】マウス・キーボード操作を同時に検知・取得する方法（pynput）](https://office54.net/python/RPA/python-rpa-pynput)

#pyperclipチュートリアル
できること

* クリップボード監視

```python:pyperclip
# クリップボード監視
import pyperclip

# クリップボードにテキストを格納
pyperclip.copy('test')

# クリップボードの内容を取得
clipboard = pyperclip.paste()

print(clipboard)
```

プログラムを実行するとクリップボードが変更される

---
#RPAプログラムのイメージ

###GUI
* ゲームのスキルバーをイメージ。
* アイコンが横に並んでおり、アイコンをクリックするとRPAプログラムが実行される。
* 実行中は、赤い太枠をつける。
* もう一度アイコンをクリックするか実行し終えると枠が消える。

###RPAプログラム本体
* 命令の書かれたテキストファイルを読み込み、それに沿って処理を実行する。
* テキストを一行ずつ解析、処理を行う。
* 画面認識に使用する画像はあらかじめ用意しておく。

```terminal:テキストファイルイメージ
click/sample.png/     # sample.pngをクリック
typing/Hello World!/  # Hello World! と入力
press/enter/          # Enterキーを押す。
end/                  # 終了
```

今回はここまで。
次回はRPAプログラム本体のコーディングについて説明する予定です。