PythonでSlackbotを作る(4)

現在、弊社でもSlackを試験的に利用しているのですが、RTM APIを使えばローカルでもbotが作成できることを知ったのでPythonで作ってみようという記事です。
今回はついに最終回です。

応用編として、最後に実践的な(?)機能を実装してみましょう。

Slack使っていてちょっと面倒くさいケース

SlackだけではなくFacebookやLINEもそうなのですが、絵文字やスタンプが使えるのは文字を打たなくて便利なのですが、
11_slack

こんな感じでリアクションに統一が取れてないと「これはどっちなんだろう?」と悩ましい場合がでてきますよね。最初から質問投稿にリアクションで選択肢が提示されていれば迷いにくいと思いませんか?

実は世の中には同じことを考えている人が既にいて、Slack Appとして公開されています。

Simple Poll | Slack

しかし、このアプリを利用するにはIntegrationを一つ消費してしまいますし、何よりも外部のサーバに投稿を一旦フックされるので、内容次第では使うのが躊躇われるケースが出てくるかと思います。ということで、今回はBotに指定書式でメンションを送ると投票可能な投稿を生成して送信してくれる「アンケート投稿コマンド」機能を実装してみましょう。

アンケート投稿コマンド

$ cd bossan/
$ vi plugin/bossan_poll.py
# -*- coding: utf-8 -*-
from slackbot.bot import respond_to
import csv

EMOJIS = (
    'one',
    'two',
    'three',
    'four',
    'five',
)


@respond_to('poll (.*)')
def poll(message, params):
    args = [row for row in csv.reader([params], delimiter=' ')][0]
    if len(args) < 3:
        message.reply('使用方法: poll タイトル 質問 [質問 ...]')
        return

    title = args.pop(0)
    options = []
    for i, o in enumerate(args):
        options.append('* :{}: {}'.format(EMOJIS[i], o))

    # ref https://github.com/lins05/slackbot/issues/43
    send_user = message.channel._client.users[message.body['user']][u'name']
    post = {
        'pretext': '{}さんからアンケートがあります。'.format(send_user),
        'title': title,
        'author_name': send_user,
        'text': '\n'.join(options),
        'color': 'good'
    }

    ret = message._client.webapi.chat.post_message(
        message._body['channel'],
        '',
        username=message._client.login_data['self']['name'],
        as_user=True,
        attachments=[post]
    )
    ts = ret.body['ts']

    for i, _ in enumerate(options):
        message._client.webapi.reactions.add(
            name=EMOJIS[i],
            channel=message._body['channel'],
            timestamp=ts
        )

respond_toデコレータで特定のキーワード「poll 引数」を含むメンションを受けるとコマンドが実行されるイメージです。処理としては投票メッセージをAttachment形式で生成して送信、送信した投稿に対してリアクションを付与しているだけなのですが、現時点のSlackbotライブラリでは以下の問題があります。

  • Bot自身の投稿に対してリアクションを付けることができない
  • Bot自身の投稿のタイムスタンプが取得できない

そのため、今回のサンプルではメッセージの投稿とリアクションを付ける部分は、Slackbotライブラリの提供メソッドを利用せずに内部で保持しているSlackerのインスタンスを直接操作して処理を行なっています。

$ python3 run.py

12_slack

このようにメンションとして指定書式でコマンドを送ればリアクションで投票可能なアンケートとして投稿されます(リアクションはBotがつけているのでデフォルトで+1状態となります)。

13_slack

ただのリアクション付き投稿ですので、このように選択肢外のリアクションを付けられてしまう場合もありますが、回答がリアクションに統一されるだけでもスッキリするのではないでしょうか。

ということで、全4回に分けてPythonによるSlackbot作成の記事をお送りしましたがいかがでしたでしょうか? Pythonを使ったのはあくまで筆者の趣味ですが、RTM APIを用いたBot作成や今回のアンケート機能の実装は別の言語でも容易に可能だと思いますので皆さんどんどん社内用のBotを作ってみてはいかがでしょうか?

2 Comments

  1. はじめまして。botを作ろうとしている大学生です。
    非常に分りやすい記事ありがとうございます。
    もし宜しければ、全体のソースコードを見せて頂いてよろしいでしょうか?

  2. コメントありがとうございます。アンケート投稿コマンドのソース自体はこれが全部で、記憶によればこれでBotとして動作したはずです(記憶によると…)。その他はlins05/slackbotのインストールとAPIキーの設定だけで動くかと思います。実装今回の記事は全4回になっているので最初から順番に試していくと、ソースコードや動きが把握できるかと思いますので色々試してみて素敵なBotを作成してくださいね。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

*