本記事はこの記事の続きです。
コピペで簡単!PythonでLineにリマインドを送ろう!ゴミ捨て曜日を通知する方法を解説(その1)目次
(前回の復習)PythonでLINEにゴミ捨てリマインド!
今回は、「次の日のゴミ回収の種類は何なのか」を前日の夜にLINEでリマインドしてくれるプログラムをご紹介します!
Pythonの環境構築が終わっているけど、基礎文法には少し触ったことがある程度の方でも簡単にプログラム製作できるようにサンプルプログラムも合わせてご紹介します。
LINEに送られてくるメッセージのイメージはこの写真見たいな感じです。
画像はいらすとやの画像を使います。
あわせて読みたいプログラミング関連記事はこちら
初学者おすすめ!Python独学するならYouTubeを活用してみようLINEでゴミ捨てリマインド送るためのロードマップ
LINEでゴミ捨てリマインドを送るためのロードマップはこんな感じです。
PythonでLINEメッセージを送るための下準備としてLINEnotifyのアクセストークンを発行します
PythonでLINEメッセージを送るためのPythonプログラムを準備します。
(今回の記事はここまで)
曜日ごとにリマインドしたメッセージを作成します。今回は、ゴミ捨ての曜日(可燃ごみは月曜日など)を作成します。
毎日決まった時間にLINEメッセージを送るために定期実行プログラムを作成します。
前回はSTEP1,2を解説して、プログラムをLINEメッセージを送ることができました。
本記事ではSTEP3,4を解説していきます。
STEP3: リマインド内容を作成〜ゴミ捨ての曜日をLINEで知らせよう
前回でLINEへメッセージを送ることができるようになりましたので、今回から実際に送るメッセージを作っていきたいとおもいます。
今回のメッセージ内容は翌日のゴミ回収の種類を前日の夜にリマインドするといった内容になります。
今回は、表の曜日に曜日事にゴミ回収の曜日が設定されていると想定して、前日に送りたいたいメッセージを決めます。皆さんと自分のゴミ回収曜日を参考に製作して見てください。
曜日 | ゴミ回収の種類 | 前日に送信したいメッセージ |
---|---|---|
月曜日 | 可燃ゴミ | 明日は可燃ゴミの日です。 |
火曜日 | 資源ゴミ(プラスチック,ペットボトル,缶など) | 明日は資源ゴミの日です。 |
水曜日 | ー | 明日のゴミ捨てはありません。 |
木曜日 | 可燃ゴミ | 明日は可燃ゴミの日です。 |
金曜日 | ー | 明日のゴミ捨てはありません。 |
土曜日 | (第2土曜日)段ボール | 明日が第2土曜日なら段ボール回収の日です。 |
日曜日 | ー | 明日のゴミ捨てはありません。 |
リマインド内容を作成しよう
それでは、曜日事に送りたいメッセージを決めることができたら、次はLINEへメッセージを送るための下準備をします。
ここでは自動的に今日の日付から曜日を取得し、翌日メッセージを返す関数を作成します。
関数の作成手順はこんな感じです。
Pythonの標準ライブラリdatetimeを使って今日の日付を取得します。
取得した日付からさらに,datetimeを使って曜日を取得します。
if構文で曜日ごとに場合わけをして、メッセージを作成します。
関数化(def)にすることで扱いやすくします。
この流れで、送りたいメッセージを今日の日付から自動的生成してきます。
順番に解説していきます。
今日の日付を取得する
最初に、datatimeモジュールを使って今日の日付を取得します。
now関数で今日の日付を 年-月-日 時:分:秒の形式で取得できます。
import datetime
#datetimeモジュールのnow関数で今日の日付を取得します。
Today = datetime.datetime.now()
#printで書き出し
print(Today)
実行します。
日付を取得することができました。
今日の曜日を取得する
次に取得した日付から曜日を取得します。
datetimeモジュールのweekday関数で今日日付から曜日を取得できます。
import datetime
import locale
# localeモジュールでロケールを変更する。日本のローカル情報を取得。おまじない。
locale.setlocale(locale.LC_TIME, 'ja_JP.UTF-8')
# datetimeモジュールのnow関数で今日の日付を取得します。
Today = datetime.datetime.now()
# Weekday関数で曜日を取得します。
week_num = Today.weekday()
# Weekday関数の返り値は数値なりますので、曜日のリストをあわせて準備します
w_list = ['月曜日', '火曜日', '水曜日', '木曜日', '金曜日', '土曜日', '日曜日']
#今日の日付、週の値、曜日の書き出し
print(Today, week_num, w_list[week_num])
実行してみます。
21年5月3日は月曜日なので,Weekday関数では0の返り値が返ってきてます。
参考に、weekday関数の返り値を表にしときます。
曜日 | Weekday関数の返り値 |
---|---|
月曜日 | 0 |
火曜日 | 1 |
水曜日 | 2 |
木曜日 | 3 |
金曜日 | 4 |
土曜日 | 5 |
日曜日 | 6 |
曜日ごとにメッセージを設定します
曜日を取得することができましたので、次はif構文を使って、曜日ごとのメッセージを設定します。
import datetime
import locale
# localeモジュールでロケールを変更する。日本のローカル情報を取得。おまじない。
locale.setlocale(locale.LC_TIME, 'ja_JP.UTF-8')
# datetimeモジュールのnow関数で今日の日付を取得します。
Today = datetime.datetime.now()
#weekday関数で曜日を取得します。
week_num = Today.weekday()
# Weekday関数の返り値は数値なりますので、曜日のリストをあわせて準備します
w_list = ['月曜日', '火曜日', '水曜日', '木曜日', '金曜日', '土曜日', '日曜日']
#水曜日(week_num= 2)と日曜日(week_num= 6)に翌日の可燃ごみのメッセージを記入
if week_num == 2 or week_num == 6:
message = '明日は可燃ゴミの日です。'
image_path = './moeru.png'
#月曜日(week_num= 0)に翌日の資源ごみのメッセージを記入
elif week_num == 0:
message = '明日は資源ゴミの日です。'
image_path = './shigen.png'
#金曜日(week_num= 4)に翌日の段ボール回収のメッセージを記入
elif week_num == 4:
message = '明日が第2土曜日なら段ボール回収の日です。'
image_path = './danboru.png'
#それ以外の日は、ゴミ捨てがないメッセージを記入します。
else:
message = '明日のゴミ捨てはありません。'
image_path ='./nashi.png'
#曜日と送信するメッセージ書き出します
print(w_list[week_num], message)
実行してみます。
week_numの数値が2だったため、曜日は水曜日になり、メッセージは
翌日のゴミ回収種類のメッセージとして「明日は可燃ゴミの日です。」が表示できてます。
最終的には、メッセージに対応する画像も送信したいので、ここでメッセージと一緒に画像パスも設定しておきます。
関数にします
これで、本日の日付を取得して、曜日を取得し、曜日に対応するメッセージを出力できるようになりました。
最後に、今回のプログラムを関数化することで扱いやすくします。
Pythonでの関数の定義はではdefを使います。
#def で関数化してきます。関数名はGomi_Sute_Messageとします。
def Gomi_Sute_Message():
# localeモジュールでロケールを変更する。日本のローカル情報を取得。おまじない。
locale.setlocale(locale.LC_TIME, 'ja_JP.UTF-8')
# datetimeモジュールのnow関数で今日の日付を取得します。
Today = datetime.datetime.now()
#weekday関数で曜日を取得します。
week_num = Today.weekday()
# Weekday関数の返り値は数値なりますので、曜日のリストをあわせて準備します
w_list = ['月曜日', '火曜日', '水曜日', '木曜日', '金曜日', '土曜日', '日曜日']
#水曜日(week_num= 2)と日曜日(week_num= 6)に翌日の可燃ごみのメッセージを記入
if week_num == 2 or week_num == 6:
message = '明日は可燃ゴミの日です。'
image_path = './moeru.png'
#月曜日(week_num= 0)に翌日の資源ごみのメッセージを記入
elif week_num == 0:
message = '明日は資源ゴミの日です。'
image_path = './shigen.png'
#金曜日(week_num= 4)に翌日の段ボール回収のメッセージを記入
elif week_num == 4:
message = '明日が第2土曜日なら段ボール回収の日です。'
image_path = './danboru.png'
#それ以外の日は、ゴミ捨てがないメッセージを記入します。
else:
message = '明日のゴミ捨てはありません。'
image_path ='./nashi.png'
#returnで曜日ごのメッセージを返り値として設定します。
return message, image_path
これで、関数化することができました。
これで、この関数を呼び出すことで曜日事のメッセージを返せるようになりました。
STEP4: リマインダーを定期実行しよう
送信したいメッセージを今日の日付から得て、LINEへメッセージを送る準備ができましたので、次の決められた時間に定期的にLINEメッセージをを送れるようにプログラムを定期実行するする方法を解説しきます。
定期実行の方法のまとめ
ここでは、プログラムを定期実行する方法をまとめていきます。
定期的にプログラムを実行する方法は以下になります。
- プログラム中で実行したい関数を定期的に呼び出す方法 *プログラムは実行しっぱなし
- sheduleモジュールで決めれた間隔で実行する。「今回ご紹介]
- whileループ中にtime.sleepで処理を一時停止する。
- プログラムを定期的に実行する方法 *プログラムの起動は決めれた時刻のみ
- cron (クーロン)(Linux系)
- systemed
- タスクスケジューラー(Windouwsのみ)
定期実行する方法は大きく分けて2種類にあり、1つ目は、プログラム中で実行したい関数を定期的に呼び出す方法であり、こちらはプログラムは実行しっぱなしになります。2つ目は、プログラムを自体を定期的に実行する方法であり、こちらは決めれら時刻・間隔でのみプログラムが実行されます。
今回は、簡単に設定できるにプログラム中で実行したい関数を定期的に呼び出す手法の1つとして,sheduleモジュールを使う方法をご紹介します。
scheduleモジュールでの定期実行の設定
scheduleは一定の間隔(数分・数時間・数日おき)に同じ作業を実行するような場合に便利なモジュールです。
scheduleモジュールはpipコマンドで簡単に入手可能です。
pip install shedule
サンプルコードは以下になります。参考:公式HP
import schedule
import time
def job():
print("I'm working...")
#10分ごとにjob関数を呼び出す
schedule.every(10).minutes.do(job)
#1時間ごとにjob関数を呼び出す
schedule.every().hour.do(job)
#10時30分ごとにjob関数を呼び出す
schedule.every().day.at("10:30").do(job)
#毎日月曜日に実行
schedule.every().monday.do(job)
# 毎週水曜13時15分に実行
schedule.every().wednesday.at("13:15").do(job)
# 毎時17分に実行
schedule.every().minute.at(":17").do(job)
while True:
schedule.run_pending()
time.sleep(1)
サンプルコードのように、好きな時間、間隔でjob関数を呼び出して実行することができます。
それでは、sheduleモジュールを使ってLINEメッセージを毎日22:00に翌日のゴミ回収の種類を送れるように設定していきましょう。
scheduleモジュールでリマインダーを定期送信しよう
sheduleモジュールでは実行したい関数を呼び出しすることで実行しますので、呼び出したい関数をまとめておくと
扱いやすいです。
#定期的に実行したいメインのプログラムです。
def main():
LINE_Notify = LINE_Notify()
#Gomi_Sute_Message関数からメッセージと画像パスを取得する
message, image_path = Gomi_Sute_Message()
#Sent_Image関数でメッセージと画像を送ります。
LINE_Notify.Sent_Image(message, image_path)
if __name__ == '__main__':
#shedleモジュールで毎日22:00にmain関数を実行します。
schedule.every().day.at("22:00").do(main)
while True:
schedule.run_pending()
time.sleep(1)
今回は、22時になったらmainという関数を呼び出すように記述しておきます。
main関数では、STEP3で作った送信用メッセージをSTEP2で作った画像を送る関数でLINEへ送信してます。
これで、定期的にLINEメッセージを決まった時間に送信することができるようになりました!
LINEにゴミ捨てリマインドプログラムのまとめ
それでは、最後にゴミ捨てリマインドプログラムをまとめておきます。
こちらのプログラムを実行することで一番最初に紹介させてもらったようにLINEにリマインドを送ることができるようになります。画像やメッセージは皆さんで好きに設定してみてくださいね。
import datetime
import locale
import requests
class LINE_Notify:
def __init__(self):
self.API_url = 'https://notify-api.line.me/api/notify'
self.access_token = 'アクセストークンを貼り付け'
self.__headers = {'Authorization': 'Bearer ' + self.access_token}
def Sent_Message(self, message):
payload = {'message': message}
requests.post(self.API_url, headers=self.__headers, params=payload,)
def Sent_Image(self, message, image):
payload = {'message': message}
files = {'imageFile': open(image, 'rb')}
requests.post(self.API_url, headers=self.__headers, params=payload, files=files,)
def Sent_Stamp(self,message,stamp_number):
payload = {
'message': message,
'stickerPackageId': 1,
'stickerId': stamp_number,
}
requests.post(self.API_url, headers=self.__headers, params=payload,)
#def で関数化してきます。関数名はGomi_Sute_Messageとします。
def Gomi_Sute_Message():
# localeモジュールでロケールを変更する。日本のローカル情報を取得。おまじない。
locale.setlocale(locale.LC_TIME, 'ja_JP.UTF-8')
# datetimeモジュールのnow関数で今日の日付を取得します。
Today = datetime.datetime.now()
#weekday関数で曜日を取得します。
week_num = Today.weekday()
# Weekday関数の返り値は数値なりますので、曜日のリストをあわせて準備します
w_list = ['月曜日', '火曜日', '水曜日', '木曜日', '金曜日', '土曜日', '日曜日']
#水曜日(week_num= 2)と日曜日(week_num= 6)に翌日の可燃ごみのメッセージを記入
if week_num == 2 or week_num == 6:
message = '明日は可燃ゴミの日です。'
image_path = './moeru.png'
#月曜日(week_num= 0)に翌日の資源ごみのメッセージを記入
elif week_num == 0:
message = '明日は資源ゴミの日です。'
image_path = './shigen.png'
#金曜日(week_num= 4)に翌日の段ボール回収のメッセージを記入
elif week_num == 4:
message = '明日が第2土曜日なら段ボール回収の日です。'
image_path = './danboru.png'
#それ以外の日は、ゴミ捨てがないメッセージを記入します。
else:
message = '明日のゴミ捨てはありません。'
image_path ='./nashi.png'
#returnで曜日ごのメッセージを返り値として設定します。
return message
#定期的に実行したいメインのプログラムです。
def main():
LINE_Notify = LINE_Notify()
#Gomi_Sute_Message関数からメッセージと画像パスを取得する
message, image_path = Gomi_Sute_Message()
#Sent_Image関数でメッセージと画像を送ります。
LINE_Notify.Sent_Image(message, image_path)
if __name__ == '__main__':
#shedleモジュールで毎日22:00にmain関数を実行します。
schedule.every().day.at("22:00").do(main)
while True:
schedule.run_pending()
time.sleep(1)
以上、PythonでLINEにゴミ捨てリマインドをする方法を解説してみました。わかりづらいところありましたらコメントで質問もらえると嬉しいです。
なんだかできそうな気がするよ!
わからないところがあったら、コピペして実行してみよう
以上、終わりです。
あなたにおすすめの関連する記事はこちら