見出し画像

『退屈なことはPythonにやらせよう』20章 GUI自動化によるキーボードとマウスの操作のらくがき帳📝

こんにちは。aliceです。
今年の7月からぼちぼちやってきた退屈Pythonのnoteもこれが最後となりました。
あんなに暑かったのに、今ではすっかり涼しくなりました。


今回はPyAutoGUIによるGUIの自動化です。
RPAっぽいですね。
前に少しやったPower Automate for Desktopを思い出しました。


前回のらくがき帳




20章 英語版🔤


GitHub💖


20.5 マウス操作を制御する


おもしろそうなのでペイントでお絵描きしました🖍

import time

import pyautogui


def auto_mouse_move(duration, distance, change):
    """
    指定した時間待機後に自動的にマウスを操作する関数。
    :param duration: 待機時間(秒)
    :param distance: マウスを動かす距離
    :param change: マウスを動かす距離の変化量
    :return:

    """
    time.sleep(duration)
    pyautogui.click()

    while distance > 0:
        pyautogui.drag(distance, 0, duration=0.2)
        distance = distance - change
        pyautogui.drag(0, distance, duration=0.2)
        pyautogui.drag(-distance, 0, duration=0.2)
        distance = distance - change
        pyautogui.drag(0, -distance, duration=0.2)


if __name__ == '__main__':
    # 関数を呼び出す(引数を指定)
    auto_mouse_move(10, 300, 20)



20.6 マウス移動を計画する


座標値などを記録するにはmouseInfo()関数が便利ですよーというはなし。

import pyautogui
pyautogui.mouseInfo()


これで記録できるのは便利ですね。

20.13 プロジェクト:自動フォーム入力


googleフォームに自動入力します。
https://autbor.com/formのフォームを使います。

怖いので、送信はしないようにしました。

import time

import pyautogui
import pyperclip


def paste_and_restore_clipboard(text):
    """
    テキストを貼り付けて元のクリップボードの内容を復元する

    :param text: テキストの内容
    :return:
    """
    saved_clipboard = pyperclip.paste()
    pyperclip.copy(text)
    pyautogui.hotkey('ctrl', 'v')
    pyperclip.copy(saved_clipboard)


def fill_form(person):
    """
    フォームを入力する

    :param person:
    :return:
    """
    print(f'{person["name"]}の情報を入力中...')
    pyautogui.write('\t' * 4)

    # Name欄を入力する
    paste_and_restore_clipboard(person['name'])
    pyautogui.write('\t')

    # Greatest Fear(s)欄を入力する
    paste_and_restore_clipboard(person['fear'])
    pyautogui.write('\t')

    # Source of Wizard Powers欄を選択する
    sources = ['wand', 'amulet', 'crystal ball', 'money']
    source_index = sources.index(person['source'])
    pyautogui.write(['down'] * (source_index + 1) + ['enter', '\t'], 0.5)

    # RoboCop欄を選択する
    robocop = person['robocop']
    pyautogui.write([' '] + ['right'] * (robocop - 1) + ['\t'] * 2, 0.5)

    # Additional Comments欄を入力する
    paste_and_restore_clipboard(person['comments'])
    pyautogui.write('\t')


def main():
    """
    メインの処理

    :return: なし
    """
    pyautogui.PAUSE = 0.5
    print('ブラウザウィンドウがアクティブでありフォームが読み込まれていることを確認してください!')

    # フォームの情報を入力する
    form_data = [
        {'name': 'Alice', 'fear': 'eavesdroppers', 'source': 'wand',
         'robocop': 4, 'comments': 'Tell Bob I said hi.'},
        {'name': 'Bob', 'fear': 'bees', 'source': 'amulet',
         'robocop': 4, 'comments': 'n/a'},
        {'name': 'Carol', 'fear': 'puppets', 'source': 'crystal ball',
         'robocop': 1,
         'comments': 'Please take the puppets out of the break room.'},
        {'name': 'Alex Murphy', 'fear': 'ED-209', 'source': 'money',
         'robocop': 5,
         'comments':
             'Protect the innocent. Serve the public trust. Uphold the law.'},
    ]

    for person in form_data:
        print('5秒間一時停止中。中断するにはCtrl-Cを押してください')
        time.sleep(5)
        fill_form(person)


if __name__ == '__main__':
    main()


あたりさわりないところを録画してみた。


20.17.1 忙しそうに見せる


10秒おきにマウスカーソルを少し動かします。
離席したいけど、他人にばれたくないときに使うらしいです。

10秒に1回すこーしマウスが動きます。

import random
import time

import pyautogui


# マウスを少し動かす関数
def move_mouse_slightly():
    # マウスを少しランダムに動かす
    x_offset = random.randint(-10, 10)
    y_offset = random.randint(-10, 10)
    pyautogui.move(x_offset, y_offset, duration=0.5)


# メインのループ
while True:
    try:
        move_mouse_slightly()  # マウスを少し動かす
        time.sleep(10)  # 10秒間待機
    except KeyboardInterrupt:
        break  # Ctrl-C でループを終了


本当は何か自分用に作ろうと思ったのですが、Power Automate for Desktopで遊んだときのうまくいかなかったことを思い出してやめました。

うまくUIを認識しなかったり、できなかったので座標を指定したことを思い出したんですよね。

なにか必要なときに作ってみたいなぁ。

まとめ

ということで、退屈Python日記もこれで終わりです。
読んでくださったみなさん、長々とお付き合いいただいたみなさん、ありがとうございました🤗

post(tweet)まとめ


noteまとめ


🚩ゴール🚩

この記事が気に入ったらサポートをしてみませんか?