カテゴリー
[Slack x 業務効率化] Slack APIを利用してCurlから画像をアップロードしてみた
※ 当ページには【広告/PR】を含む場合があります。
2020/09/17
2022/01/10

Slackの自分用チャンネルにデータ処理中の画像をポーンと自動送信してくれるシェルスクリプトを作成したかったのですが、ローカルにある画像を送るにはどうもWebhookではダメそうでした。
ローカルから画像ファイルをアップロードするにはSlackのAPIを適切に設定してから利用する必要があるらしいので、こちらを試してみます。
下準備 ~ Slack APIを使う前の設定手順
まずはAPIを新規作成し、tokenと呼ばれる認証情報を取得するまでの手順を説明します。
Slack APIの作成 ~ Tokenを取得
まずはSlack Apiの作成画面まで行きます。
Slackのいつもの画面からクリックして進むには以下のように4回くらい飛ばされればたどり着けます。

いつもどこにいけばいいのか迷うくらいなら、
まずは
[Create an App]
App Name
Workspace

アプリを新規作成すると以下のようなダッシュボード画面に移ります。

手始めにダッシュボードのメニューから認証設定を行うため、
[Feature] > [OAuth & Permissions]
最初にアプリの実行権限をスコープで設定していきます。
SlackのAPIダッシュボードのUIは結構な頻度で変わっているようです。
現在の2020年9月の段階では、
Bot Token Scopes
User Token Scopes

アプリの用途によってどちらのスコープを設定するかは分かれると思います。
今回はボットからアップロードしたいケースは
Bot Token Scopes
User Token Scopes
また、ボットから画像アップロードとちょっとしたコメントを送信という形を取りたいので、
Bot Token Scopes
chat:write
files:write

なおスコープの設定は複数選択可能です。
またスコープ設定後は自動で変更点を保存してくれます。
それではワークスペースにこのアプリをインストールしてみます。
ダッシュボードから
[Settings] > [Install App]
[Install App to Workspace]

後はワークスペースの管理者側がこのアプリを承認することでトークンを生成する仕組みです。

これで無事トークンが得られました。
このトークンは後で利用しますので、コピーしてどこかに控えておきましょう。
ちなみにワークスペースにインストールされたアプリは、ボットユーザーとして登録されているようです。

アプリをチャンネルに追加
今回のボットアプリを作成してそのままでは、どこにも投稿先のチャンネルが登録されていないため、利用できない状態です。
ということで、
既にあるチャンネルやパブリックチャンネルへも追加できるのですが、以下はプライベートチャンネルを新規作成して、アプリを追加する手順を模式的に描いています。

これで自分専用のチャンネルにボットが画像を投下してくれるような設定が完了しました。
シェルスクリプトの実装例
ここからは先程のチャンネルに画像が実際に送信されているかを見ていきたいと思います。
動作テスト
まずはcurlでテキストが送信されるかテストします。
公式の
curl側の事情で、-dオプションと-Fオプションは混在させて使うことが出来ないので、
-Fオプションを利用する場合は、
$ curl -XPOST \
-F "content=launch plan" \
-F channels="チャンネルの名前" \
-H "Authorization: Bearer xoxb-xxxxxxxxx-xxxx" \
https://slack.com/api/files.upload
もしくは-dオプションでやろうと思えば、
$ curl -XPOST \
-d "token=xoxb-xxxxxxxxx-xxxx&content=launch_plan&channels=チャンネルの名前" \
https://slack.com/api/files.upload
-Fオプションでは、-dオプションのようなクエリ文字列(
"hoge=hogehoge&piyo=piyopiyo"
よって、複数のパラメータを送る場合は
"-F 'hoge=hogehoge' -F 'piyo=piyopiyo'..."
-dオプションのほうが便利そうですが、
&
変換の手間を考えると-Fを使っても良いと思います。
いずれにせよ、どちらかの作法で送ることができます。
画像の送信
いよいよ画像の送信を試します。
公式の
これを参考にローカルの画像を上げてみます。
以下のようなスクリプトファイルを作成してみましょう。
#!/bin/sh
#APIのトークン
SLACK_API_TOKEN=xoxp-xxx-xx-xx-xxxx
#アップロードしたいファイルまでの絶対パス
filepath=/path/to/graph.png
#アプリを追加したチャンネルの名前
channels="チャンネルの名前"
curl -F "file=@${filepath}" -F channels="$channels" -H "Authorization: Bearer ${SLACK_API_TOKEN}" https://slack.com/api/files.upload
このスクリプトを実行してチャンネルに画像が投下されていたら成功です。

まとめ
ちょっとした画像ならば手軽にSlackに送り出すことが可能です。
他にも定点観測カメラの画像を一定間隔でSlackへ送信したりと、面白い応用が考えられます。
記事を書いた人
ナンデモ系エンジニア
主にAngularでフロントエンド開発することが多いです。 開発環境はLinuxメインで進めているので、シェルコマンドも多用しております。 コツコツとプログラミングするのが好きな人間です。
カテゴリー