search
LoginSignup
8

More than 3 years have passed since last update.

posted at

日報の自動入力を試みた結果PyAutoGUIに辿り着いた

日報の自動入力がしたい!

経緯

  • 研修会社が用意しているweb上の日報
  • メモ帳に記入内容を
  • 終業前に日報のフォームに10項目以上コピペ

...コピペめんどくせー!!!
ということで研修で勉強しているPythonで日報の自動入力を試みました。

最初に立てた目標は
「PCとiPhoneの両方から事前に書いておいたテキストを日報フォームに自動入力すること」です。

いろいろ調べて試行錯誤した結果

  • 「Python 自動入力」でたくさんヒットしたライブラリのSeleniumを試みるもwebdriverがうまく動かない&Pythonistaでwebdriverとかどうするの?ということで断念
  • mechanizeというライブラリがPythonistaでも動きそうとの情報を見かけたのでmechanizeを使うことに
  • ここまでGoogleCholabratoryで挑戦していたが、mechanizeがうまくいかない。多分環境のせい。
  • ブラウザ操作できるようなライブラリが他に出てこないので諦めかける。
  • 以前購入していた退屈なことはPythonにやらせようpyautogui(ぴゃうとぐいと読んでいたけれどPyAutoGUIだった)でなんとかなりそうな事が発覚!
  • キーボードでの入力をエミュレートできるpyautogui.typewrite()を使おうとするも、日本語対応していない。。。
  • 結論!!マウスでコピペする操作を自動化する

最初に立てた目標からはかけ離れてしまいましたが実現できました!

ソースコード*絶対にコピペで実行してはいけません

マウスの操作は文字や画面を識別しておらず(本当はできます)、座標でただ動いているだけなのでこのレイアウトじゃないと絶対にうまくいかないコードです。
試しに動かしてみたい方は画面いっぱいにペイントを開いておきましょう。
nippou.png

汎用性0%のソースコードをあげるなかなかの暴挙...
初心者なので大目に見てください!同じような超初心者の助けに少しでもなってくれれば...!
pyautoguiのpip installはお忘れなく!

$ pip install pyautoui
nippou.py
import pyautogui

def nw(y, i): #nippouwriteの略
  #メモ帳を開いておいて、コピペしたい部分をドラッグする。
  pyautogui.click(976,y)
  pyautogui.dragTo(976,y+23,duration=0.5)
  #コピー
  pyautogui.hotkey('ctrl', 'c') 
  #開いておいた日報のフォームに座標を合わせてクリック&ペースト
  pyautogui.click(400,190*i); pyautogui.hotkey('ctrl', 'v')

def nippou():
  try:
    #開いておいたブラウザのスクロールバーをドラッグして所望の位置へ
    pyautogui.click(940, 250); pyautogui.dragTo(940,735, duration=1)
    #nw()を使ってコピペを繰り返す。座標は適当に指定。
    for i in range(1,6):
      Y = 23*(i-1)
      nw(76+Y,i)
    #スクロールバーをさらに下へ。
    pyautogui.click(940, 735); pyautogui.dragTo(940,920, duration=1)
    #nw()を使ってコピペを繰り返す。座標は適当に指定。
    for i in range(6,10):
      Y = 23*(i-1)
      nw(76+Y,i-5)
  #Ctrl+Cで中断できるようにしとく
  except KeyboardInterrupt:
    print('\n end')

使ったメソッド等

pyautoguiは画面の左上から右方向にx,下方向にyの座標がふられていてマイナスはありません。

sample.py
pyautogui.click(x, y)

指定した座標をクリック。

sample.py
pyautogui.dragTo(x, y, duration)

指定した座標までdurationに入力した秒数でドラッグ。
コピペの範囲選択やブラウザのスクロールに使いました。

sample.py
pyautogui.hotkey(x, y, duration)

キーボードの同時押しに使うのがhotkeyです。
コピペに使いました。

mouseNow.py

import pyautogui
print('Interrupt with Ctrl C')

try:
  while True:
    x, y = pyautogui.position()
    position_str = 'X: ' + str(x).rjust(4) + 'Y: ' + str(y).rjust(4)
    pixel_color = pyautogui.screenshot().getpixel((x, y))
    position_str += ' RGB: (' + str(pixel_color[0]).rjust(3)
    position_str += ' ,: (' + str(pixel_color[1]).rjust(3)
    position_str += ' ,: (' + str(pixel_color[2]).rjust(3) + ')'
    print(position_str, end='')
    print('\b' * len(position_str), end='', flush=True)
except KeyboardInterrupt:
  print('\n end')

上記の退屈なことはPythonにやらせようにあったソースコードを丸々使いました。
現在のマウスがいる座標を表示し続けてくれるプログラムです。
これで各座標を調べていきました。

作っていて困ったこと

  • pyautogui.typewirte()が日本語非対応
  • pyautogui.scroll()で画面のスクロールではなくブラウザのズームアップになってしまう
  • pythonでかっこよくブラウザ操作!と思っていたので座標を調べている時間がむなしい

まとめ

特に座標を調べているときはなんて無駄な時間なんだとか思いました。
けど、実業務への汎用性は意外と高いのかも?
画面上のレイアウトを固定して座標調べておけば大体の単純作業を何とかできます。

参考

https://pyautogui.readthedocs.io/en/latest/
https://qiita.com/hirohiro77/items/78e26a59c2e45a0fe4e3
ありがとうございました!

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
What you can do with signing up
8