概要
Slack APIをシェルスクリプトから叩きます。
基本的にはGitHub APIから取得したデータを,SlackのWebhook URLにPOSTするだけです。
具体的にやったこと
自分の作ったBootstrapのForkテーマRinのダウンロード数を定期的にSlackに投げるスクリプトです。
ソースコード(修正版)
関数が含まれていると適切にcronで動作しないため,修正しています。
# !/bin/sh
# Global Params
HONOKA=0
RIN=0
text="HonokaのDL数は *`curl -s https://api.github.com/repos/windyakin/Honoka/releases | jq '[.[] | .assets[].download_count] | add'`*, RinのDL数は *`curl -s https://api.github.com/repos/raryosu/Rin/releases | jq '[.[] | .assets[].download_count] | add'`* にゃ>ω</ <https://docs.google.com/spreadsheets/d/hoge|集計シート>"
username="Rin"
icon_emoji=":rin:"
channel="#general"
curl -X POST --data-urlencode "payload={\"channel\": \"${channel}\", \"username\": \"${username}\", \"text\": \"${text}\", \"icon_emoji\": \"${icon_emoji}\"}" https://hooks.slack.com/services/T0D0GURC7/hoge/hogehoge
ソースコード(旧版)
# !/bin/sh
# Global Params
RIN=0 #Rinのダウンロード数
# Get download count from Github
# @param $1 userID
# @param $2 repoName
# @return all_download_count (https://api.github.com/repos/$1/$2/releases)
getResponse() {
curl -s https://api.github.com/repos/$1/$2/releases | jq '[.[] | .assets[].download_count] | add'
}
# Get Rin's download count
getDownloadCount() {
RIN=`getResponse "raryosu" "Rin"`
}
# Send message to slack
sendMessage() {
getDownloadCount
text="RinのDL数は *${RIN}* にゃ>ω</"
username="Rin"
icon_emoji=":rin:"
channel="#general"
curl -X POST --data-urlencode "payload={\"channel\": \"${channel}\", \"username\": \"${username}\", \"text\": \"${text}\", \"icon_emoji\": \"${icon_emoji}\"}" https://hooks.slack.com/services/XXXXXXXXX/XXXXXXXXXXXX/XXXXXXXXXXXXXXXXXXXXX
eval $curl
}
sendMessage
解説
getResponse()
GitHubのAPIからダウンロード数を取得します。
本当はこの関数ではAPIからのレスポンスだけを取得しようと思っていたのですが,面倒だったのでjq
でダウンロード数の総和を出しています。
引数1: GitHubユーザ名
引数2: リポジトリ名
getDownloadCount()
前述の理由から, getResponse()
関数にレスポンスを投げるだけの関数になりました…。
sendMessage()
Slack APIに投げるリクエストの生成及び実行を行っています。
username
変数には,メッセージを投げるユーザ名を指定します(Botなのでどんな名前でも構いません。もちろん日本語でも。)
icon_emoji
はそのユーザ名のemojiを指定します(任意)。
channel
にはメッセージを投げる先のチャンネルを指定します。
text
にはメッセージ本文を指定します。
その他
初シェルスクリプトなので,これでいいのか悪いのか…
あまりきれいなソースではないし,シェルスクリプトである必要ではないので,後日Rubyのスクリプトにでも書き直します。
cronとかで定期的に回せばとりあえずbotとして動作します。
改訂
- 2016.10.22
function
キーワードは ksh/bash/zsh 特有なため削除 & Github -> GitHub (Thanks @akinomyoga!) - 2016.10.23
sendMessage
関数の可読性を高める変更 - 2017.01.17 関数が含まれるとcrontabで適切に動作しないため,修正版を公開