31
22

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

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

Last updated at Posted at 2019-06-30

はじめに

とある理由(いずれ記事を書きます)で、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 をクリックします。

2019-06-30_10h53_45.png

スコープ設定

Permissionsボタンをクリックします。
2019-06-30_10h58_21.png

スコープ (Scopes) にはファイル書き込みのため files:write:user が必要です。
一覧からfiles:write:userを選択します。
2019-06-30_11h05_04.png

またメッセージ投稿のため chat:write:user も付与しておきます。
一覧からchat:write:userを選択します。
2019-06-30_11h06_43.png

Save Changesボタンをクリックして保存します。
2019-06-30_11h11_37.png

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

Install App to Workspaceボタンをクリックします。
2019-06-30_11h22_33.png

内容を確認したら、インストールボタンをクリックします。
2019-06-30_11h31_11.png

Tokenをコピー

トークンが表示されるので、Copyボタンでクリップボードにコピーします。
このトークンを後で使用します。
2019-06-30_11h38_52.png

アプリ動作確認

"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"}}

SlackAppResult.png

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

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;

参照

実行結果

SlackAppResult2.png

嵌ったこと

最初、実行しても画像が表示されなかったんですよね。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」を使用しています。見た目が綺麗に編集できるのが気に入ってます。

31
22
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
31
22

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?