はじめに

月の最後に勤怠時間を一気に記述するというスタイルの私は日頃からtogglで勤怠の時間管理をしています(会社はコアフレックスです)。
よくtogglのボタンを押すのを忘れるので、押せてなかったりそもそも働いてなかったら教えてくれる機能を作ろうと思ったというのが背景。
あとPython書きたかったお。

前提条件

ソースコード

send_mail.py

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import requests
import json
import smtplib
import datetime
import os
import sys
from email.mime.text import MIMEText
from email.utils import formatdate

API_KEY = "togglのApiKeyを記述"
MY_ADDRESS = "gmailアドレス"
MY_PASSWORD = "gmailパスワード"
TO_ADDRESS = "mail送信先"
DATE = datetime.datetime.today().strftime("%Y-%m-%d")
NOW_TIME = datetime.datetime.today().strftime("%H:%M")
PATH = "ログディレクトリまでのパス" + DATE
LOG_PATH = PATH + "_send.log"
TIME_LOG_PATH = PATH + "_send_time.log"
ERROR_LOG_PATH = PATH + "_send_error.log"
PARAMS = {
    "user_agent": TO_ADDRESS,
    "workspace_id": "2519279",
    "since": DATE,
    "until": DATE}

def send_mail():
    try:
        total_time = json.loads(requests.get("https://toggl.com/reports/api/v2/summary", auth=(API_KEY, 'api_token'), params=PARAMS).text)["total_grand"]
        total_time = total_time * 1.5 if total_time is not None else 0
        if total_time > 28800000:
            SUBJECT = "帰宅時間になりました。"
            BODY = "あなたはもう8時間働きました、帰りましょう。"
        else:
            SUBJECT = "現在" + str(round(total_time / 3600000, 2)) + "時間働いています。"
            BODY = "残りは" + str(round(8 - total_time / 3600000, 2)) + "時間です。"
        msg = MIMEText(BODY)
        msg['Subject'] = SUBJECT
        msg['From'] = MY_ADDRESS
        msg['To'] = TO_ADDRESS
        msg['Date'] = formatdate()

        smtpobj = smtplib.SMTP('smtp.gmail.com', 587)
        smtpobj.ehlo()
        smtpobj.starttls()
        smtpobj.ehlo()
        smtpobj.login(MY_ADDRESS, MY_PASSWORD)
        smtpobj.sendmail(MY_ADDRESS, TO_ADDRESS, msg.as_string())
        smtpobj.close()
    except:
        with open(ERROR_LOG_PATH, 'a') as f_w:
            f_w.write("Unexpected error:\n" + str(sys.exc_info()))
if not os.path.exists(LOG_PATH):
    with open(LOG_PATH, 'w') as f_w:
        f_w.write("log,start")
    with open(TIME_LOG_PATH, 'w') as f_w:
        f_w.write("log start!!!")
with open(LOG_PATH, 'r') as f_r:
    file_data = f_r.read().split(',')

if NOW_TIME >= "12:00" and NOW_TIME < "14:00" and "noon" not in file_data:
    with open(LOG_PATH, 'a') as f_w:
        f_w.write(",noon")
    with open(TIME_LOG_PATH, 'a') as f_w:
        f_w.write("\nnoon " + datetime.datetime.today().strftime("%H-%M"))
        send_mail()
elif NOW_TIME >= "14:00" and NOW_TIME < "16:00" and "afternoon" not in file_data:
    with open(LOG_PATH, 'a') as f_w:
        f_w.write(",afternoon")
    with open(TIME_LOG_PATH, 'a') as f_w:
        f_w.write("\nafternoon " + datetime.datetime.today().strftime("%H-%M"))
        send_mail()
elif NOW_TIME >= "16:00" and NOW_TIME < "18:00" and "evening" not in file_data:
    with open(LOG_PATH, 'a') as f_w:
        f_w.write(",evening")
    with open(TIME_LOG_PATH, 'a') as f_w:
        f_w.write("\nevening " + datetime.datetime.today().strftime("%H-%M"))
        send_mail()
elif NOW_TIME >= "18:30" and "ordinary" not in file_data:
    with open(LOG_PATH, 'a') as f_w:
        f_w.write(",ordinary")
    with open(TIME_LOG_PATH, 'a') as f_w:
        f_w.write("\nordinary " + datetime.datetime.today().strftime("%H-%M"))
        send_mail()

解説

TO_ADDRESS, MY_ADDRESS, MY_PASSWORD, PATH, API_KEYを埋めてもらえたらそれでOKです。
googleアカウントの新規作成を私はオススメします。

cronの設定

*/15 12-20 * * 1-5 /usr/local/bin/python3

cron使ってるのに時間管理してるようなソースコードに見えるかもですが、決められた時間に何通も送らないようにフラグ管理してます。
n時間おきにすればよくね?って私も思ったんですがその時間にmac落としてると動かないんですよね(当然)。なので15分おきに回してます。

感想

今回はtogglというマイナーなツール(失礼)を例にしましたが、他のリマインドもしくは通知に絡めて使ってみるとよいかも。。?

今回の記事と無関係ですが「クソコード」とか「これならソースコード書かない方がマシだよ」とかの発言は相手を傷つけるつもりがなくても傷つけてしまう為「ひよコード」と呼び「ここがピヨピヨしてるね」と表現するようにしてるって誰かのTwitterで見かけました。表現が可愛くていいですね。

私の記事のソースコードがピヨピヨしてたら是非教えてくださいね☆