質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Slack

Slackは、Tiny Speckという企業からリリースされたコミュニケーションツールです。GoogleDriveやGitHubなど、さまざまな外部サービスと連携することができます。

Q&A

解決済

1回答

4822閲覧

Slackbotで特定のメッセージに反応してGoogle Spread Sheetに時間を記録したい

ano_gasena

総合スコア12

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Slack

Slackは、Tiny Speckという企業からリリースされたコミュニケーションツールです。GoogleDriveやGitHubなど、さまざまな外部サービスと連携することができます。

0グッド

0クリップ

投稿2018/08/21 07:52

編集2018/08/21 08:46

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への書き込みを紐づけたいのですが、どうも何を使えばいいのかわからず手詰まり感があります……
どうかよろしくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

papinianus

2018/08/21 08:40 編集

現在できていることの確認ですが、"おはよう"などと書くと、スプレッドシートに書かれるのに"GSS確認して"という応答がなされないということで良いですか? ちなみに、"お先"に対して、"バイバイ~"の返答はありますか?
ano_gasena

2018/08/21 08:54 編集

【できること】 "おはよう"に対して、"おはよ〜!"を返す "お先"に対して"バイバイ〜"を返す スプレッドシート自体への書き込み 【できないこと】 メッセージに反応したスプレッドシートへの書き込み わかりにくい記述ですみません
guest

回答1

0

ベストアンサー

回答には至らないのですが、追記欄に書くには長いので。

write_toというデコレータを動作させるには、slackbotのライブラリのdispatcher.pyの_on_new_messageを修正する必要があるはずです。

ただ、ライブラリの作りからいって、参考になさった記事のように、@respond_toに結びつく関数で、必要な処理をしてから、message.replyをすれば目的の動作になると思います。

具体的には↓のここのところで、Datetime.taketime(message)とこれに必要なgsheetの処理を書く感じかと思います。

python

1@respond_to('おは|はよ|おっは|hello|hi|出勤|来た|きた') 2def mention_func(message): 3 #ここ 4 message.reply('おはよ〜!') # メンション

-- 余談
自分へのDMだと、誰からも見られることなく、かつどこからでも書き込めます。publicチャンネルでやっているのは、検証可能性という意味があるのだと思います。
単に通知がうざい点はミュートで対処可能なはず。

投稿2018/08/21 09:11

papinianus

総合スコア12705

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ano_gasena

2018/08/22 00:54

具体策ありがとうございます。おかげさまでなんとかできました! (bot.pyでデコレータを作らなくてもよかったのですね、作れてたわけではないみたいですが) >publicチャンネルでやっているのは、検証可能性という意味があるのだと思います。 みやもとさんで使用している発信Webhookはインテグレーション設定で対象チャンネルにDMを設定できなかったので、「それなら自作botでDM対応してみようか…?」という流れですね。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問