Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
Help us understand the problem. What is going on with this article?

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

More than 1 year has passed since last update.

はじめに

とある理由(いずれ記事を書きます)で、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」を使用しています。見た目が綺麗に編集できるのが気に入ってます。

yaju
静岡県島田市在住ののシニアSE(元Microsoft MVP 2010-2012)がコンピューター、機械学習、Unity、数学について考える。
http://yaju3d.hatenablog.jp/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away