masuTomo’s blog

競技プログラミングの勉強メモです.主にPythonを使用します.数学の記事も書くかもしれません.

ChatGPTではじめてのPyAutoGUI(Google Map データ移行)

やりたいことと前提条件

  • 以前所属していた組織のGoogle アカウントをずっと使っていたが,それが停止されるということで,新しいアカウントにデータ移行したい.
  • 移行するデータはGoogle Mapのお気に入りリスト(スターではなく,ハート)
  • 移行するデータは約1000件(手動では無理)

使った技術

失敗したこと

  • Google MapのAPIを使って,データをエクスポート,インポート

PyAutoGUIについて

Google Map のAPI を使ったデータのインポートエクスポートは,どうやらできないことが判明したので(後述),お気に入りリストに登録されている店舗を新しいアカウントの Google Map上でお気に入りリストにコツコツ登録するしかないという結論に到達した. そのため,そのコツコツ登録する部分をPyAutoGUI で自動化することにしました.

環境構築

  • MacBook Air (M1)
  • Python 3.11.4 (Anaconda) を使用しました.

    PyAutoGUIのインストール(ChatGPT,BingAI頼み)

    せっかくなので流行りのChatGPTとBingAIに聞きながらやってみることにしました.

    pyautoguiのインストール1
    pipが使えませんといったら,手動インストールの手順を教えてくれたので,condaは使えることをお伝えしました.
    condaの使いかた
    condaを使ってインストールして,サンプルプログラムを実行するとエラーが出たので,エラーメッセージをそのままChatGPTに投げました.(本当はもっと長いです.一部だけ掲載しています)
    インストール時のエラー
    すると,親切にエラーの内容と解決法を教えてくれました.
    エラーの解決法
    つづき
    エラーの解決法の続き
    すると,(案の定)エラーは解決しなかったので,次の方法として教えてもらったWebページを見に行きましたが,404NotFoundでした. ChatGPTはここで手詰まりです.

そこで,GPT4が使えると噂のBingAIにも同じエラーメッセージを貼り付けて,解決法を聞いてみることにしました.

BingAIの回答
updateしてもダメなので,新しいconda環境を作成して無事エラーが消えてパッケージのインストールが完了しました.

コーディング

無事パッケージのインストールが終わったので,目的のプログラムを作成していきますが,PyAutoGUIパッケージの使い方がさっぱりわからないので,これも教えてもらうことにしました.

PyAutoGUIの使いかた

import pyautogui

# 画面サイズを取得
screenWidth, screenHeight = pyautogui.size()

# マウスカーソルの現在位置を取得
currentMouseX, currentMouseY = pyautogui.position()

# マウスカーソルをx座標100、y座標150に移動
pyautogui.moveTo(100, 150)

# 現在位置でクリック
pyautogui.click()

# x座標200、y座標220でクリック
pyautogui.click(200, 220)

# マウスカーソルを10ピクセル下に移動
pyautogui.move(None, 10)

# ダブルクリック
pyautogui.doubleClick()

# マウスカーソルをx座標500、y座標500に2秒かけて移動
pyautogui.moveTo(500, 500, duration=2, tween=pyautogui.easeInOutQuad)

# 'Hello world!'と入力(各キーの間隔は0.25秒)
pyautogui.write('Hello world!', interval=0.25)

# Escキーを押す
pyautogui.press('esc')

# Shiftキーを押し続ける
pyautogui.keyDown('shift')

# 左キーを6回押す
pyautogui.write(['left', 'left', 'left', 'left', 'left', 'left'])

# Shiftキーを離す
pyautogui.keyUp('shift')

# Ctrl + c のホットキーを押す
pyautogui.hotkey('ctrl', 'c')

これがわかったら大体やりたいことはできそうなので,次のようなコードを書いて無事完了です.

import pyautogui
import pyperclip
import csv


#お気に入りの店舗の情報が保存されているcsvファイル読み込み
stores = []
with open('favorites_stores.csv', 'r', encoding='utf-8') as f:
    for row in csv.reader(f):
        stores.append(row[2])

#spotlight の座標 1231 12
#spotlightを起動
pyautogui.click(1231, 12)
pyautogui.click()
pyautogui.PAUSE = 1 #1秒待ちを入れる
pyautogui.click()
pyautogui.sleep(0.2)

#spotlightからgoogle chromeを起動
pyautogui.write('google chrome', interval=0.05)
pyautogui.press('return')

#アドレスバーに移動
#画面の真ん中あたりをクリックして,chromeをアクティブにする
pyautogui.moveTo(622,413)
pyautogui.click(622,413)

for s in stores:

    #アドレスバーの内容を削除
    pyautogui.hotkey("command", "l")
    pyautogui.press('backspace')

    #リストのurlをクリップボードに格納
    pyperclip.copy(s)
    pyautogui.hotkey("command","v")
    pyautogui.press('return')
    pyautogui.PAUSE = 1

    #保存アイコンをクリック
    pyautogui.moveTo(217,551)
    pyautogui.click(217,551)
    #お気に入りリストに追加
    pyautogui.moveTo(220,590)
    pyautogui.click(220,590)
    #読み込み待ち
    pyautogui.PAUSE = 3 #秒待つ

最後に注意点をいくつか記載します.

  • 実際の画面遷移を伴うので,画面読み込み等のために適宜PAUSEを入れています.
  • google chrome上のクリックしたい場所は事前にpuautogui.positionで取得しておきます.
  • ウインドウが表示される場所によってクリックしたい座標が変わるので,クリックしたい座標を取得したらアプリケーションを閉じたりせずにプログラムを実行してしまいましょう.
  • 1000件くらいで,おそらく3-4時間程度かかりました(寝るまえに実行して,朝起きたら終わってました)