読者です 読者をやめる 読者になる 読者になる

exits

勉強記録

Slack APIで遊んでみた話(1) - Message buttonを表示してみた

技術 Slack Python

slack bot

これまでSlackでbot的なものはいくつか試していた.

  • hubot
  • Incoming WebHooks

hubotはCoffeeScriptがそこそこ辛かった. Incoming WebHooksはteam内で個数制限があるようなので少し使いづらい.

Slack APIでボタンや選択肢の機能が使えるらしい.
というわけで今回はSlack APIを使ってみた.

OAuth Tokenの作成

このOAuth Tokens for Testing and DevelopmentというページからTokenを作成することができる. ページタイトルにもあるように,テスト用のTokenであるようだ. Create tokenをポチる.

f:id:yue82:20160628034318p:plain

トークンを作成後にApp Directoryの右上からManageに進むと,アプリケーション一覧にSlack API Testerが現れている.

f:id:yue82:20160628032850p:plain

中を開くと,team内で他にSlack APIを使っているらしきメンバも表示されている. APIテスト用のアプリケーションという形を取っている様子.

メッセージのPOST

POSTしてみる. chat.postMessageを使うと良さそう.

# -*- coding: utf-8 -*-
import requests
from datetime import date


def make_month_prog_msg(work):
    grades = ['M1', 'M2', 'B4']
    month = date.today().month
    return '{}さん,{}の進捗どうですか?'.format(grades[month%3], work)


def post_progress_msg(work):
    post_url = 'https://slack.com/api/chat.postMessage'
    token = 'xoxp-XXXXXXXXXXX-XXXXXXXXXXX-XXXXXXXXXXX-XXXXXXXXXX'
    channel = 'your_channel'
    username = '進捗チェックさん'
    icon_emoji = ':checkered_flag:'

    text = make_month_prog_msg(work)
    payload = {
        'token': token,
        'channel': channel,
        'username': username,
        'icon_emoji': icon_emoji,
        'text': text
    }

    res = requests.post(post_url, data=payload)
    print res.status_code


if __name__ == '__main__':
    post_progress_msg('掃除')

結果はこのような感じ. やけにB4を責め立てる画像になってしまい申し訳ない.

f:id:yue82:20160628040730p:plain

usernameicon_emojiicon_urlを指定しない場合,デフォルトの状態で1番目の結果のようになる.
設定すると(上記コードの状態では)2番目の結果,payloadにas_userTrueとして加えると3番目の結果になる. 3番目のときに使われるユーザはTokenの持ち主のユーザである.

Message buttonsを使ってみた

もともとは今回Slackネタにしたのは,最近導入されたボタンを使ってみることが目的だった. ボタンについてのドキュメントはこちら.
Making messages more interactive with buttons

ボタンの設置のためには,attachmentというオプションを用いて投稿内容を作成する. ボタン等のオブジェクトを増やす場合は,actions内に要素を増やすようだ. valueなどの値は,現在のところは適当である.

変更点のみ. 最終的なのは次の記事?でちゃんと出します.

import json

    attachments = [{
        'fallback': text,
        'text': text,
        'callback_id': 'lab_clean',
        'color': '#EE2222',
        'attachment_type': 'default',
        'actions': [{
            'name': 'ok',
            'text': 'OK',
            'type': 'button',
            'value': 'ok'
        }]
    }]

    payload = {
        'token': token,
        'channel': channel,
        'username': username,
        'icon_emoji': icon_emoji,
        'attachments': json.dumps(attachments)
    }

結果はまたこんな感じ.今のところはボタンを押してもなんのアクションも起こせず,エラーが帰ってくる.

f:id:yue82:20160628042400p:plain

次記事ではドキュメントのトップのgifみたいなものを作りたい.

所感

1つ目の記事の中身の無さが気になり,中身のある話を書こうと気張っているうちに週末が終わってしまった. まだ気張ってる途中だが,ブログが週1目標であることと,試行錯誤の記録を残すためには記事を分けたほうがよさそうであるため,分けて書くことにした.

つづき書いた