vdeep

*

vdeepはプログラミング、IT、Web技術、ライフハックの事などなどを管理人okutaniがつぶやくブログです

シェルスクリプトでSlackに通知を送る方法

      2017/09/17

LINEで送る
Pocket


こんにちは、okutani(@okutani_t)です。気軽にSlackへ通知が送りたいとき、シェルスクリプトから通知を投げれたらいいなーと思い、いろいろ調べてみました。

ちなみに、PHPからSlackに通知を送る方法は過去に記事にしてます。PHPerはご参考までに。

シェルスクリプトでSlackに通知を送る方法
こんにちは、okutani(@okutani_t)です。気軽にSlackへ通知が送りたいとき、シェルスクリ...
2017-02-04 15:10
はてブ

動作確認等は、Mac上(OS Sierra)+zsh環境です。一応、さくらVPSで動かしてるCentOS7上でも動作確認してます。

では、シェルスクリプトからSlackに通知を送る方法について見ていきましょう。

スポンサーリンク

slackで通知用のチャンネルを作る

まずはslackで通知を受け取れるようにチャンネルを作成します。

「CHANNELS」のプラスマークからチャンネルを作成しておきます。

今回は「okutani-dev」という名前で作っておきました。ここは投げたい通知ごとに切り分けたりしてみてください。

Incoming WebHooksの設定

次に「Incoming WebHooks」を設定していきます。

PHPのときと違い、「投稿用のURLを取得&利用」することで、slackに通知を投げるといった方法です。

なので、URLが誰かに知られると「誰でも投稿できてしまう」というデメリットがあるので注意です(まぁKeyを使った方法でもKeyが漏れたら同じことですが)。

では、slackのチーム名をクリック → 「Apps & integrations」を選択。

検索に「Incoming WebHooks」と入力、選択。

「Add Configuration」をクリック。

通知を受け取るチャンネルを選択し(今回は#okutani-dev)、「Add Incoming WebHooks integration」をクリック。

これで通知用のURLが取得できました。メモしておきましょう。

その下に利用時の案内や、通知用のラベル、名前などが設定できるので一読してみてください(設定項目はスクリプト側からも決められます)。

では、通知用のシェルスクリプトを作成していきましょう。

シェルスクリプトの作成

シェルスクリプトを作成します。

今回は、「slack.sh」というファイルを以下の内容で作成しました。

#!/bin/bash

set -eu

# メッセージを一時保存する場所
MESSAGEFILE=$(mktemp -t webhooksXXXX)
# 終了時に削除
trap "rm ${MESSAGEFILE}" 0

# パイプの有無
if [ -p /dev/stdin ]; then
    # 改行コードを変換して格納
    cat - | tr '\n' '\\' | sed 's/\\/\\n/g' > ${MESSAGEFILE}
else
    echo "nothing stdin"
    exit 1
fi

# WebHookのURL
URL='WEBHOOKURLを記述'
# 送信先のチャンネル
CHANNEL=${CHANNEL:-'#okutani-dev'}
# botの名前
BOTNAME=${BOTNAME:-'okutani-bot'}
# 絵文字
EMOJI=${EMOJI:-':sushi:'}
# 見出し
HEAD=${HEAD:-"[見出し]\n"}

# メッセージをシンタックスハイライト付きで取得
MESSAGE='```'`cat ${MESSAGEFILE}`'```'

# json形式に整形
payload="payload={
    \"channel\": \"${CHANNEL}\",
    \"username\": \"${BOTNAME}\",
    \"icon_emoji\": \"${EMOJI}\",
    \"text\": \"${HEAD}${MESSAGE}\"
}"

# 送信
curl -s -S -X POST --data-urlencode "${payload}" ${URL} > /dev/null

コードの内容は上記コメントを参考に。あとこれとか。

参考シェルスクリプトを書くときはset -euしておく – Qiita

参考シェルスクリプトで一時ファイルを安全に扱う3つのコツ – Qiita

[見出し]のところはお好きな文字に置き換えて使ってください。

これで#okutani-devに対して、パイプで渡した文字列をslackに通知できるようになりました。

あ、使える絵文字は以下のサイトを参考にどうぞ。なんとなく「sushi」にしときました。

参考Emoji cheat sheet for GitHub, Basecamp and other services

では、実際に動かしてみましょう。

slackにメッセージを送信してみる

作成したシェルスクリプトを使ってメッセージを送ってみます。

なにはともあれ実行権限。

$ sudo chmod -x slack.sh

とりあえず、てきとうにメッセージを送ってみます。

$ echo "◯◯の処理が正常に完了したよ" | ./slack.sh

ちゃんと送信されたか確認。

ちゃんと送信されていることが確認できました!

以下なんかをいろいろ実行してみてもいいかと思います。

$ ls | ./slack.sh
とか
$ w | ./slack.sh

パイプで渡せる文字列ならなんでも飛ばせます。slack連携、なかなかなうでGoodです!

まとめ

このスクリプトをcronで登録して、定期的になにかをお知らせしてもいいですし、別で動いているスクリプトでこのslack.shを呼んであげれば、いろいろと連携できそうで便利ですね。

たとえば、「1日1回バックアップを取得するスクリプト」があるとき、その処理状況によって「完了」「エラー」などをslackに通知してあげると便利かと。

余談ですが、以前僕がちょっとだけ関わったプロジェクトでは、Web上でなにかしらの契約が取れたとき「契約が取れました!!!」と通知用のチャンネルに通知が飛ぶようになってました。

「モチベーションあがるなぁ」と関心したので、みなさんのサービスでも活用してみてください。

今回作成したシェルスクリプトはGitHubでも公開しています。

LINKshellscript-code/slack.sh at master · okutani-t/shellscript-code

slackをよく使う方の参考になれば幸いです。

LINEで送る
Pocket

okutani (okutani_t) のヒトコト
シェルスクリプトはちょっとでも記述ミスるとバグ見つけにくくて大変ですね。ちょっとしたことで1時間ぐらいはまったり(´;ω;`)

Web開発のお仕事を募集しています

フリーランスのエンジニアとして、Webシステム開発のお仕事依頼を随時募集しています(現在の業務量によってお受けできない場合もあります)。

Ruby on Rails」「JavaScript(jQuery, Reactなど)」「HTML + CSS」を用いたシステム開発、「Heroku」等を用いたサーバー構築・運用、「Git」や「GitHub」を利用したソーシャルコーディングなどに対応しています。

ご依頼を検討している方は、下記リンク本ブログからのお問い合わせ、もしくはokutaniのポートフォリオからご連絡ください。

LINKお問い合わせ

LINKokutani's Portfolio


 - ShellScript

スポンサーリンク

PC用AdSense

PC用AdSense

  こちらもどうぞ

vdeepのトップページへ戻る画像です。風船の形をした島を女の子が掴んでいます。