[Raspberry Pi] シェルスクリプトで Slack に投稿する

VPS 上の CentOS で hubot による Slack bot を作ったことを書いた。

CentOS + hubot で Slack に指定時刻に自動発言する – with a Christian Wife
https://wacw.cf/2018/02/11/auto-posting-on-slack-with-hubot-and-centos/

その後 hubot の調子が悪くなり、bot が動かなくなった。原因がよく分からないので、CentOS のインストールからやり直してもいいけど、VPS にお金を払うぐらいなら Raspberry Pi で Slack bot を作ることにした。やっているのは、指定時刻に投稿するだけの単純な bot だからね。

簡単に導入できて cron で実行できるものがいいと考えて、探してみたところ、シェルスクリプトで Slack へ投稿することにした。

参考にしたのは以下のページだが、紹介されているコードそのままでは動かないので変更した。

Lumue.github.io by lumue
http://lumue.github.io/2015/06/01/posting-to-slack-from-shell.html

(1)以下のページで Slack の Incoming Webhook 用 Webhook URL を取得する。

https://slack.com/services/new/incoming-webhook

後で分かることだが、ここで指定するチャンネル以外にも投稿できるので、適当なチャンネルを指定しておけばいい(いちいちチャンネルごとの Webhook URL を作成しなくていい)。

(2)たとえば、PostToSlack.sh とでも名前を付けた以下のようなシェルスクリプトを作成する。

 1#!/bin/bash
 2url="https://hooks.slack.com/[1の Webhook URL]"
 3
 4#コマンドライン用パラメーター
 5channel=$1
 6message=$2
 7username=MyBot
 8
 9#assemble json payload
10jsonstring="payload={\"channel\":\"$channel\",\"username\":\"$username\",\"text\":\"$message\",\"icon_emoji\":\":smile:\"}"
11
12#call curl
13curl -X POST --data-urlencode $jsonstring $url

(3)2のシェルスクリプトに実行権限を与える。

$ sudo chmod 735 PostToSlack.sh

(4)試しに投稿してみよう。第1パラメーターがチャンネル名、第2パラメーターが投稿の文章だ。

$ ./PostToSlack.sh general test

これで Slack に送信されるはずだ。

なお、Mac の Terminal で日本語を使うには、「Terminal > Preferences > Profiles >Advanced > Input > Escape non-ASCII input with Control-V」にチェックを入れる必要がある。これでチャンネル名や投稿文章に日本語を使える。

既知の問題:
・スクリプト内の username(bot の名前)は日本語にもできる。ただし、空白を入れることはできない(My bot のようにできない)。回避策は見つけれていない。
・アイコンが指定したものが反映されないことがある(Slack API デフォルトのものになってしまう)。
・投稿文章に空白を入れられない(go out のように)。引用符でくくったりしてみたが変化なし。

(5)cron に登録するには以下のようにする。毎日 10 時に投稿する場合__

0 10 * * * ./PostToSlack.sh general 10時だよ。

cron に日本語を使う方法については前回書いた。

Raspberry Pi で cron に外部ファイルを読み込ませる – with a Christian Wife
https://wacw.cf/2018/03/03/importing-external-file-to-cron-on-pi/