Edited at

Slackにファイルをアップロードする


はじめに

とある理由(いずれ記事を書きます)で、Slack にファイルをアップロードしようと思ったのですが、アップロードに関しては意外とやっている方が少なく苦労しました。

なんとか、画像をアップロードすることが出来たので、やり方をまとめておきます。

Web HookやCommandなら、以前に「SlackクローンのMattermostのWindows版を動かす」という記事で簡単なものを作成したことがあります。

この時、Slackに自分だけのチーム「YajuAlone」を作成しました。


アプリ作成

ファイルのアップロードをするにはfile.upload APIを使用するため、Slack Appを作成する必要があります。

参照:Slack API 推奨Tokenについて

ここにアクセスします。

https://api.slack.com/apps



  1. Create New App をクリックします。


  2. App Name でアプリケーション名を入力します。


  3. Development Slack Workspace でワークスペースを選択します。


  4. Create App をクリックします。


スコープ設定

Permissionsボタンをクリックします。

スコープ (Scopes) にはファイル書き込みのため files:write:user が必要です。

一覧からfiles:write:userを選択します。

またメッセージ投稿のため chat:write:user も付与しておきます。

一覧からchat:write:userを選択します。

Save Changesボタンをクリックして保存します。


Slackにアプリをインストール

Install App to Workspaceボタンをクリックします。

内容を確認したら、インストールボタンをクリックします。


Tokenをコピー

トークンが表示されるので、Copyボタンでクリップボードにコピーします。

このトークンを後で使用します。


アプリ動作確認

"Hello"がSlackに表示されるか、httpを直接叩いてみます。

下記コードのxoxp-xxx-xx-xx-xxxxの部分を、コピーしたトークンに書き換えてください。

https://slack.com/api/chat.postMessage?token=xoxp-xxx-xx-xx-xxxx&channel=general&text=%22Hello%22


実行結果

{"ok":true,"channel":"C4WVA6B5Z","ts":"1561862556.001000","message":{"bot_id":"BKP0Q999Q","type":"message","text":"\"Hello\"","user":"U4XMXT42J","ts":"1561862556.001000","team":"T4XMXT3SA"}}


ファイルアップロード動作確認


upload.php

<?php

$slacktoken = "xoxp-xxx-xx-xx-xxxx";
$channelId = 'general';

$header = array();
$header[] = 'Content-Type: multipart/form-data';
$file = new CurlFile(dirname(__FILE__)."/logo3D.jpg", 'image/jpg');

$postitems = array(
'token' => $slacktoken,
'channels' => $channelId,
'file' => $file,
'text' => "コミットしました",
'title' => "コミットしました",
'filename' => "logo3D.jpg"
);

$curl = curl_init();
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_FAILONERROR, true);
curl_setopt($curl, CURLOPT_HTTPHEADER, $header);
curl_setopt($curl, CURLOPT_URL, "https://slack.com/api/files.upload");
curl_setopt($curl, CURLOPT_POST, 1);
curl_setopt($curl, CURLOPT_POSTFIELDS,$postitems);

$body = curl_exec($curl);
$errno = curl_errno($curl);
$error = curl_error($curl);
curl_close($curl);

echo $body;
echo $errno;
echo $error;



参照


実行結果


嵌ったこと

最初、実行しても画像が表示されなかったんですよね。PHPは滅多に触らないのでエラー情報を出す方法も分かってなくて原因が分からず、次の休日になるまで放置してました。

files.uploadのExampleにて、Curlコマンドを実行すると画像が表示されました。

https://api.slack.com/methods/files.upload

curl -F file=@logo3D.jpg -F "initial_comment=logo" -F channels=general -H "Authorization: Bearer xoxp-xxx-xx-xx-xxxx" https://slack.com/api/files.upload

PHP側で問題がありそうです。

PHPのエラーを出せるように修正したら、下記のエラーが出ていました。

60: SSL certificate problem: unable to get local issuer certificate

https://curl.haxx.se/ca/cacert.pem から curl 用の証明書をダウンロードして、C:\xampp\php\extras\ssl フォルダに置きました。

そして、php.ini で修正して、Apacheを再起動します。


php.ini

[curl]

; A default value for the CURLOPT_CAINFO option. This is required to be an
; absolute path.
curl.cainfo = C:\xampp\php\extras\ssl\cacert.pem


最後に

Slackにファイルをアップロードする記事を書いてみたものの、自分がやろうとしていることでは使わないかも知れません。なので、今度のためですね。

スクリーンキャプチャにはフランスの会社Learnpulse SASが開発、提供するデスクトップ画面を画像、動画として保存する支援ツール「Screenpresso」を使用しています。見た目が綺麗に編集できるのが気に入ってます。