notebook

都内でWEB系エンジニアやってます。

slack APIでコードスニペットを投稿する

ちょっとしたコードとか調査の途中経過などの結果を共有するときとかよくslackに投げたりすると思います

そんな時に、いちいち結果をコピーしてslackに投げるのって地味に面倒ですよね

いろいろ調査、コマンドライン上で結果をslackへ投稿!

簡単なコード書いた、コマンドライン上でコードをslackへ投稿!

といった感じになったら便利そうです

incommingwebhookではできないようなのですが、WEBAPIを使えばできるようです

files.upload method | Slack

api.slack.com

早速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

ファイルタイプなども指定できるようですが、自動で判断してくれるようなのでそれに頼っても大丈夫そうです

f:id:swfz:20161011004326p:plain

テキストを投稿

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

f:id:swfz:20161011004340p:plain

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

f:id:swfz:20161011004348p:plain

jqとかもテキストのみ(色なし)の出力にすれば特に問題なく投稿できます

色がついているとansiカラーコードがそのままテキストとして出力されてしまうので注意が必要です

echo 'commandline to slack sample' | grep --color=always to  | file2slack

f:id:swfz:20161011005516p:plain

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

おわり