python 3.7
【目的】
SlackのDMで勤怠管理を行いたい。
最初はみやもとさんでの勤怠管理を行おうとしていたのですが、この機能はWebhookを利用しているためチャットでの使用に限定され、複数の人が利用するチャットでは非常にうるさくなってしまいます。そこでみやもとさんの機能をbotに落とし込んで、DMで個人ごとにひっそりと勤怠管理をしようと試みています。
【実装内容】
PythonのslackbotライブラリでSlackボットを作る
上記の記事を参考に簡単なSlackbotを実装しました。
そこに追加機能として、botのいるDMで挨拶を送信したとき
・その日付時刻をGoogleSpreadSheetに記録
・おはよう等の返事を行う
の2点を追加しようとしています。
【困っていること】
日付時刻の取得やGoogleSpreadSheetへの記録は単体でならdatetime.now()とgspreadでできたのですが、Slackbotに挨拶をしたときに日付時刻をシートへ記録させることができませんでした。
以下のコードの内容で試してみたのですが、おそらくSlackへの投稿とGoogleSpreadSheetへの書き込みが紐付いてないような気がしています。
※write_toは自作のデコレータです
【ディレクトリ構造】
slackbot # プログラムをまとめるディレクトリ。名前はなんでも良い ├─ run.py # このプログラムを実行することで、ボットを起動する ├─ slackbot_settings.py # botに関する設定を書くファイル ├─ gsheet.py # GoogleSpreadSheetに日付時刻を記述するスクリプト ├─ bot.py # respond_toやlisten_toを定義するファイル(?) └─ plugins # botの機能はこのディレクトリに追加する ├─ __init__.py # モジュールを示すためのファイル。空で良い └─ my_mention.py # 機能を記述しているファイル。任意の名前で良い
【コード】
my_mention.py
python
1# my_mention.py 2 3# coding: utf-8 4from slackbot.bot import respond_to # @botname: で反応するデコーダ 5from slackbot.bot import listen_to # チャネル内発言で反応するデコーダ 6from slackbot.bot import default_reply # 該当する応答がない場合に反応するデコーダ 7from slackbot.bot import write_to # Google Spread Sheetに時刻を書き込むデコーダ 8from slackbot.gsheet import Datetimeimport re 9 10# @respond_to('string') bot宛のメッセージ 11# stringは正規表現が可能 「r'string'」 12# @listen_to('string') チャンネル内のbot宛以外の投稿 13# @botname: では反応しないことに注意 14# 他の人へのメンションでは反応する 15# 正規表現可能 16# @default_reply() DEFAULT_REPLY と同じ働き 17# 正規表現を指定すると、他のデコーダにヒットせず、 18# 正規表現にマッチするときに反応 19# ・・・なのだが、正規表現を指定するとエラーになる? 20 21# message.reply('string') @発言者名: string でメッセージを送信 22# message.send('string') string を送信 23# message.react('icon_emoji') 発言者のメッセージにリアクション(スタンプ)する 24# 文字列中に':'はいらない 25 26@respond_to('おは|はよ|おっは|hello|hi|出勤|来た|きた') 27def mention_func(message): 28 message.reply('おはよ〜!') # メンション 29 30@respond_to('お先|失礼しま|お疲れ|おつ|帰る|退勤|バイバイ') 31def mention_func(message): 32 message.reply('バイバイ〜') # メンション 33 34@listen_to('疲れた|帰りた|眠い|ねむ') 35def mention_func(message): 36 message.reply('わかる〜') # メンション 37 38@write_to('おは|はよ|おっは|hello|hi|出勤|来た|きた') 39def mention_func(message): 40 message.reply('GSS確認して') 41
bot.py
python
1# bot.py 2 3# -*- coding: utf-8 -*- 4from __future__ import absolute_import 5import imp 6import importlib 7import logging 8import re 9import time 10from glob import glob 11from six.moves import _thread 12from slackbot import settings 13from slackbot.manager import PluginsManager 14from slackbot.slackclient import SlackClient 15from slackbot.dispatcher import MessageDispatcher 16from slackbot.gsheet import Datetime 17 18logger = logging.getLogger(__name__) 19 20~中略~ 21 22def write_to(matchstr, flags=0): 23 def wrapper(func): 24 Datetime.taketime(matchstr) 25 PluginsManager.commands['write_to'][ 26 re.compile(matchstr, flags)] = func 27 logger.info('registered write_to plugin "%s" to "%s"', func.__name__, 28 matchstr) 29 return func 30 31 return wrapper
gsheet.py
python
1# gsheet.py 2 3# coding: utf-8 4import gspread 5from oauth2client.service_account import ServiceAccountCredentials 6from datetime import date, datetime, timedelta 7import re 8 9scope = ['https://spreadsheets.google.com/feeds', 10 'https://www.googleapis.com/auth/drive'] 11 12#ダウンロードしたjsonファイル名を記入 13json_file = 'miyamoto.json' 14 15#スプレッドシートのシート名を記入 16sheet_name = 'miyamoto' 17 18#入力するワークシートの指定 19credentials = ServiceAccountCredentials.from_json_keyfile_name(json_file, scope) 20gc = gspread.authorize(credentials) 21wks = gc.open(sheet_name).sheet1 22 23class Datetime(object): 24 def taketime(str): 25 if re.compile("おは|はよ|おっは|hello|hi|出勤|来た|きた").search(str): 26 now_time = datetime.now() # 現在の yy年 mm月 dd日 HH時 MM分 SS秒 27 date = now_time.strftime('%Y/%m/%d') # 年月日の情報抽出 28 time = now_time.strftime('%H:%M') # 時,分の情報抽出 29 print(now_time) # ex."2017-07-05T17:01:06.112224" 30 wks.update_cell( 1, 1, date) # Google Spread Sheetに日付を書き込む 31 wks.update_cell( 1, 2, time) # Google Spread Sheetに時刻を書き込む 32 print(wks.acell('A1')) 33 print(wks.acell('B1')) 34 else: 35 pass 36
run.py
python
1# run.py 2# -*- coding: utf-8 3from slackbot.bot import Bot 4 5def main(): 6 bot = Bot() 7 bot.run() 8 9if __name__ == "__main__": 10 print('start miyamotosan') 11 main() 12
Slackへの投稿とGoogleSpreadSheetへの書き込みを紐づけたいのですが、どうも何を使えばいいのかわからず手詰まり感があります……
どうかよろしくお願いいたします。
回答1件
あなたの回答
tips
プレビュー