WSL2におけるPyAutoGUIを利用したキーボードの自動入力

# はじめに
PyAutoGUI ([ドキュメント](https://pyautogui.readthedocs.io/en/latest/)) は、Pythonスクリプトによるマウスやキーボードの自動操作を可能にするライブラリです。この記事ではWSL2でPyAutoGUIをインストールし、キーボードから文字を自動で入力することを目指します。

# 環境
- Windows 10
- Ubuntu 18.04 LTS (WSL2)
- Python 3.6.9

# 手順
1. (Ubuntu) pipのインストール
1. (Ubuntu) PyAutoGUIのインストール
1. (Windows) VcXsrvのインストール・起動
1. (Ubuntu) VcXsrvの設定
1. (Ubuntu) ブラウザのインストール

の手順で進めます。

## 1. (Ubuntu) pipのインストール
pipはPythonのパッケージ管理システムです。PyAutoGUIのインストールに利用します。

```bash:bash
$ sudo apt update -y
$ sudo apt install -y python3-pip
$ python3 -m pip install --upgrade pip
```

### 参考
- [Ubuntu 環境の pip - Python.jp](https://www.python.jp/install/ubuntu/pip.html)

## 2. (Ubuntu) PyAutoGUIのインストール
PyAutoGUIはPythonのライブラリです。マウスやキーボードの自動操作を可能にします。

```bash:bash
$ sudo apt install -y scrot python3-tk python3-dev
$ python3 -m pip install pyautogui
```

### 参考
- [Installation - PyAutoGUI's documentation!](https://pyautogui.readthedocs.io/en/latest/install.html)

## 3. (Windows) VcXsrvのインストール・起動
VcXsrvはWindowsで動作するXサーバです。LinuxのGUIアプリケーションをWindowsで利用できるようになります。

### インストール
1. [VcXsrvのダウンロードサイト](https://sourceforge.net/projects/vcxsrv/)からVcXsrvのインストーラをダウンロード
![vcxsrv_download.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/472944/c75fb36c-3af1-7694-7ada-2840e3adf8f5.png)
1. インストーラを起動
![vcxsrv_installer.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/472944/c0060427-4c77-3f74-3bcf-28c4df71608a.png)
1. オプションを選択し"Next"をクリック
![vcxsrv_setup.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/472944/927fc0ec-f130-3051-2646-3b860a6bfd98.png)
1. インストールするフォルダを選択し"Install"をクリック
![vcxsrv_install.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/472944/06a39868-0f6d-0158-97ab-a3f063549af0.png)
1. インストールが完了したら"close"をクリック
![vcxsrv_close.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/472944/b8d30531-ad69-fe34-e79b-3e71646f45b5.png)

### 起動
1. Windowsのスタートメニュー > "VcXsrv" > "XLaunch" をクリック
![vcxsrv_launch.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/472944/e1e07716-6f7c-4fdc-adc4-89e6f3493745.png)
1. "Multiple windows"を選択し「次へ」をクリック
![vcxsrv_launch_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/472944/c756c07d-b0f9-193a-9e3f-5efe24423f44.png)
1. "Start no client"を選択し「次へ」をクリック
![vcxsrv_launch_3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/472944/7da1db52-2f16-5c1d-5b28-5009cd449f9e.png)
1. すべてのチェックボックスにチェックを入れ「次へ」をクリック
![vcxsrv_launch_4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/472944/140c6549-8451-b3ca-0a5d-4598d777de74.png)
1. 「完了」をクリック
![vcxsrv_launch_5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/472944/06d1a67b-552e-5ce1-99f4-f98fe252ad7a.png)
1. (オプション) Windows起動時にVcXsrvを自動で起動する設定
    1. 「完了」をクリックする前に"Save configuration"をクリックし、任意の場所に"config.xlaunch"を保存
    ![vcxsrv_auto_launch.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/472944/11187fa0-442b-1de4-1bb0-ab107d752fbe.png)
    1. "Windowsキー + R"で「ファイル名を指定して実行」を開き"shell:startup"を実行
    ![vcxsrv_auto_launch_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/472944/3d05b1a5-669d-5dfa-4386-4c5de55e08cd.png)
    1. 開いたフォルダで右クリックし「新規作成」>「ショートカット」をクリック
    ![vcxsrv_auto_launch_3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/472944/4518405b-805f-6b1d-c49a-367873b0e804.png)
    1. 「参照」から保存した"config.xlaunch"を選択し「次へ」をクリック
    ![vcxsrv_auto_launch_4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/472944/73a9d817-76e0-9a4a-3163-119b56a7e007.png)
    1. 名前を付けて「完了」をクリック
    ![vcxsrv_auto_launch_5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/472944/5a9db2fc-bde1-5fda-975a-2679f461854f.png)

### 参考
- [【WSL2】VcXsrvでUbuntu GUIアプリケーションを実行する【Xサーバー】 – たまテク](https://tamnology.com/wsl2-vcxsrv/)
- [VcXsrv（Win版Xサーバー）を自動起動する方法 | りんか ネット](https://rin-ka.net/windows-x-server-vcxsrv-start/)

## 4. (Ubuntu) VcXsrvの設定
UbuntuにVcXsrvの存在を教えるために、環境変数`DISPLAY`にIPアドレスを設定します。環境によって設定する値は異なるようです。
- `export DISPLAY=$(grep nameserver /etc/resolv.conf | awk '{print $2}'):0.0` または
- `export DISPLAY=$(route.exe print | grep 0.0.0.0 | head -1 | awk '{print $4}'):0.0`

自分の環境では2番目のほうで動きました。

```bash
$ vi ~/.bashrc
-----
...
# add for VcXsrv
export DISPLAY=$(route.exe print | grep 0.0.0.0 | head -1 | awk '{print $4}'):0.0
-----
$ exec $SHELL -l
```
またVcXsrvへ接続するための権限設定をおこないます。
```bash
$ touch ~/.Xauthority
$ xauth generate (DISPLAYに設定したIPアドレス):0 . trusted
```

### 動作確認
```
$ sudo apt install -y x11-apps
$ xeyes
```
以下のような目のアプリが表示されればOKです。
![xeyes.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/472944/b4c08f55-85e6-5e14-2d6b-60a878514aa7.png)

### 参考
- [WSL2におけるVcXsrvの設定 - Qiita](https://qiita.com/ryoi084/items/0dff11134592d0bb895c)
- [Can't use X-Server in WSL 2 · Issue #4106 · microsoft/WSL](https://github.com/microsoft/WSL/issues/4106)
- [ubuntu - WSL 2: Run Graphical Linux Desktop Applications from Windows 10 Bash Shell "Error E233: cannot open display" - Stack Overflow](https://stackoverflow.com/questions/61860208/wsl-2-run-graphical-linux-desktop-applications-from-windows-10-bash-shell-erro/66398613#66398613)
- [.xauthority does not exist - Linux Error - xauth not creating .xauthority file](https://akashmittal.com/xauthority-not-exist/)

## 5. (Ubuntu) ブラウザのインストール
今回はGoogle Chromeをインストールします。試していませんが他のブラウザでも大丈夫だと思います。
```bash
$ sudo sh -c 'echo "deb http://dl.google.com/linux/chrome/deb/ stable main" >> /etc/apt/sources.list.d/google-chrome.list'
$ sudo wget -q -O - https://dl-ssl.google.com/linux/linux_signing_key.pub | sudo apt-key add -
$ sudo apt update
$ sudo apt install -y google-chrome-stable unifont
```

### 動作確認
```bash
$ google-chrome
```
コンソールにエラーが表示されるかもですが、起動はできます。
![chrome.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/472944/aaf70a0c-710e-a311-7774-5339d29ebbbe.png)

### 参考
- [WSL (Windows Subsystem for Linux) で文字化け - ばいばいバイオ](https://www.kimoton.com/entry/2018/06/08/083114)

# PyAutoGUIでキーボード自動入力
簡単なプログラムを動かしてみます。
```python:test.py
import pyautogui
import webbrowser
import time

# DeepL翻訳を開きます
webbrowser.open("https://www.deepl.com/ja/translator")
# 開くまでラグがあるため5秒ほど待ちます
time.sleep(5)
# "Hello, world!"を日本語に翻訳します
pyautogui.write("Hello, world!")
```
文字が自動入力されて翻訳されることが確認できます！
![result.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/472944/985419e8-e40a-cb6b-d7bc-5e5840436b53.png)


# おわりに
今回はWSL2でPyAutoGUIを動かしてみました。[WSLg](https://github.com/microsoft/wslg)を使えばもっと簡単にできるかも…？今度試してみようと思います。