登下校お知らせサービスをLINEに通知
子供が登下校するとメールが来るサービスがあり我が家も使用しています。うちはGmailに通知するように設定しています(妻へはGmailの転送機能を利用しています)が、2人とも携帯電話がiPhoneを使用しているため、メールの受信が確認しずらいのでどうにかならないかと。そこでヒントになったのがYouTubeの動画でした。
参考にした動画
2つの動画を視聴することでやりたいことができました。まずは紹介を。
キノコード / プログラミング学習チャンネル
まずはキノコードさんのチャンネルです。
当初はPythonの初心者向けの動画や、Pandasの動画をよく見ていました。こちらのチャンネルのいいところは、初心者向けの動画が多く、解説も丁寧、そして聞きやすいです。
いろいろ見てみると、『【仕事の自動化】PythonでLINEを操作。メッセージや画像を自分へ送信しよう!【初心者の方もわかりやすいように解説】』という動画があり、これを活用できないかと思いました。
これを見ればひとまずLineへのメッセージ送信はできます。では、お知らせサービスから来るメールをどのように処理したらよいか考えました。
最初に調べた方法ですが、「自動化」についてです。本や動画でも多くのコンテンツがありました。ですが、最終的には(Windowsの場合は)タスクスケジューラーを使用する方法ばかりでした。これだと基本的にパソコンの電源が入っていなければなりません。実際にやってみたのですが、タイミングも微妙で、設定がうまくいっていないのか、失敗ばかりです。
そこでたどり着いたのが次の動画でした。
いまにゅのプログラミング塾
こちらのチャンネルは最近見るようになったのですが、とにかく動画の種類が豊富です。Pythonでできることはほとんど解説されていると思います。
そして見つけたのが『自動化に欠かせない定期実行の仕組みを3大クラウドで実践!』というものでした。タイトルのとおり3大クラウドで定期実行とのことですが、そもそもこんなことができるんだと初めて知りました。
私の場合はGoogleがよさそうだったのでGoogle Cloud Functionsを使用することにしました。そもそもGoogle Cloud Functionsなんて初めて聞きました。実践では動画を何度も一時停止しながらゆっくりと慎重にやりました。
ついでにいまにゅさんの動画でもLineのやつがあったのですが、ちょっと難しい方法でしたので、キノコードさんの方法を採用しました。
また、Gmailの処理の動画もそれぞれあるのですが、受信についての良いものがなかったので、こちらを参考に地道にコードを理解してすすめました。
これらの方法を駆使して、「Google Cloud Functionで、お知らせサービス(学校)からの未読メールがある場合、それをLineに送信する」というものを実装します。厳密にはGoogle Cloud FunctionとCloud Schedulerというものを使います。Googleのサービスは有料ですが、この程度の使用量であれば無料枠で収まると思います。気になる方はGoogleのページでご確認ください。
実装方法
工程は次のとおりです。
- Gmailの検索を容易にするため、お知らせメールにラベルが付くように設定する→私は「School」というラベルが付くようにしました
- Lineでの送信準備をする→キノコードさんの動画をその通り実行すればOK
- Pythonのコードを書く→以下、動画はいまにゅさんのものを参考し、メールはリンク先のものを参考に
- Cloud Functionの設定→ここが一番面倒で難しいです(動画を何度も見ました)
- Cloud Schedulerの設定→実行タイミングの設定です(それほど難しくないです)
- 運用開始
私が実行しているコードは以下の通りです。(アドレス等は修正をかけています。)初心者なので、よろしくない箇所もあるかと思いますが(特にエラー発生時を想定していないので)、一応現在は動いています。
import imaplib
import email
import base64
from email.header import decode_header, make_header
import datetime
import requests
def gmail(option):
gmail = imaplib.IMAP4_SSL('imap.gmail.com', '993')
gmail.login('◆◆◆◆◆@gmail.com', '◆◆◆◆') # メールアドレス、パスワード
gmail.select('school') # ラベル
typ, data = gmail.search(None, option)
mail_list=[]
for num in data[0].split():
h, d = gmail.fetch(num, '(RFC822)')
raw_email = d[0][1]
# 文字コード取得
msg = email.message_from_string(raw_email.decode('iso-2022-jp'))
msg_encoding = email.header.decode_header(msg.get('Subject'))[0][1] or 'iso-2022-jp'
# タイトルの情報を抽出
msg_subject = email.header.decode_header(msg.get('Subject'))[0][0]
# エンコーディング
subject = str(msg_subject.decode(msg_encoding))
# 本文の抽出
body = msg.get_payload()
# リスト作成
mail_list.append([subject, body])
gmail.close()
gmail.logout()
return mail_list
def line(url, token, message):
token_dic = {'Authorization': 'Bearer ' + token}
send_dic = {'message': message}
requests.post(url, headers=token_dic, data=send_dic)
def job(event, context):
# gmail 読み込み
today = datetime.datetime.now()
today_option = today.strftime('%d-%b-%Y')
search_option = '(UNSEEN SENTSINCE "' + today_option + '")'
mail_list = gmail(search_option)
# line送信
token = '◆◆◆◆◆◆◆◆' # トークン
url = 'https://notify-api.line.me/api/notify'
# 複数受信した場合はそれぞれ送信
if len(mail_list)>0:
for m in mail_list:
line(url, token, m[1])
# Function dependencies, for example:
# package>=version
requests==2.25.1
Google Schedulerは月曜日~金曜日の7時~17時の毎分メールのチェックを行うようにしました。
動作の状況
こんな感じになりました。
成功しました。1分程度のズレで届いているのでGoogle Schedulerの設定どおり動いています。Lineの通知であればわかりやすく、スマートウォッチも振動するのでわかりやすくなりました。以前に買ったvivoactiveが役に立っています。電話の着信とかに気づきにくい人はおススメです。
まとめ
今回は登下校お知らせサービスをLINEに通知する仕組みづくりを行いました。
お二人の動画はとても参考になりました。この組み合わせを使って別の自動化プログラムを作ってみようかと思います。特にカレンダーをやってみたいと思っています。