コピペで簡単!PythonでLineにリマインドを送ろう!ゴミ捨て曜日を通知する方法を解説(その2)

abstract business code coder

本記事はこの記事の続きです。

abstract business code coder コピペで簡単!PythonでLineにリマインドを送ろう!ゴミ捨て曜日を通知する方法を解説(その1)

(前回の復習)PythonでLINEにゴミ捨てリマインド!

今回は、「次の日のゴミ回収の種類は何なのか」を前日の夜にLINEでリマインドしてくれるプログラムをご紹介します! 

Pythonの環境構築が終わっているけど、基礎文法には少し触ったことがある程度の方でも簡単にプログラム製作できるようにサンプルプログラムも合わせてご紹介します。

今回つくるもの「LINEでごみ捨てリマインド」

・毎日、前日の夜10時に次の日のゴミ回収の種類をLINEにリマインドしてくれる

・ゴミ回収の種類と一緒にそのイラストを一緒に送る

LINEに送られてくるメッセージのイメージはこの写真見たいな感じです。

画像はいらすとやの画像を使います。 

あわせて読みたいプログラミング関連記事はこちら

abstract business code coder初学者おすすめ!Python独学するならYouTubeを活用してみよう

LINEでゴミ捨てリマインド送るためのロードマップ

LINEでゴミ捨てリマインドを送るためのロードマップはこんな感じです。 

LINENotifyに登録してアクセストークンを発行する

PythonでLINEメッセージを送るための下準備としてLINEnotifyのアクセストークンを発行します

PythonプログラムでLINEを送る

PythonでLINEメッセージを送るためのPythonプログラムを準備します。

(今回の記事はここまで)

リマインド内容を作成〜ゴミ捨ての曜日をLINEで知らせよう

曜日ごとにリマインドしたメッセージを作成します。今回は、ゴミ捨ての曜日(可燃ごみは月曜日など)を作成します。

リマインダーを定期実行しよう

毎日決まった時間に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関数の返り値
月曜日
火曜日
水曜日
木曜日
金曜日
土曜日
日曜日

曜日ごとにメッセージを設定します

曜日を取得することができましたので、次は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メッセージをを送れるようにプログラムを定期実行するする方法を解説しきます。

定期実行の方法のまとめ

ここでは、プログラムを定期実行する方法をまとめていきます。 

定期的にプログラムを実行する方法は以下になります。 

  • プログラム中で実行したい関数を定期的に呼び出す方法 *プログラムは実行しっぱなし 
    1. sheduleモジュールで決めれた間隔で実行する。「今回ご紹介]
    2. whileループ中にtime.sleepで処理を一時停止する。
  • プログラムを定期的に実行する方法 *プログラムの起動は決めれた時刻のみ
    1. cron (クーロン)(Linux系)
    2. systemed
    3. タスクスケジューラー(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にゴミ捨てリマインドをする方法を解説してみました。わかりづらいところありましたらコメントで質問もらえると嬉しいです。

しりたいかっぱ
しりたいかっぱ

なんだかできそうな気がするよ!

ゲコ助
ゲコ助

わからないところがあったら、コピペして実行してみよう

以上、終わりです。 

あなたにおすすめの関連する記事はこちら

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA