PHP で Slack のチャンネルにファイルをアップロードする

PHP で Slack のチャンネルにファイルをアップロードする

とある Web サーバーから PHP を使って Slack にファイルをアップロードしたくなったのですが、意外とやっている方が少なかったのでいろいろ試しました。

環境

  • PHP 7.1.2 (on XServer)

API トークンの取得

トークンの取得は Slack API 推奨Tokenについて - Qiita を参考にさせていただきました。

OAuth Access Token をコピーしておきます。

upload files to slack channel by php 1

スコープ (Scopes) にはファイル書き込みのため files:write:user が必要です。必要であればメッセージ投稿のため chat:write:userchat:write:bot も付与しておきましょう。

upload files to slack channel by php 2

PHP スクリプト

<?php

$params = [
    'token' => 'xoxp-xxxxxxxxxxx-xxxxxxxxxxx-xxxxxxxxxxxx-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx',
    'channels' => '#hoge',
    'file' => new CURLFile('./hogehoge.zip'),
    'filename' => 'hogehoge.zip',
    'filetype' => 'zip',
    'initial_comment' => 'This is a hogehoge file.',
    'title' => 'HOGEHOGE',
];

$ch = curl_init();
// curl_setopt($ch, CURLOPT_VERBOSE, 1); // デバッグ出力
curl_setopt_array($ch, [
    CURLOPT_URL => 'https://slack.com/api/files.upload',
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_POST => true,
    CURLOPT_POSTFIELDS => $params,
]);

$response = curl_exec($ch);
curl_close($ch);

curl 系のメソッドを使うので PHP 5.5 以降が必要です。

multipart/form-data で送信するので CURLOPT_POSTFIELDS には普通の連想配列を渡します。

file パラメーターには new CURLFile('./hogehoge.zip') のような形で CURLFile を作って渡します。

参考

kenzauros