Slackで定期的にRubotyに仕事をさせる

ChatOpsの一環としてSlackにRubotyを常駐させているのだが、Rubotyに定期的にタスクを実行させたいことがあった。
最初はruby-cronを使ってみたのだが、Slackだとうまく動かなかった。
具体的にはジョブの登録はできるのだがジョブの実行(通知)がされない。

うまくいかなかったのでSlackのリマインダー機能を使ってみることにした。
Slackのリマインダー機能を使うと Reminder: と言うプレフィックスが入るのでRubotyが反応せず、こちらもうまくいかなかった。

最終的にはcronでスクリプトを定期実行させることにした。
Slackに通知するスクリプトを作って、それをcronで定期的に実行させる。
メッセージを拾ったRubotyがタスクを実行するといった感じだ。

サンプルコード

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
require "faraday"

username = 'your name'
channel = 'your channel'
slack_token = 'your slack token'
icon_url = 'your icon url'

body = {
username: username,
channel: channel,
icon_url: icon_url,
text: "ruboty ping"
}

Faraday.new('https://slack.com') do |c|
c.request :url_encoded
c.adapter Faraday.default_adapter
end.post("/api/chat.postMessage?token=#{slack_token}", body)

これでRubotyに定期的に仕事をさせることができるようになった。