スマホがちょっとだけ自動化した話
しろくまです。ありがとうございます。
今日は、日々スマホを触ってて、
「え、これめんどくさ」と思うことがあったので、自動でやってくれるようにしてみた話をしようと思います。
きっかけ
きっかけは大きく分けて2つ。
①冒頭で述べた通り、怠惰心
②スマホでも自動で動くものって作れるのかなという好奇心
です。
ここからはちょっと順を追って話しますので、
次の章へ飛んでいただいても大丈夫です。
ところで皆さんも日々、スマホ、触りますよね。
現代社会では最早、ほぼ必要不可欠だと思います。
でもお仕事柄、
大学生のころまでと比べてPCに触れる機会が圧倒的に増えたことを機に、
私個人の感情としてちょっと変わってきたところがありました。
それはこちら。
・スマホってPCより不便じゃね
深い理由は特にないのですが、
普段「Ctrl + c」、「Ctrl + v」、「Ctrl + x」、「Ctrl + z」、「Ctrl + y」という便利ショートカットキーに頼りまくり、
マウスの戻る、進むボタンに頼りまくり、
そういうのが一発でできないの不便だなとか。
些細な理由です。
きっと上に書いたようなことも、
うまいことやればそんなんできひんはずがないんでしょうけれど、
要はあんまり使いこなせてないってことです。
以前、PCで自動化してみた話を書いたことがありましたが、
その時、スマホではできないんだろうか?と何となく調べてみてはいました。
私はすべてにおいてビギナーですから、
「ほえ~BatってWindowsでしか動かせないんだ~」とか、
「シェルスクリプトとかいうのならいけるかもしれんけどわからんのか~」とか、その程度です。
で、スマホでやるのはあきらめていました。
無理なんかな~と。
ですがどうにも我慢ならなかったんです。
大量に届くメールの数々が。
特にキャリアメールについてなんですけれど、
大学生の時にほとんどGmailに移行したのでもうほとんど使っていないのです。
毎日毎日、更新して全部削除フォルダにぶち込んで、ごみ箱から削除してを繰り返す日々。
ふと、気が付きました。
これやってること毎日大体一緒なんだから、自動化できるのでは?と。
長くなってしまいました、以上が経緯です。
よしやってみましょう。
そんなんできひんはずがない。
方針検討
まずはどうやったらできるのか調べてみます。
ちなみにAndroidユーザーです。(GooglePixcel 7a)
ネットで調べてみた結果。
★アプリを入れればできる!
・Tasker
・MacroDroid
・IFTTT
・Automate
・AutomateIt
<参考>
https://www.sms-datatech.co.jp/column/aut_android/
Microsoft Copilotさんに聞いてみた結果。
アプリか。今時なんでもあるなやっぱり。
また、既に同じようなことやってる人いないかな~っていうのも調べてみました。
どうやら「Tasker」を使っている人が一番多そうです。
よしそれでいk
有料です。「Tasker」。
結論!
「MacroDroid」でいきます。
理由は~、、、
・なんかUI簡単そう
・それなりいろいろできそう
・同じようなことやってる人がいそう
だから!
決してお金ケチったとかまさかそんn
実際にやってみる(設計風)
アプリをインストールしてみました。
アイコンがおっきくてわかりやすいですね。
(最初、保存したマクロがどこいったのかわからなくてとまどいましたが)
追加を押すとこちらのような画面になりました。
以下3つを定義するようです。
・トリガー
・アクション
・条件
こちらのサイト様を参考にさせていただきました。
自動化したい流れ(=アクション)としては以下のようにしようと思いました。
1.更新ボタンを押して、フォルダを最新化する
2.受信BOXを選択
3.その他ボタン>フォルダ内メール削除
4.メッセージRを選択
5.その他ボタン>フォルダ内メール削除
6.メッセージSを選択
7.その他ボタン>フォルダ内メール削除
8.ごみ箱を選択
9.その他ボタン>フォルダ内メール削除
あとはトリガーと条件ですが、条件は必須指定ではないようです。
ぽちぽち触って試しているうちに、
「画面がON」じゃないとうまくいかなさそうということがわかりましたので条件に追加しておくことにしました。
最後にトリガーについて。
こちらもいろいろ迷ったのですが、「通知を削除」に決めました。
ここはまあ正直何でもよいと思います。
以下、仕様をまとめてみます。
[動作環境]
・GooglePixcel 7a
・MacroDroid
・某キャリアメールアプリ
[処理概要]
・メール受信の通知を受け取り、各種フォルダのメールを削除して、
ユーザーに通知する
[条件]
・スマホの画面がONであること
[INPUT(トリガー)]
・メール受信の通知をユーザーが削除
[処理の流れ]
1.メールアプリを起動
2.更新ボタンを押して、フォルダを最新化する
3.フォルダを選択
4.フォルダ内のメールを削除
※手順3と4をフォルダの分だけ繰り返す
[OUTPUT(結果)]
・処理が完了したらユーザーに通知する
実際にやってみる(実装風1日目)
まずは実現方法の調査です。
画面を触る操作は絶対必要だと思いますし、その辺は大体みんな必要だと思うので、
誰かやってるやろ精神で調べました。
参考にさせていただきました、ありがとうございます。
画面タッチくらいしかほとんどやることはないので、ベースはこれだけで作れそうです。
今度は場所を指定してタッチしたいので、
画面の座標を取得したい!
(「MacroDroid」内の機能は使えなくなってた)
1ミリに入りました、ありがとうございます。
開発者向けオプション、初めて使用しました。
こういう時に使われるものだったんですね。
(ここまでおよそ1時間)
ちなみにもう、この2つの組み合わせだけで、
正常パターンは動かせるようになりました。
(ぱちぱち)
やっていることは単純で、
ボタンの座標を取得して、X軸Y軸指定してタッチ操作をさせる、
それを繰り返しているだけです。
これで完成!でもいいんですが、
普段QAをやっている身からすると、異常系もやっぱり考慮したいですよね。
例えば、フォルダ選択時にフォルダ内にメールが存在しなかった場合、
削除ボタンが表示されません。
(※のちほどフラグ〜、、、)
削除ボタンをクリックすることによって、フォルダの選択状態も併せて解除される挙動になっているため、
削除ボタンがクリックできなかった場合、フォルダの選択状態が解除されずに次の処理に行ってしまいます。
そうなると処理結果が変わって来る。。
なんとか、ボタンクリック時にクリック先の情報を取得して、
条件分岐とかできないかな、、
と考え始めるとここが思ったより沼で。
(ここまで+2時間)
参考にさせていただいたものの思うようにはまらず。
初日はここで終わることにしました。
(Twitterで報告)
実際にやってみる(実装風2日目)
1週間後の週末。
条件分岐いい感じのなかったな~と思いながら平日を過ごし、
土曜日の朝やたらと早起きしたので、別件のお勉強していました。
お勉強中にわからないことをMicrosoft Copilotさんに聞きながらやっていたのですが、
ふと気が付きました。
実装入ってからCopilotさんに聞いて無くね?
そこで、ボタンをクリックすることができたかどうかをチェックする方法があるか聞いてみることにしました。
くださいね!←かわいい
別にこの中に明確な回答があったわけではないのですが、
特定のボタンをクリックというところが引っ掛かりまして。
座標指定じゃなくてボタンの名前とかでクリックするようにできたよな~と。
参考にさせていただきまして。ありがとうございます。
テキスト一致でボタンをクリックさせることができるみたいです。
結果的に、以下のように修正しました。
・削除ボタンがクリックできたかどうかをチェックする
・削除ボタンがクリックできた場合、処理続行
・削除ボタンがクリックできていない場合、フォルダの選択状態を元に戻す処理を実行してから、元の処理に戻る
あと、ここの時点で当初の仕様を変更し、処理を2つに分割することにしました。
(1)メールをごみ箱に移動する処理
(2)ごみ箱のメールを削除する処理
2つに分けることで、
ごみ箱に移動された後に任意で、
本当に削除して問題ないメールか確認できるようになるのでより安全かなということで。
さあー大体できたからテストだー。
実際にやってみる(テスト風)
改めて仕様についてまとめます。
[動作環境]
・GooglePixcel 7a
・MacroDroid
・某キャリアメールアプリ
------------------------------------------------------------------
[処理概要1]
・メール受信の通知を受け取り、各種フォルダのメールをごみ箱に移動して、
ユーザーに通知する
[条件]
・スマホの画面がONであること
[INPUT(トリガー)]
・メール受信の通知をユーザーが削除
[処理の流れ]
1.メールアプリを起動
2.更新ボタンを押して、フォルダを最新化する
3.受信フォルダを選択
4.フォルダ内のメールを削除
5.フォルダ内にメールが存在しなかった場合、フォルダの選択状態をリセット
6.メッセージRフォルダを選択
7.フォルダ内のメールを削除
8.フォルダ内にメールが存在しなかった場合、フォルダの選択状態をリセット
9.メッセージSフォルダを選択
10.フォルダ内のメールを削除
11.フォルダ内にメールが存在しなかった場合、フォルダの選択状態をリセット
[OUTPUT(結果)]
・処理が完了したらユーザーに通知する
------------------------------------------------------------------
[処理概要2]
・処理概要1の完了通知を受け取り、ごみ箱のメールを削除して、
ユーザーに通知する
[条件]
・スマホ画面がONであること
・処理概要1が完了していること
[INPUT(トリガー)]
・処理概要1の通知をユーザーが削除
[処理の流れ]
1.メールアプリを起動(ユーザーがアプリを終了した場合を考慮)
2.ごみ箱を選択
3.フォルダ内のメールを削除
4.フォルダ内にメールが存在しなかった場合、フォルダの選択状態をリセット
[OUTPUT(結果)]
・処理が完了したらユーザーに通知する
まず処理概要1から。
ちゃんとケースは組んでいませんが、結果はこちらでした。
えーちょっと一旦待ってくd債あー、、
なんか名前だと取得できないボタンがあるみたいでした。
一部は座標に差し替えます。
2回目
ううむ、空の場合が全部だめだった。
んだけど、原因は軽微で、待機の設定漏れでした。
条件分岐のところ、待ち時間の設定をしていなかったので、
結果が取得される前に判定を始めちゃってたみたい。
自動化する場合って本当にちゃんと待機する時間をあげられてるかで、
個人的には結構苦労してます。。
3回目
受信BOXが空の場合がダメでした。
これは調査不足が原因だったです。
(覚えてるかな〜※実装1日目ののちほどフラグ〜、、、)
他は、空だった場合に削除ボタンが表示されないのですが、
受信BOXだけは削除ボタンは表示されないけれど、
別のコンテキストメニューが表示されており、
そのメニューを閉じるという手順が漏れてました。
4回目
ようやく全部OKになりました。
ちなみに処理概要2の方は、
処理概要1を参照して作っていたのと、テストで見つかった不備を反映させながら進めていたので一発OKでした。
よーっしゃー完成だー
と言いたいところでしたが、
どうにも時間がかかりすぎな気がしたので、
全体的に待機時間を見直しました。
何回かモンキー的にポチポチテストしてようやく完成です。
成果物お披露目&初回稼働
実際のマクロがこちらです。
ちなみに初稼働は、、、
うまくいった。
メッセージRだけだったけれど!
でも2回目はなんかうまくいかんかった。
しばらくは、微調整しながらの運用になりそうです。
でも概ね思っていた通りになったので何より!
やってみて思ったことは、まず結構楽しかったです。
アプリ開発というと大げさに言いすぎているけれど、やりたいことから落とし込んでいって形にしていくところとか、やってみてよかったなって思いました。
あとはとってもちっちゃい単位でやってたのですぐ目に見える成果がでる、これもよかったです。
自分のメールだけだから誰にも迷惑かからないし、ポンポン試せました。
自分が実現したいことから考えていくといい視点になりそうです。
あとは、待機時間の設定、本当に大事。
また今後もいろいろやってみたいと思います。
以上、ありがとうございました~。