ビジネスパーソン・ガジェット置場 empty lot for business

営業や仕事、それに伴う生活を便利に楽にするツール、ガジェットを作ります。既にあるツールも自分用にカスタマイズ。

たばこ本数管理アプリ【python + Line Messaging】

ラインのやり取りでたばこを吸った時間を管理するガジェットです。吸った時間はスプレッドシート上で管理しています。また、その時間をチェックするのがラインです。ラインのトークルームで「たばこ」と送ると女の子が本数に応じて返信をくれると同時にスプレッドシートに時間を書き込みます。女の子の会話内容も本数を重ねるごとに口調が荒くなり禁煙効果もあるかもです。

f:id:kslabo51:20220324212914j:plain

例えばこんな状況で

今回のガジェットは、こういう声に対応
「1日に何本タバコを吸っているんだろう。一回一回数えるのは大変だし、数えていても虚しくなるし。誰かが代わりに数えてくれないかな」ラインで可愛い女の子が代わりに吸った時間と合わせて数えてくれます!

 

f:id:kslabo51:20220324213053p:plain

このガジェットでできることはこちら

  • たばこの吸った時間をスプレッドシートで管理。
  • ラインのやり取りでその時間を自動計測。
  • またラインでは女の子がたばこに行く都度コメントをくれます。
  • 日付が変わればまた1から数えなおしてくれます。
  • 1日吸った本数が増えるとだんだん女の子の態度も荒れてきますので禁煙効果も出ます。

注意点はこちら

  • ラインでのやり取りですが、こちらが使用できる会話は「たばこ」という言葉のみです。
  • たばこ以外の言葉を送ると注意されます。

評価(自己)

役立ち度 ★★★★(良し)
効率化  ★★★★(良し)
ミス防止 ★★★(平均)
楽しさ  ★★★★★(最高)
操作性  ★★★★(良し)

 

実行環境


使用環境    Line Messaging API
使用言語     python
使用ライブラリ  flask、linebot import 、linebot.exceptions 、linebot.models 
os、json、pandas、datetime、random、gspread、oauth2client.service_account

 

コード

from flask import Flask, request, abort

from linebot import (
    LineBotApi, WebhookHandler
)
from linebot.exceptions import (
    InvalidSignatureError
)
from linebot.models import (
    MessageEvent, TextMessage, TextSendMessage,
)
import os
import json
import pandas as pd
from datetime import datetime
import random
import gspread
from oauth2client.service_account import ServiceAccountCredentials

def auth():
    SP_CREDENTIAL_FILE = 'secret.json'

    # APIを使用する範囲
    SP_SCOPE = [
        'https://spreadsheets.google.com/feeds',
        'https://www.googleapis.com/auth/drive'
    ]

    # 今回使用するスプレッドシートのurlのdの直後
    SP_SHEET_KEY = '管理用スプレッドシートのID'
    SP_SHEET = 'シート名'
    
    # 認証情報を組み合わせ認証する
    credentials = ServiceAccountCredentials.from_json_keyfile_name(SP_CREDENTIAL_FILE, SP_SCOPE)
    gc = gspread.authorize(credentials)

    # スプレッドシートの情報を取ってくる
    sh = gc.open_by_key(SP_SHEET_KEY)
    worksheet = sh.worksheet(SP_SHEET)
    return worksheet

# リセット処理をし新しい列を追加する
def set_column():
    worksheet = auth()
    data = worksheet.get_all_values()

    timestamp = datetime.now()
    date = timestamp.strftime('%m/%d')
    time = timestamp.strftime('%H:%M:%S')
    df = pd.DataFrame(data[1:])
    df.columns = data[0]
    num = len(df[date][df[date].values!=''])
    df[date].values[num] = time
    worksheet.update([df.columns.values.tolist()] + df.values.tolist())

def reply():
    worksheet = auth()
    data = worksheet.get_all_values()
    date = datetime.now().strftime('%m/%d')
    df = pd.DataFrame(data[1:])
    df.columns = data[0]
    num = len(df[date][df[date].values!=''])
    reply_num = str(num)
    rand = random.randint(0,3)
    reply = reply_dic[reply_num][rand]
    return reply

reply_dic = {
    '1': ['いってらっしゃい!', '気をつけてね', 'ごゆっくり', '気分転換♪'],
    '2': ['2本目だね', '朝はゆっくり~', '楽しんでね', '休憩!休憩!'],
    '3': ['おやつ欲しい〜', 'まだ午前中だね', '早くね〜', '私も休憩しようかな'],
    '4': ['4本目か', 'ランチ行きたい', 'ランチ食べた?', 'いってらー'],
    '5': ['5本目よ!', '吸いすぎじゃない?', 'たばこか。。', 'らー'],
    '6': ['6本目。。', 'ちょっと。。。', 'また。。。?', '休憩。。?'],
    '7': ['7本!!!', '吸いすぎよ!', 'ほんとに!?', 'やばない!?'],
    '8': ['もう8本目!', '体に悪いよ!', '吸いすぎ!!?', 'あ〜あ'],
    '9': ['もうすぐ二桁!', 'あーーー寂しいな', 'また行くの!!?', 'あーーーーー'],
    '10': ['10本目です!', 'やめなさい!!!', '知らないよー!', 'やばめ'],
    '11': ['死んじゃうよ!', 'ストップ!!!', 'だめ!', 'やばいよ!'],
    '12': ['癌になるよ!', '肺が真っ黒!!!', 'ほんとにだめ!', '健康X!'],
    '13': ['死んじゃえ!', '肺苦しめ!!!', 'たばこくさい!!', '終わりだね'],
    '14': ['死ね!', '最悪!!!', 'ばか!', '終了'],
    '15': ['死!', '悪!!!', '苦!', '知らない!'],
    
}



app = Flask(__name__)

with open('info.json') as f:
    secret = json.load(f)

YOUR_CHANNEL_ACCESS_TOKEN =secret['YOUR_CHANNEL_ACCESS_TOKEN']
YOUR_CHANNEL_SECRET = secret['YOUR_CHANNEL_SECRET']

line_bot_api = LineBotApi(YOUR_CHANNEL_ACCESS_TOKEN)
handler = WebhookHandler(YOUR_CHANNEL_SECRET )

# wewbhookを行うための設定
@app.route("/callback", methods=['POST'])
def callback():
    # get X-Line-Signature header value
    signature = request.headers['X-Line-Signature']

    # get request body as text
    body = request.get_data(as_text=True)
    app.logger.info("Request body: " + body)

    # handle webhook body
    try:
        handler.handle(body, signature)
    except InvalidSignatureError:
        print("Invalid signature. Please check your channel access token/channel secret.")
        abort(400)

    return 'OK'

# チャットボットの動きを設定
@handler.add(MessageEvent, message=TextMessage)
def handle_message(event):
    if event.message.text == 'たばこ':
        set_column()
        times = 0
        line_bot_api.reply_message(
            event.reply_token,
            TextSendMessage(text=reply()))
    else:
        line_bot_api.reply_message(
            event.reply_token,
            TextSendMessage(text='たばこに行くとくは「たばこ」と書いてください'))


# herokuで動作させるように変更している
if __name__ == "__main__":
    port = os.getenv("PORT")
    app.run(host="0.0.0.0", port=port)