PaPeRo i からSlackにメッセージを送信する

 PaPeRo i からSlackへのメッセージ送信は簡単にできます。

準備1 Slackワークスペースの作成

新たにワークスペースを作成して試す場合、
(1) https://slack.comの「無料で試してみる」クリック
(2)「Slackワークスペースを作成する」クリック
(3) メールアドレス入力
(4) メール受信した確認コードを入力
で作成できます。

準備2 Appの作成と設定

(1) https://api.slack.com/apps で「Create New App」しワークスペースを指定
(2) 作成したAppのBasic Informationページで「Incoming Webhooks」クリック
(3)「Activate Incoming Webhooks」をonへ
(4)「Add New Webhook to Workspace」クリック
(5) 「XXXAppがXXXXワークスペースにアクセスする権限をリクエストしています」で投稿先チャネルを選択し「許可する」クリック
(6) Incoming Webhooksの「Webhook URLs for Your Workspace」の一覧に追加されたWebhook URLを「Copy」
(7) curlで送信テスト
パペロ本体からだと-kオプションが必要です。

# curl -k -X POST -H 'Content-type: application/json' --data '{"text":"Hello, World!"}' WebhookURL

準備3 slackwebのインストール

Pythonから簡単にslackメッセージ送信できるslackwebパッケージを使用します。

# pip3 install slackweb

デモアプリ

 PaPeRo i の座布団左右のボタンでメッセージを選択し、真ん中ボタンでメッセージ送信するアプリを作ってみました。pypaperoのラッパークラスstpypaperoを使用しています。

slacksendapp.py

import sys
from logging import (getLogger, Formatter, debug, info, warn, error, critical,
                     DEBUG, INFO, WARN, ERROR, CRITICAL, basicConfig)

import slackweb

import pypapero
from stpypapero import StPyPapero

logger = getLogger(__name__)

SLACK_WEBHOOK_URL = 'https://hooks.slack.com/services/XXXXXXXXXXX/XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'

MID_DETECT_BUTTON = 'detectButton'
MID_EOS = '_endOfSpeech'
BTN_RIGHT = 'L'  # 向かって右ボタン
BTN_LEFT = 'R'   # 向かって左ボタン
BTN_MID = 'C'    # 真ん中ボタン
KEY_STATUS = 'Status'
MSGS = [
    '助けて',
    '起きました',
    '薬飲みました',
    'ごはん食べました',
    '寝ます',
]
SPEECH_LR = '{}、て送るなら真ん中のボタンを押してね'
SPEECH_MID = '{}、て送るならもう一度真ん中のボタンを押してね'
SPEECH_SEND = '{}、て送りました'


class SlackApp(StPyPapero):
    # パペロアプリメインクラス
    def initialize(self):
        self.sel_idx = 0
        self.selected = None
        self.speeching = False
        self.slack = slackweb.Slack(url=SLACK_WEBHOOK_URL)
        self.trans_state(self.in_init)

    def in_init(self, name, msg):
        # 初期状態イベント処理
        if name == 'Ready':
            logger.info('name: {}'.format(name))
            #self.trans_state(self.in_idle)
            self.speech('こんにちは。真ん中のボタンでメッセージを送るよ。左右のボタンでメッセージを選べるよ')
            self.speeching = True
            self.trans_state(self.in_idle)

    def in_idle(self, name, msg):
        # アイドル状態イベント処理
        logger.debug('name={}'.format(name))
        if name == MID_DETECT_BUTTON:
            if self.speeching:
                self.papero.send_stop_speech()
            val = msg.get(KEY_STATUS)
            logger.info('{}:{}'.format(name, val))
            if  val == BTN_LEFT:  # 向かって左
                # 選択変更(-1)
                self.sel_idx -= 1
            elif val == BTN_RIGHT:  # 向かって右
                # 選択変更(+1)
                self.sel_idx += 1
            elif val == BTN_MID:  # 真ん中ボタン
                txt = self.selected
                if txt is not None:
                    # 選択済みなら送信実行
                    logger.info('send to slack')
                    self.slack.notify(text=txt)
                    self.selected = None
                    self.sel_idx = 0
                    self.speech(SPEECH_SEND.format(txt))
                    self.speeching = True
                    return
            # 選択したメッセージを発話
            txt = MSGS[self.sel_idx % len(MSGS)]
            self.selected = txt
            if val == BTN_MID:
                txt = SPEECH_MID.format(txt)
            else:
                txt = SPEECH_LR.format(txt)
            logger.info('speech pre message')
            self.speech(txt)
            self.speeching = True
        elif name == MID_EOS:
            self.speeching = False
        else:
            logger.debug('#' + name)


def main():
    simid, name, url = pypapero.get_params_from_commandline(sys.argv)
    app = SlackApp(url=url, simid=simid, simname=name)
    app.run()


if __name__ == '__main__':
    loglevel = INFO
    LOG_FMT = '%(asctime)s %(levelname)s %(thread)d.%(name)s.%(funcName)s %(message)s'
    basicConfig(level=loglevel, format=LOG_FMT)
    main()

このアプリはパペロ本体でもラズパイなど外部ホストどちらでも実行できます。
実行コマンドはPaPeRo i のIPアドレスが例えば192.168.1.1であれば

# python3 slacksendapp.py -wssvr ws://192.168.1.1:8088/papero

シミュレータを使用する場合は

# python3 slacksendapp.py -sim シミュレータID

としてください。

こちらからソースコードをダウンロードできます。


0