こんにちは。
AMDlabの松原です。
今日は先日話をしたSlackで、botを作る方法をご紹介しようと思います。
使う言語はruby。
そしてフレームワークとしてruby on railsを使用しました。
rubyはライブラリとして、gemというものを使えるのですが、
slackのAPIを操作するgem、slack-ruby-clientを使って、今回はbotを作って行きます。
1. botの登録
まずは、botをここで登録します。
「Add Configlation」より、Slackで表示させたいbotの名前を入力して「Add bot integration」をクリックすると、詳細な設定が行える画面に飛びます。
アイコンの設定や、botを使えるIPの制限なんかもここで設定できるようになっています。
ここの上部に表示されている「API Token」、これが、後で実装する上で必要になるので、ここでメモ。
2. channelへbotの招待
Slackを起動し、botを稼働させたいchannelから先ほど作ったbotを招待します。
こうしてやることで、botに閲覧権限と発言権が与えられるようです。
3. 実装
まず、Gemfileにgemを追加ですね。
gem 'slack-ruby-client'
次に、botのための設定のためのファイルをconfig/initializers/に保存。
slack_api.rbと名付けて以下のコードを記載します。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
require 'slack' Slack.configure do |config| config.token = ENV['BOT_TOKEN'] end Slack::Web::Client.config do |config| config.user_agent = 'Slack Ruby Client/1.0' end Slack::RealTime::Client.config do |config| config.start_method = :rtm_start end |
config.token = ENV[‘BOT_TOKEN’]の箇所ですが、環境変数にbot登録時に取得したAPI TokenをBOT_TOKENという変数名でサーバーに登録し、それを読み込ませるようにした記述です。
Settingsに書いた方がよかったかなと思ったり………
そして、実際に動かすファイルをどこに置くかは、用途や人によって違うと思いますが、僕はapp/batchというディレクトリにファイルを作って、クライアントを呼び出すメソッドを記載。
1 2 3 4 5 6 7 |
def web_client @web_client ||= Slack::Web::Client.new end def real_time_client @real_time_client ||= Slack::RealTime::Client.new end |
real_time_clientを用いることで、botが参加しているchannelのメッセージをポーリングできるようなので、特定のユーザーが呟いた瞬間に、スタンプを押すという嫌がらせを実行できるようにしてみました。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
TARGET_USER_ID = {ターゲットにしたいユーザーのID} def execute real_time_client.on :message do |message| if message.user == TARGET_USER_ID web_client.reactions_add(name: 'yasei_1', channel: message.channel, timestamp: message.ts) web_client.reactions_add(name: 'yasei_2', channel: message.channel, timestamp: message.ts) web_client.reactions_add(name: 'yasei_3', channel: message.channel, timestamp: message.ts) web_client.reactions_add(name: 'yasei_4', channel: message.channel, timestamp: message.ts) web_client.reactions_add(name: 'yasei_5', channel: message.channel, timestamp: message.ts) web_client.reactions_add(name: 'yasei_6', channel: message.channel, timestamp: message.ts) web_client.reactions_add(name: 'yasei_7', channel: message.channel, timestamp: message.ts) web_client.reactions_add(name: 'yasei_8', channel: message.channel, timestamp: message.ts) web_client.reactions_add(name: 'yasei_9', channel: message.channel, timestamp: message.ts) web_client.reactions_add(name: 'yasei_10', channel: message.channel, timestamp: message.ts end end real_time_client.start! end |
これをRakeタスクで実行。
これはちょっとしたいたずらをするための、記述なのですが、
実際には、messageの内容をDBに保存していき、その履歴と新しく来たメッセージを比較してそれに合ったスタンプ押してくというものを作りました。
ではでは、このへんで
COMMENTS