ちょっとしたコードとか調査の途中経過などの結果を共有するときとかよくslackに投げたりすると思います
そんな時に、いちいち結果をコピーしてslackに投げるのって地味に面倒ですよね
いろいろ調査、コマンドライン上で結果をslackへ投稿!
簡単なコード書いた、コマンドライン上でコードをslackへ投稿!
といった感じになったら便利そうです
incommingwebhookではできないようなのですが、WEBAPIを使えばできるようです
早速TOKENを発行して試してみます
TOKENの発行に関してはここでは割愛します
ファイルを投稿
まずはサンプルに沿ってファイルを投稿してみます
- test.sh
#!/bin/bash echo "Hello!!"
curl -F file=@test.sh -F channels=#swfz -F token=${TOKEN} https://slack.com/api/files.upload
ファイルタイプなども指定できるようですが、自動で判断してくれるようなのでそれに頼っても大丈夫そうです

テキストを投稿
curl -F content="text" -F channels=#swfz -F token=${TOKEN} https://slack.com/api/files.upload
こんな感じでテキストも投稿できるようです
ここにコマンドの結果を渡せば自由度が増しそうですね
スクリプトから投稿
ということでスクリプトを書いてみました
- file2slack
#!/bin/bash
API_URL="https://slack.com/api/files.upload"
CHANNEL="#swfz"
# curl -F content="$(cat -)" -F channels=#swfz -F token=${TOKEN} ${API_URL}
# curl -F file=@${1} -F channels=#swfz -F token=${TOKEN} ${API_URL}
post2slack(){
echo ${FILE}
filetype=${SYNTAX:-text}
if [ -n "${FILE}" ]; then
curl -F file=@${FILE} -F title=${TITLE} -F channels=${CHANNEL} -F filetype=${filetype} -F token=${SLACK_WEB_API_TOKEN} ${API_URL}
else
curl -F content="$(cat -)" -F title=${TITLE} -F channels=${CHANNEL} -F filetype=${filetype} -F token=${SLACK_WEB_API_TOKEN} ${API_URL}
fi
}
_usage(){
cat << EOS
usage:
./file2slack.sh
environment SLACK_WEB_API_TOKEN is required.
prease set SLACK_WEB_API_TOKEN
export SLACK_WEB_API_TOKEN=*****
options)
-f : filename (if this option is not exist, to post the stdin.)
-c : post channel
-t : file title
-s : filetype syntax
EOS
exit 1
}
main(){
while getopts hc:f:t:u:s: opt
do
case ${opt} in
h)
_usage;;
c)
CHANNEL=${OPTARG};;
f)
FILE=${OPTARG};;
t)
TITLE=${OPTARG};;
s)
SYNTAX=${OPTARG};;
:|\?) _usage;;
esac
done
if [ "${SLACK_WEB_API_TOKEN}" == "" ]; then
echo 'not exist environment!!'
_usage
fi
post2slack
}
main $@
特に工夫ということもないですがファイル指定がない場合は標準入力$(cat -)から受け取ったテキストをslackへ投稿するようにしました
なので下記のような使い方ができるようになります
- コマンドの結果をslackへ投稿
ps | file2slack

cat test.json | jq '.' -r | file2slack

jqとかもテキストのみ(色なし)の出力にすれば特に問題なく投稿できます
色がついているとansiカラーコードがそのままテキストとして出力されてしまうので注意が必要です
echo 'commandline to slack sample' | grep --color=always to | file2slack

これで運用が少しはかどる?!
おわり