ずっと後回しにしてきた問題が、今日ついに爆発しました。
ヤフーメールの容量いっぱい問題です。メール件数は20万件、容量は上限の10GBいっぱいで、「新規のメールを受信できません」というアラートが出ていました。(スクショはちょっと削除してから撮ったものなので、18万4千件になってます)
いちおうヤフーメールには、一括削除という機能があるのですが、他の方のブログ等を見ると、どうもメール件数が一定以上だと一括削除ができないようです。(5万件くらいだと可能という情報がありました。)
仕方なく手作業でやり始めましたが、1回の操作で削除できるメールは200件まで。1回の操作に10秒かかるとすると、20万件削除するのにかかる時間は、10秒×1,000回で10,000秒=約3時間。
『・・・・これはやってられん・・・』ということで、何らかの方法で、マウスとキーボード操作を自動化してパソコンに頑張って削除してもらうことを思いつきました。(RPAというんでしょうかね?)
ググってみると、Pythonを使ってできるような記事を見つけたので、さっそく試してみようと思います。
以下に、やり方を列挙しますが、なにぶん素人なので、『よく分からないが』という接頭語や『たぶん』という言い訳が頻発すると思います。その点ご容赦ください。
使ったツール
使ったツールは、主にPythonとVS code、ほんの少しだけコマンドプロンプトも使いました。
パソコンはWindows10です。
書いたコード
とりあえず、書いたコードを貼っておきます。実際、苦労したのは、コードを書き始める前の環境構築のところでしたが、そちらについては後述します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
import pyautogui import time pyautogui.moveTo(1300,15) pyautogui.click() i = 0 while i<2: pyautogui.moveTo(1460,320) pyautogui.click() time.sleep(1) pyautogui.keyDown('ctrl') pyautogui.press('a') pyautogui.keyUp('ctrl') pyautogui.moveTo(580,320) pyautogui.click() pyautogui.press('left') time.sleep(0.5) pyautogui.press('enter') time.sleep(15) i += 1 |
以下に、それぞれの意味を詳しく記載します。
import pyautogui
こちらは、pyautoguiをインポートするコマンドです。インポートというのが何かはよく分かりませんが、pyautoguiをインポートすることで、このあと出てくる、moveTo、click、keyDown、press、keyUpというコマンドを使えるようになります。
私は、pyautoguiをインポートする前段階で、エラーが出てだいぶ手こずりました。その辺りの話しは後ろの方に書いておきます。
import time
こちらは、timeをインポートするコマンドです。timeをインポートすると、このあと出てくる、sleepを使えるようになります。
以上が、自動化作業の準備段階です。ここからが、マウスやキーボード操作を自動化する具体的なコードの説明です。
pyautogui.moveTo(1300,15)
こちらは、マウスのカーソル指定の座標まで移動させるコマンドです。この例でいうとモニターの横方向を1300という数字で指定し、縦方向を15という数字で指定しています。
ちなみに、どの数字がどの位置なのかというのはよく分かりません。私は、少しずつ数字を変えて試しながら、最適な数字を決めました。
pyautogui.click()
こちらは、マウスクリックをするためのコマンドです。
以上、pyautogui.Moveto(1300,15)とpyautogui.click()の2つのコマンドで私がやりたかったのは、『ブラウザで立ち上げている複数のタブの中から、下のスクショ画面の、ヤフーメールのタブまでカーソルを移動させてクリックする』というものです。
i =0
while i<2:
i += 1
この文は、コマンドをループさせるための記述です。これを書くことで、while i<2とi+=1の間に書かれている12行分のコマンドを繰り返し実行します。
なので、この3行は、ヤフーメールを削除することに対する具体的な操作には関係ないです。
繰り返す回数を増やしたい時は、while i<2の「2」の部分を100とか200とかにすればOKです。
意味としては、『i=0からはじめて、iが2より小さいときは、次の命令を繰り返す』という感じになります。
pyautogui.moveTo(1460,320)
pyautogui.click()
これは、先ほど書いたのと基本的には、同じです。マウスのカーソルをある位置まで動かして、クリックさせます。
この部分は、下のスクショの赤丸部分をクリックして、メールボックスの1番古いものを指定するために、書きました。
time.sleep(1)
これは、『1秒待つ』というコマンドです。カッコの中の数字を変えると、待つ時間を変えられます。
なぜ、1秒待つようにしたかというと・・・・
基本的に、プログラムの各動作は、一瞬で実行されます。それに対して、ブラウザをクリックした後の、読み込み時間はけっこう長いです。なので、1動作ごとに待ち時間を入れてやらないと、ブラウザの動作が追い付かず、意図した動作ができなくなります。
pyautogui.keyDown('ctrl')
pyautogui.press('a')
pyautogui.keyUp('ctrl')
これは、マウス操作でなく、キーボードの操作のためのコマンドです。
pyautogui.keyDown()はキーボードを押しっぱなしにするためのコマンドです。pyautogui.keyUp()が命令されるまで、押しっぱなしになります。
ここでやりたかったのは、Ctrl + Aで『すべて選択』することです。
このコマンドで、メールボックスに表示されているメールが全選択されます。
pyautogui.moveTo(580,320)
pyautogui.click()
ふたたび、moveToとclickです。もう説明不要と思います。
ここでやりたかったのは、スクショの赤丸で囲った、削除ボタンのクリックです。
pyautogui.press('left')
time.sleep(0.5)
pyautogui.press('enter')
time.sleep(15)
最後の4行も、すでに出てきたものなので、コマンドの説明は不要ですね。
やりたかったのは、メール削除の最終確認処理です。
確認画面では、最初、キャンセルボタンが選択されているので、キーボードの「←」を押して、OKボタンが選択されるようにします。その後、enterを入力することで、削除画面のOKボタンがクリックされることになり、選択したメールが削除されます。
これで、pythonコードの説明は終わりです。
他に、私がつまずいたところや、初期の環境構築についても書きたかったんですが、この記事を書きはじめてしまったため、肝心のメール削除作業が進んでません。まだ13万件残ってます。
自動化って手間を無くすことはできるんですけど、作業時間自体は人力(じんりき)でやるのと変わらないか、むしろ長くかかるんですよね。(待ち時間を長めに設定する必要があったりするので)
ほかに書いておきたかった、「pyautoguiのinstallは、VS codeじゃなくて、コマンドプロンプトでやる」とか、「while文でループしたい中身はインデントを入れないとダメ」とかは後日追記しておきたいと思います。
以下、後日追記分です。
環境構築について
Pythonを使う準備
Pythonを入手する方法は、いくつかあるようですが、私は1番簡単で、色々と都合が良いらしい、以下の方法を使いました。
Microsoft Storeでpythonを検索して、「入手」ボタンをクリックするだけです。3.7、3.8、3.9とか出てきますが、私は3.9を入手しました。
Microsoft Storeにたどり着けない場合は、パソコン画面左下の検索窓にmicrosoft storeと入力すると出てくるはずです。
pyautoguiのインストール
私が今回1番つまづいたのはココでした。
ネットで調べて、今回最初にやらないといけないのが、pyautoguiのインストールということが分かりました。なので、Pythonを起動して、ネット記事に書いてあるとおり、pip install pyautoguiというコマンドを入力したんですが、SyntaxError: invalid syntaxというのが表示され、いっこうにインストールされません。
↓こんな感じのエラーが出ます。
こちらの対処方法は、Pythonの画面からでなく、コマンドプロンプトで、pip install pyautoguiを入力すれば良かっただけです。
素人はこういうところで、つまづくんですよね・・・
コードの中身でつまづいたところ
最後に、コードの中身で1点だけつまづいたところがあるので、書いておきます。
whileの使い方
最初、私はwhile文を以下のように書いていました。すると、「IndentationError」というのが表示されて、プログラムが動いてくれませんでした。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
import pyautogui import time pyautogui.moveTo(1300,15) pyautogui.click() i = 0 while i<2: pyautogui.moveTo(1460,320) pyautogui.click() time.sleep(1) pyautogui.keyDown('ctrl') pyautogui.press('a') pyautogui.keyUp('ctrl') pyautogui.moveTo(580,320) pyautogui.click() pyautogui.press('left') time.sleep(0.5) pyautogui.press('enter') time.sleep(15) i += 1 |
正しいものと比べてなにが違うかというと、
赤い四角で囲った、空白部分です。Pythonではこの空白部分で、whileでループさせたい中身を決めているそうです。
コードを上から順番に書いていれば、whileの行でEnterを押すと次の文は勝手に空白が入れられるんですが、私の場合、whileを後から追加したので、手作業で空白も追加する必要がありました。