Pythonを用いた通知系統の構築

はじめに

集合住宅や一戸建てに関わらず,家庭では曜日ごとに燃えるゴミ,缶,ペットボトル等のゴミ出しをする.
当家においては,曜日ごとのゴミ出しを失念することが頻繁にある.
そこで,あらかじめ時刻と通知文を決定しておき自動で送る仕組みと,通知文を自由に送ることのできるGUIアプリの作成を目的とした.

時刻指定+通知の自動化の仕組みづくり

指定された時刻に通知を送るために以下を用いた.

・Python 3.8
・Github Actions
・Line Notify API

PythonでLine Notify API を介してLineに通知を送るスクリプトをGithub上にデプロイし,Github Actionsを用いて指定された時刻にスクリプトを実行するワークフローを作成した.

作成したコードは次のとおりである.

import time
from datetime import datetime, timedelta
import locale
import network, requests

token = 'Line Notify Pesonal Access Token'

def send_message(message):
    line_header = {
        'Content-Type': 'application/x-www-form-urlencoded',
        'Authorization': 'Bearer ' + token
    }
    line_message = 'message=' + message 
    print(line_message)
    req = requests.post('https://notify-api.line.me/api/notify', 
       headers=line_header, data=line_message)
    req.close()

def task1():
    message = "明日は燃えるゴミぴか!マジで!"
    send_message(message)

def task2():
    message = "缶とペットボトルは明日ぴ❣"
    send_message(message)

def task6():
    message = "明日は燃えるゴミ,マジで❕"
    send_message(message)

today = datetime.now()
weekday = today.weekday()

if weekday == 1:
    task1()
elif weekday == 2:
    task2()
elif weekday == 6:
    task6()

また,github actions のymlファイルは次のとおりである.

name: pika_notify
on:
  schedule:
    - cron: '0 12 * * *'

jobs:
  build:
    runs-on: ubuntu-latest

    steps:
      - uses: actions/checkout@v2
      - name: Set up Python 3.8
        uses: actions/setup-python@v1
        with:
          python-version: 3.8
      - name: Install dependencies
        run: |
          python -m pip install --upgrade pip
          pip install datetime
          pip install network
          pip install requests
      - name: Run script
        run: |
          python pika.py

これらを実行すると以下のような結果になる.

翌日がゴミ出しの日の場合,前日の21:30頃に通知が届くようになった.

任意で通知を送ることができるGUIアプリの作成

時刻と通知文をあらかじめ決めて自動で実行する仕組みだけでなく,任意で通知文を決めて送ることのできる仕組みを作った.
操作しやすいようにTkinterを用いてGUIで操作できるようにした.このとき,今後の機能拡張のためクラス化した.
また,pyinstaller を用いてexe化し,単体で動くようにした.使用したものをいかにまとめる.

・Python 3.8
・Tkinter
・Line Notify API

作成したコードは次のとおりである.

import tkinter as tk
import requests

class Application():
    def __init__(self, master):
        self.master = master
        self.master.title("notify system") 
        self.master.geometry("300x200")  
        self.widget()

    def widget(self):
        # ウィジェットの作成
        self.label_token = tk.Label(text="enter your token")
        self.entry_token = tk.Entry(width=26)
        self.label_notify = tk.Label(text="enter notification")
        self.entry_text = tk.Text(width=30, height=5)
        self.button = tk.Button(text="SEND", width=10, command=self.button_click)

        # ウィジェットの配置
        self.label_token.place(x=55, y=15)
        self.entry_token.place(x=55, y=40)
        self.label_notify.place(x=55, y=65)
        self.entry_text.place(x=55, y=87)
        self.button.place(x=105, y=165)

    def button_click(self):
        token = self.entry_token.get()
        message = self.entry_text.get("1.0", tk.END).strip()
        line_header  = {
            'Content-Type': 'application/x-www-form-urlencoded',
            'Authorization': 'Bearer ' + token
        }
        line_message = {'message': message}
        req = requests.post('https://notify-api.line.me/api/notify', headers=line_header, data=line_message)
        req.close()

def main():
    root = tk.Tk()
    app = Application(master=root)
    root.mainloop()

if __name__ == "__main__":
    main()


GUIの操作画面は次のようになる.

トークンと通知文を入力し,SENDした結果は次のようになる.

まとめと今後の展望

ゴミ出しの問題を早急に解決する必要があり,必要最低限の仕組みではあるが素早く作ることができた.

時刻,通知文指定のものはさらにタスクを追加できると考えられ,また,GUIアプリはクラス化して機能追加しやすくなっているため,例えばファイル送信機能等追加していくことができると考えられる.

ゴミ出しの問題については,通知があろうがなかろうが特に改善はなかった.