2016年12月1日木曜日

田胡・柴田研究室AdventCalendar2016開始だ~

この記事は,田胡・柴田研究室アドベントカレンダー2016 1日目の記事です. (いつまで研究室名この表記にすれば良いのか分からない.) 初日は田胡研の便利屋ことすかいが書いていきます. 皆さん研究室のSlackは利用してますか? 2回目回ってきそうだし初日は軽いネタでSlackBotの作り方を紹介します. 大体調べて出て来るのはHubotを使った作り方ですが各言語ライブラリがあるのでそれを利用すれば簡単なBotならすぐに作ることが出来ます. [Slack Platform: Community | Slack](https://api.slack.com/community) 今回はPythonを利用してオウム返しをするBotを作ってみます. ## アカウント作成 まずアカウントを作ります. Slackチームのメニューから「App&Integration」から https://tagoken.slack.com/apps/ に移動して右上の「Manage」から「Custom Integrations」に移動します. 「Bots」を選択してBotの管理画面に入ったら「Add Configuration」を選んでBotを追加します. 最初の画面でアカウント名を入力します. 分かりやすいものにしましょう. 次の画面にAPI Tokenが表示されてるのでメモします. これを使ってAPIを利用することが出来ます. ## ライブラリのインストール 必要なライブラリをインストールします. ```bash $ pip install slackclient ``` ちなみに2系と3系が混在してる環境でpipとかpip3とかで混乱する人は ```bash $ python -m pip install slackclient $ python3 -m pip install slackclient ``` とか覚えておくと混乱しなくて済むよ そもそもpyenvとか使おうって話ではあるけど ### メッセージの受信 SlackのRTM(RealTimeMessage)を利用するコードがこんな感じです. ```python # -*- coding: utf-8 -*- import time from slackclient import SlackClient # slack_token = "APIキー" slack_token = os.environ["SLACK_API_TOKEN"] sc = SlackClient(slack_token) if sc.rtm_connect(): while True: print(sc.rtm_read()) time.sleep(1) else: print("APIToken間違ってるよ!") ``` コード内にAPIキー書くのは宜しくないので環境変数とかに書きましょう. 実行すると色々情報が流れてくると思います. 実際に作ったBotに「はろー」とダイレクトメッセージを投げるとそのメッセージが流れてくるのが見えます. ```json {'text': 'はろー', 'type': 'message', 'ts': '1480599172.000004', 'channel': 'QWERTYU', 'team': 'ZXCVBN', 'user': 'ASDFGHJ'} ``` 終了する時は「Ctrl+C」で処理を終了させます. ### メッセージの送信 メッセージの送信にはapi_callメソッドを使用します. これを利用することで簡単にWebAPIを利用することが出来ます. こんな感じで呼べます. ```python sc.api_call( "chat.postMessage", channel="チャンネル", text="送るメッセージ", ) ``` これを利用して先程のコードにオウム返しの機能を追加します. ```python # -*- coding: utf-8 -*- import time from slackclient import SlackClient slack_token = os.environ["SLACK_API_TOKEN"] sc = SlackClient(slack_token) if sc.rtm_connect(): while True: msgs = sc.rtm_read() for msg in msgs: # イベントがmessageの時だけ if msg["type"] == "message": if "subtype" in msg: # 自分のメッセージには反応しないように if msg["subtype"] == "bot_message" continue # メッセージの編集には反応しないように elif msg["subtype"] == "message_changed": continue sc.api_call( "chat.postMessage", channel=msg["channel"], text=msg["text"], ) time.sleep(1) else: print("APIToken間違ってるよ!") ``` 実行してBotにメッセージを送ると返事が帰ってきたら成功です. ## まとめ あとは良い感じに自分で機能を作り込んであげれば素敵なBotが作れます. こんなの作ったよ!って人いたら教えてください.どっかで動かしておきましょう. おわり ## 次の人 明日の記事はこれ書くこと決まった時に隣に座ってたfhorusにお願いします.

0 件のコメント:

コメントを投稿