はじめに
とある理由(いずれ記事を書きます)で、Slack にファイルをアップロードしようと思ったのですが、アップロードに関しては意外とやっている方が少なく苦労しました。
なんとか、画像をアップロードすることが出来たので、やり方をまとめておきます。
Web HookやCommandなら、以前に「SlackクローンのMattermostのWindows版を動かす」という記事で簡単なものを作成したことがあります。
この時、Slackに自分だけのチーム「YajuAlone」を作成しました。
アプリ作成
ファイルのアップロードをするにはfile.upload API
を使用するため、Slack Appを作成する必要があります。
参照:Slack API 推奨Tokenについて
ここにアクセスします。
https://api.slack.com/apps
-
Create New App
をクリックします。 -
App Name
でアプリケーション名を入力します。 -
Development Slack Workspace
でワークスペースを選択します。 -
Create App
をクリックします。
スコープ設定
スコープ (Scopes) にはファイル書き込みのため files:write:user
が必要です。
一覧からfiles:write:user
を選択します。
またメッセージ投稿のため chat:write:user
も付与しておきます。
一覧からchat:write:user
を選択します。
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"}}
ファイルアップロード動作確認
<?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 で Slack のチャンネルにファイルをアップロードする
- commitしたら写真を撮られてSlackにアップされるスクリプトを作った
- PHPの最後の終了タグ ?> は付けないでおこうねというお話
- Slack APIでファイルをアップロードする方法
- file file types
実行結果
嵌ったこと
最初、実行しても画像が表示されなかったんですよね。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
- ‘cURL error 60’エラーが出たときの対処法 ‘cURL error 60: SSL certificate problem: unable to get local issuer certificate’
- Windows で PHP の curl が証明書のエラーを出したら
https://curl.haxx.se/ca/cacert.pem から curl 用の証明書をダウンロードして、C:\xampp\php\extras\ssl
フォルダに置きました。
そして、php.ini で修正して、Apacheを再起動します。
[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」を使用しています。見た目が綺麗に編集できるのが気に入ってます。