Python Slack APIの使い方
Slackについては manapiさん のあたりで。
[amazonjs asin="4774173207″ locale="JP" title="Pythonエンジニア養成読本[いまどきの開発ノウハウ満載!] (Software Design plus)"]
Slackで用意されているAPIは豊富。
PythonのSDKも豊富に用意されている。
その中で今回はシンプルなSDKのように思えたSlacker を利用した。
Slack APIのTokenを取得する
ブラウザでSlackにアクセスした状態で ここの一番最後を見ると、「Create Token」ボタンがある。
「Create Token」ボタンをクリックすることで、Tokenが発行されるので、控えておく。
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]
実行すると、指定したチャンネルに投稿される。
後日、Bottleと組み合わせたツールの作り方をまとめる・・・?
ディスカッション
コメント一覧
slack_bot.pyファイルはどこに作成すればよいのでしょうか
実行したいディレクトリであれば、どこに作成しても良いかと思います。
例えば。
「/Users/saitenntaisei/Project/slack_bot.py」に設置したら、
実行時に
「python /Users/saitenntaisei/Project/slack_bot.py」
とすれば実行できます。
slackerライブラリはpipでインストールしているため、実行する分には特に
slack_boy.pyを設置する場所を気にする必要はありません。
有難うございます 分かりました
あれ。テストとととととだけですか。上に2つのbotをどう作ればいいでしょうか。
「上に2つのbot」とは、どのようなものでしょうか?
slack.post_message_to_channel(“general”, “テストととととと”)
という部分で投稿を行っています。
“テストととととと”の部分を書き換えることで、好きなワードを投稿することができます。
hatenablogからニュースを送ったbotですよ。そのbotの作り方を教えていただけませんか。
コメントが遅くなってしまい、すみません。
hatenablogではなく、hatena bookmarkでしょうか?
何をどうしたいのかを明確にしてコメントをいただければ、アドバイスできるかと思いますので、
今一度何をしたいかをコメントに残していただけませんでしょうか?
ピンバック & トラックバック一覧
[…] 実装の際にはチャンネルIDを取得するため、この記事にお世話になりました。 […]