'21/08/15更新:RPAで操作対象アプリを最前面へアクティブ化する関数を追加
本記事では、Windows環境下で、Pythonとそのライブラリ「pyautogui」を用いてRPA(Robotic Process Automation)する例として、メモ帳とエクセルを操作する雛形コードを載せました。
ソフトウェアの起動には、subprocess.Popen()を使用します。ウィンドウのアクティブ化にはwin32guiを使います。作成したファイルの保存と終了はショートカットキーによるメニューバー操作で自動化を実現します。
下図はその実施例です。メモ帳に一万個の💩を生成します。(ちなみに、この中にひとつだけ山があります。ウォーリーを探せ的なうんこ中の山を探せ!)

下図はエクセルで実行した例です。階段状に斜めに💩を大量生成しています。

💩生成過程は、下記動画をご覧ください。
www.youtube.com
■本プログラム
Linux環境下での雛形コードは次のリンク先を参照下さい→Python Linux環境下でのRPA「pyautogui」 - PythonとVBAで世の中を便利にする
import os
import pyautogui as ag
import subprocess as sp
import win32gui
import win32con
import time
import random
import datetime
now = datetime.datetime.now()
now = now.strftime("%y%m%d_%H%M%S")
def active_window_func(hwnd, title):
name = win32gui.GetWindowText(hwnd)
print(name)
if name.find(title) >= 0:
if win32gui.IsIconic(hwnd):
win32gui.ShowWindow(hwnd,1)
myapp = win32gui.FindWindow(None, name)
win32gui.SetWindowPos(myapp, win32con.HWND_TOPMOST, 0, 0, 0, 0, win32con.SWP_NOMOVE | win32con.SWP_NOSIZE)
left, top, right, bottom = win32gui.GetWindowRect(myapp)
time.sleep(1)
center = int((left + right)/2)
ag.moveTo(center, top + 10)
ag.click()
return
def memo_func():
file_name = now + '.txt'
save_file_path = dir_path + r'/' + file_name
save_file_path = save_file_path.replace('/', os.sep)
sp.Popen('notepad.exe')
time.sleep(1)
win32gui.EnumWindows(active_window_func, 'メモ帳')
ag.typewrite('Hello')
ag.press('space')
ag.press('kanji')
ag.typewrite('memotyou !!')
ag.press('enter')
time.sleep(2)
ag.hotkey('ctrl', 'a')
ag.press('del')
ag.typewrite('unnko')
for _ in range(1):
ag.press('space')
ag.press('enter')
ag.hotkey('shift', 'left')
ag.hotkey('ctrl', 'c')
ag.press('right')
ag.hotkey('ctrl', 'v')
ag.keyDown('shift')
ag.press('left')
ag.press('left')
ag.keyUp('shift')
ag.hotkey('ctrl', 'c')
ag.press('right')
for _ in range(4):
ag.hotkey( "ctrl", "v")
ag.keyDown('shift')
ag.press('home')
ag.keyUp('shift')
ag.hotkey('ctrl', 'c')
ag.press('right')
ag.hotkey('ctrl', 'v')
ag.keyDown('shift')
ag.press('home')
ag.keyUp('shift')
ag.hotkey('ctrl', 'c')
ag.press('right')
for _ in range(4):
ag.press('enter')
ag.hotkey('ctrl', 'v')
ag.hotkey( "ctrl", "a")
ag.hotkey('ctrl', 'c')
ag.press('right')
for _ in range(9):
ag.press('enter')
ag.hotkey('ctrl', 'v')
ag.hotkey( "ctrl", "a")
ag.hotkey('ctrl', 'c')
ag.press('right')
for _ in range(9):
ag.press('enter')
ag.hotkey('ctrl', 'v')
row_up = random.randint(0, 500)
col_left = random.randint(0, 20)
print(r'(up, left) = ', row_up, col_left)
for _ in range(row_up):
ag.press('up')
for _ in range(col_left):
ag.press('left')
ag.typewrite('yama')
for _ in range(1):
ag.press('space')
ag.press('enter')
ag.press('del')
ag.press('kanji')
ag.hotkey('alt', 'f')
ag.hotkey('ctrl', 'shift', 's')
ag.typewrite(save_file_path)
ag.press('enter')
time.sleep(1)
ag.hotkey('alt', 'f')
ag.press('x')
print(save_file_path)
def excel_func():
file_name = now + '.xlsx'
save_file_path = dir_path + r'/' + file_name
save_file_path = save_file_path.replace('/', os.sep)
sp.Popen(r'C:\Program Files\Microsoft Office 15\root\office15\EXCEL.EXE')
time.sleep(6)
ag.press('enter')
win32gui.EnumWindows(active_window_func, 'Excel')
ag.typewrite('Hello Excel !!')
ag.press('enter')
str_list = ['enter', 'down', 'tab']
ag.press(str_list)
ag.press('kanji')
ag.typewrite('unnko')
for _ in range(1):
ag.press('space')
ag.press('enter')
ag.press('down')
ag.press('up')
ag.hotkey('ctrl', 'c')
for i in range(30):
ag.press('right')
ag.press('down')
ag.hotkey('ctrl', 'v')
ag.press('kanji')
ag.hotkey('fn','f12')
ag.typewrite(save_file_path)
ag.press('enter')
time.sleep(1)
ag.hotkey('alt', 'f')
ag.hotkey('alt','f4')
print(save_file_path)
if __name__ == '__main__':
dir_path = os.getcwd()
memo_func()
excel_func()
print('finished')
(重要)USキーボード以外でのpyautoguiの不具合対策
ファイルを保存するには、絶対パスを入力して保存するのが確実で安心です。
ところが、USキーボード以外では次のような不具合があります。
Python 3.x - pyautoguiを用いて「:」の入力をしたいです。|teratail
万が一のリンク切れに備えて、要点を以下に記します。
D:\program\python\14_file と絶対パスを入力したいが
D*\program\python\14_file と、「:」が「*」となる問題です。
これを解決するには、例えば、次のような場所にある「_pyautogui_win.py」を開いて、関数_keyDownの中にあるneedsSift以下に、次の3行を追加します。
C:\Users\[ユーザー名]\Anaconda3\pkgs\pyautogui-0.9.48-py36h9f0ad1d_1\Lib\site-packages\pyautogui\_pyautogui_win.py
def _keyDown(key):
needsShift = pyautogui.isShiftCharacter(key)
if key == '@': needsShift = False
if key == '^': needsShift = False
if key == ':': needsShift = False
"""
# OLD CODE: The new code relies on having all keys be loaded in keyboardMapping from the start.
if key in keyboardMapping.keys():
# 略
以上
<広告>
リンク