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