Slackアカウントにシステム上から直接ファイルを送信したいという要望が上がったことはありませんか?そんな要望に応えたい場合にぜひ参考にしてください。

本ブログでは以前Slack Web APIとPHPのcURLを組み合わせてSlackアカウントに直接メッセージを送信する方法について説明を行いました。

今回は前回の設定を使ってSlackアカウントに直接ファイルを送信する方法について説明を行っています。

Slack Web APIの設定

Slack Web APIを利用してSlackに関する処理を行いたい場合、行いたい処理毎にアプリケーションのPersmissionからScopeを設定する必要があります。ファイルをアップロードしたい場合は、Scopeのfiles.writeを設定します。files.writeのScopeを設定することによりUpload, edit, and delete filesが行えるようになります。

Slack Web APIのアプリケーションのScopeの設定についてはhttps://api.slack.comにアクセスして行ってください。Scopeではアプリケーションが行える処理の範囲を制限することができません。
fukidashi

PHPプログラムの作成

Slackアカウントにディスク上に保存されているファイルを直接送信するコードは下記の通りです。



$headers = [
    'Authorization: Bearer xoxp-XXXXXXXXXXXXXXXXXXXXXX', //(1)
    'Content-Type: multipart/form-data'
];

$url = "https://slack.com/api/files.upload"; //(2)

$file = new CURLFile('/home/reffect/test.txt'); //(3)

$file_name = 'text.txt'

//(4)
$post_fields = [
    "channel" => "@XXXXXX",
    "title" => $text,
    "as_user" => true,
    "file"=> $file,
    "file_name"=> $file_name
];

$options = [
    CURLOPT_URL => $url,
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_HTTPHEADER => $headers,
    CURLOPT_POST => true,
    CURLOPT_POSTFIELDS => $post_fields 
];

$ch = curl_init();

curl_setopt_array($ch, $options);

$result = curl_exec($ch); 

curl_close($ch);

(1)~(4)の各項目について説明を行っていきます。

(1)については、Slack上でアプリケーションインストール後に表示されていたTokenを指定します。ここではXXXXXになっていますが、表示されていたTokenを入れてください。 それぞれの環境で異なる値です。

(2)ではSlack Web Apiから通して行いたい処理によって異なるURLを指定する必要があります。今回はファイルのアップロードに関係するfiles.writeを利用してしているのでURLはhttps://slack.com/api/files.uploadになります。

メッセージの送信したい場合のURLはhttps://slack.com/api/chat.postMessageです。
fukidashi

files.uplodで処理を行うために必要なURLや各種パラメータについてはすべてSlack apiの公式マニュアル https://api.slack.com/methods/files.upload に記載されています。

(3)ではcURLを利用してファイルをアップロードするためにCURLFileクラスを利用しています。CURLFileのパラメータにはファイルパスを設定します。例えばユーザのホームディレクトリ/home/reffect/の下にあるtest.txtファイルを送信したい場合は/home/reffect/test.txtとパスを設定してください。

もしLaravelを利用している場合はCURFileの前にスラッシュを入れるとCURLFileクラスが利用できます。
fukidashi

(4)ではchannelsで送信したいslackアカウントを指定しています。 channelはどこに送信するか設定する箇所で@+ユーザ名を入れるとユーザに直接ファイルを送信することができます。 channel名を設定するとチャネルにファイルが送信されます。titleにはSlackメッセージを設定しています。 as_userパラメーターはデフォルトではfalseに設定されており、trueに設定しなければ自分のアカウント(Slack Web APIでアプリケーションを作成したユーザ)ではなくbotからファイル送信になります。 $file_nameにはファイル名を設定します。

上記の設定でPHPファイルを実行すると指定したアカウントにファイルを送信することができるはずです。

その他の設定について

Content-Typeについて

ファイルをアップロードする場合はContent-Typeをmultipart/form-dataに設定してください。CURLOPT_POSTFIELDSは配列を指定してください。

設定が正しく行われていないとinvalid_form_dataのエラーが発生します。

ファイルのアップロードついて

エラーに <span classs=”orange”>no_file_data</span>が表示される場合はファイルの設定がうまく行われていないのでCURLFileを利用しているか確認してください。

PHPのバージョンによりCURLFileを利用せず、オプションにCURLOPT_SAFE_UPLOADを設定して@ファイルパスでファイルを送信しようとすると下記のPHPエラーが発生する場合があります。その場合はCURLFileを利用してください。

curl_setopt_array(): The usage of the @filename API for file uploading is deprecated. Please use the CURLFile class instead

contentについて

ファイルの送信がうまくいかない場合は下記のようにcontentに設定した値が正常に送信できるかまず確認してください。contentが送信できてfileが送信できない場合はファイルパスの指定等にミスがあるかもしれません。


$post_fields = [
    "channels" => $receipt,
    "content" => 'test',
    "title" => $text,
    "as_user" => true
];