stmtkブログ

Python中心の技術ブログです。

【Python】pyautoguiでフォームを自動入力する

機能

pyautoguiでフォームを自動入力するPythonプログラムです。

Excelの内容をフォームに転記して送信します。

  • フォーム

テストフォーム

selenium版もあります。

stmtk358.hatenablog.com

サンプル動画

youtu.be

プログラム

#! python3
# 機能
#  pyautoguiでフォームを自動入力する
# 使い方
#  1.Pythonを実行する
# 実行コマンド
#  python form_filler.py

import os
import time
import openpyxl
import pyperclip
import pyautogui
import webbrowser

# フォームURL
form_url = "https://docs.google.com/forms/d/e/1FAIpQLSdme2vmct8SLoy2HhT0uz29LBlwEnAdEh0nKg1ABI13_q26QA/viewform"
# 先頭項目の座標
first_field_xy = (500, 510)
# 「別の回答を送信」リンクの座標
another_link_xy = (540, 350)
# GUI操作の間隔
pyautogui.PAUSE = 0.5

# Excel読み込み
path = os.path.join(os.path.dirname(__file__), "入力一覧.xlsx")
wb = openpyxl.load_workbook(path)
sheet = wb.worksheets[0]

# フォームを開く
webbrowser.open(form_url)

for row in range(2, sheet.max_row + 1):
    print("5秒間一時停止中。中断するにはCtrl+Cを押してください。")
    time.sleep(5)

    # 行読み込み
    no = sheet.cell(row=row, column=1).value
    text = sheet.cell(row=row, column=2).value
    long_text = sheet.cell(row=row, column=3).value
    radio_button = sheet.cell(row=row, column=4).value
    pull_down = sheet.cell(row=row, column=5).value
    check_box = sheet.cell(row=row, column=6).value

    print("No.{}の情報を入力中...".format(no))

    # 記述式
    pyautogui.click(first_field_xy[0], first_field_xy[1])
    pyperclip.copy(text)
    pyautogui.hotkey("ctrl", "v")
    pyautogui.typewrite("\t")

    # 記述式(長文)
    pyperclip.copy(long_text)
    pyautogui.hotkey("ctrl", "v")
    pyautogui.typewrite("\t")

    # ラジオボタン
    if radio_button == "ラジオボタン1":
        pyautogui.typewrite([" "])
    elif radio_button == "ラジオボタン2":
        pyautogui.typewrite(["down"])
    elif radio_button == "ラジオボタン3":
        pyautogui.typewrite(["down", "down"])
    pyautogui.typewrite(["\t"])

    # プルダウン
    if pull_down == "プルダウン1":
        pyautogui.typewrite(["down"])
    elif pull_down == "プルダウン2":
        pyautogui.typewrite(["down", "down"], 0.1)
    elif pull_down == "プルダウン3":
        pyautogui.typewrite(["down", "down", "down"], 0.1)
    pyautogui.typewrite(["enter"])
    pyautogui.typewrite(["\t"])

    # チェックボックス
    check_box = check_box.split("\n")
    if "チェックボックス1" in check_box:
        pyautogui.typewrite([" "])
    pyautogui.typewrite(["\t"])
    if "チェックボックス2" in check_box:
        pyautogui.typewrite([" "])
    pyautogui.typewrite(["\t"])
    if "チェックボックス3" in check_box:
        pyautogui.typewrite([" "])
    pyautogui.typewrite(["\t"])

    # 送信
    pyautogui.press("enter")
    print("No.{}の情報を送信しました。".format(no))
    time.sleep(3)

    # 「別の回答を送信」リンク押下
    pyautogui.click(another_link_xy[0], another_link_xy[1])

座標について

先頭項目と「別の回答を送信」リンクの座標はPC環境ごとに異なるので、変更する必要があります。

以下のプログラムで座標を取得することができます。

stmtk358.hatenablog.com

日本語入力について

英数字などの場合はtypewrite()で入力することできますが、引数を日本語にした場合は入力されません。

    pyautogui.typewrite("english")

この問題を回避するために、コピー&ペーストで入力しています。

    pyperclip.copy("日本語")
    pyautogui.hotkey("ctrl", "v")

sagantaf.hatenablog.com

使い方

  1. Pythonを実行する

実行中にマウスを動かしたり、ウィンドウを切り替えてしまうと正常に動作しなくなりますので、注意して下さい。

実行コマンド

python form_filler.py

openpyxlとpyperclipとpyautoguiをインストールしていない場合は以下のコマンドでインストールして下さい。

pip install openpyxl
pip install pyperclip
pip install pyautogui

参考文献

www.oreilly.co.jp

sagantaf.hatenablog.com