Python Slack APIの使い方

2015年6月4日

Slackについては manapiさん のあたりで。

[amazonjs asin="4774173207″ locale="JP" title="Pythonエンジニア養成読本[いまどきの開発ノウハウ満載!] (Software Design plus)"]

Slackで用意されているAPIは豊富。
PythonのSDKも豊富に用意されている。

その中で今回はシンプルなSDKのように思えたSlacker を利用した。

 

Slack APIのTokenを取得する

ブラウザでSlackにアクセスした状態で ここの一番最後を見ると、「Create Token」ボタンがある。

スクリーンショット 2015-05-25 23.14.02

「Create Token」ボタンをクリックすることで、Tokenが発行されるので、控えておく。

スクリーンショット 2015-05-25 23.14.17

 

 

Slackerのインストール

pipでインストールする。

[shell title="Slackerのインストール"]
pip install slacker
[/shell]

 

 

以降のサンプルコードはこちら

 

Slackクラスを作る

次のようにSlackerクラスを定義するslack_bot.pyファイルを作成する。

[python title="slack_bot.py"]
# -*- coding: utf-8 -*-
from slacker import Slacker

class Slack(object):

__slacker = None

def __init__(self, token):
self.__slacker = Slacker(token)

# このソースを直接実行した場合のみ実行される。
if __name__ == "__main__":

slack = Slack("上で取得したToken")

[/python]

見ての通り、上のslack_bot.pyを実行しても何も起こらない。

 

Slackクラスをチャンネル一覧を取得できるようにする

SlackクラスにSlackチーム内のチャンネル一覧を取得する get_channel_listメソッドを実装する。

[python title="slack_bot.py"]
# -*- coding: utf-8 -*-
from slacker import Slacker

class Slack(object):

__slacker = None

def __init__(self, token):

self.__slacker = Slacker(token)

def get_channnel_list(self):
"""
Slackチーム内のチャンネルID、チャンネル名一覧を取得する。
"""

# bodyで取得することで、[{チャンネル1},{チャンネル2},…,]の形式で取得できる。
raw_data = self.__slacker.channels.list().body

result = []
for data in raw_data["channels"]:
result.append(dict(channel_id=data["id"], channel_name=data["name"]))

return result

if __name__ == "__main__":

slack = Slack("上で取得したToken")

print(slack.get_channnel_list())
[/python]

実行すると、チャンネル一覧が取得できることがわかる。

[shell title="slack_bot.pyの実行結果"]
# python slack_bot.py
[{'channel_name’: 'general’, 'channel_id’: 'C04KS0VMA’}, {'channel_name’: 'hatebu’, 'channel_id’: 'C04PH0TL1’}, {'channel_name’: 'random’, 'channel_id’: 'C04KS0VMC’}]
[/shell]

 

Slackクラスの任意のチャンネルに投稿する

Slackクラスに、任意のチャンネルに投稿するpost_message_to_channelメソッドを実装する。

[python title="slack_bot.py"]
# -*- coding: utf-8 -*-
from slacker import Slacker

class Slack(object):

__slacker = None

def __init__(self, token):

self.__slacker = Slacker(token)

def get_channnel_list(self):
"""
Slackチーム内のチャンネルID、チャンネル名一覧を取得する。
"""

# bodyで取得することで、[{チャンネル1},{チャンネル2},…,]の形式で取得できる。
raw_data = self.__slacker.channels.list().body

result = []
for data in raw_data["channels"]:
result.append(dict(channel_id=data["id"], channel_name=data["name"]))

return result

def post_message_to_channel(self, channel, message):
"""
Slackチームの任意のチャンネルにメッセージを投稿する。
"""

channel_name = "#" + channel
self.__slacker.chat.post_message(channel_name, message)

if __name__ == "__main__":

slack = Slack("上で取得したToken")
slack.post_message_to_channel("general", "テストととととと")
[/python]

実行すると、指定したチャンネルに投稿される。

スクリーンショット 2015-05-26 0.13.56

 

後日、Bottleと組み合わせたツールの作り方をまとめる・・・?