読者です 読者をやめる 読者になる 読者になる

望月いちろうのREADME.md

書き溜めておいた技術記事や旅行記のバックアップです。

Slack APIでファイルをアップロードする方法

f:id:mochizuki_p:20160924214028p:plain

files.upload

Slackにファイルをアップロードすることができます。画像や動画、ソースコードなどを扱うことができ、プレビューでファイルの中身を確認することができます。Slackの優れた機能の1つで特にソースコードの形式を指定すると自動でハイライトが行われるのは非常に便利な機能です。

アクセスポイント

https://slack.com/api/files.upload

利用にはfiles.uploadが利用出来る権限(スコープ)を持ったアクセストークンが必要です。詳しくはこちらで

mochizuki4.hatenablog.com

パラメーター

引数 必須か? 説明
token  事前に取得したアクセストークン、OAuthで取得するのが安全 
filename 投稿を行うチャンネル(グループ)を指定する。
file multipart/form-data形式でアップロードするファイルを指定する。contentを選択しなかった場合はこちらが必要になる。
content POSTのパラメーターとしてファイルをアップロードする。fileを選択しなかった場合はこちらを選択する。
filetype × 拡張子を指定することでソースコードのプレビューができます。
title × ファイルのタイトル名
initial_comment × ファイルに追加する最初のコメント
channels × アップロードと同時に特定のチャンネルに投稿するにはこちらでチャンネルIDを指定する

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

content

リクエストのクエリとしてデータをアップロードする。性質上大きなサイズのデータには向いていないです。

リクエストの例:

https://slack.com/api/files.upload?token=xoxp-60496348391-60507000562-83549927078-85e3d438144524acaba938494acdff6c5a&content=Hello&filename=tets&channels=C1SEX00P4&pretty=1

file

リクエストのURLとは別にデータの本体を送信することができます。つまりmultipart/form-data形式ファイルをアップロードします。

特に理由がない限りこの形式を利用すべきでしょう。

https://slack.com/api/files.upload?token=xoxp-60496348391-60507000562-83549927078-85e3d438144524acaba938494acdff6c5a&filetype=scala&filename=tets&channels=C1SEX00P4&pretty=1

filetype

ファイル形式を指定することでソースコードのプレビューが可能です。指定しなかった場合はプレーンテキストとして扱われます。画像データはjpg,png,gif形式での動作を確認しています。アニメーションgifも動作しました。

f:id:mochizuki_p:20161007174931p:plain

対応しているソースコードの形式は以下の通りです。なおマイナーな言語は除いてあります。

指定するための値 形式
auto 自動推論
text テキストファイル
c C言語
csharp C#
cpp C++
css CSS
csv CSV
coffeescript CoffeeScript
dockerfile Docker
erlang Erlang
fortran Fortran
go Go
html HTML
haskell Haskell
java Java
javascript JavaScriptとJSON
latex LaTeX
lisp Lisp
lua Lua
markdown Markdown(変換しない)
matlab MATLAB
ocaml OCaml
objc Objective-C
php PHP
perl Perl
python Python
r R言語
ruby Ruby
sql SQL
sass Sass
scala Scala
shell シェルスクリプト
swift Swift
vb VB.NET
vbscript VBScript
xml XML
yaml YAML

f:id:mochizuki_p:20161007174915p:plain

channel

コンマ区切りでファイルをシェアしたいチャンネルを選択します。この値を指定しない場合はファイルがSlackのサーバーにアップロードされただけの状態になるので注意してください。

title,initial_comment

titleに"タイトル"、initial_commentに"Best"を指定した場合はこのように表示されます。titleはファイルの概要を説明するのに使用されます。

f:id:mochizuki_p:20161007175036p:plain

リクエストへのリスポンス

リクエストの返り値についてアップロードされたデータについての詳細がJSON形式で帰ってきます。

{

    "ok": true,
    "file": {
        "id": "F2L815XHR",
        "created": 1475775105,
        "timestamp": 1475775105,
        "name": "scala",
        "title": "Scala",
        "mimetype": "text/plain",
        "filetype": "scala",
        "pretty_type": "Scala",
        "user": "U1SEX00GJ",
        "editable": true,
        "size": 5033,
        "mode": "snippet",
        "is_external": false,
        "external_type": "",
        "is_public": true,
        "public_url_shared": false,
        "display_as_bot": false,
        "username": "",
        "url_private": "https://files.slack.com/files-pri/T1SELA8BH-F2L815XHR/scala",
        "url_private_download": "https://files.slack.com/files-pri/T1SELA8BH-F2L815XHR/download/scala",
        "permalink": "https://example.slack.com/files/user_one/F2L815XHR/scala",
        "permalink_public": "https://slack-files.com/T1SELA8BH-F2L815XHR-6e8331f942",
        "edit_link": "https://example.slack.com/files/user_one/F2L815XHR/scala/edit",
        "preview": "package com.twitter.finagle.zipkin.thrift\n\nimport com.twitter.conversions.time._\nimport com.twitter.finagle.service.TimeoutFilter\nimport com.twitter.finagle.stats.NullStatsReceiver",
        "preview_highlight": "<div class=\"CodeMirror cm-s-default CodeMirrorServer\" oncopy=\"if(event.clipboardData){event.clipboardData.setData('text/plain',window.getSelection().toString().replace(/\\u200b/g,''));event.preventDefault();event.stopPropagation();}\">\n<div class=\"CodeMirror-code\">\n<div><pre><span class=\"cm-keyword\">package</span> <span class=\"cm-def\">com</span>.<span class=\"cm-variable\">twitter</span>.<span class=\"cm-variable\">finagle</span>.<span class=\"cm-variable\">zipkin</span>.<span class=\"cm-variable\">thrift</span></pre></div>\n<div><pre>&#8203;</pre></div>\n<div><pre><span class=\"cm-keyword\">import</span> <span class=\"cm-variable\">com</span>.<span class=\"cm-variable\">twitter</span>.<span class=\"cm-variable\">conversions</span>.<span class=\"cm-variable\">time</span>.<span class=\"cm-keyword\">_</span></pre></div>\n<div><pre><span class=\"cm-keyword\">import</span> <span class=\"cm-variable\">com</span>.<span class=\"cm-variable\">twitter</span>.<span class=\"cm-variable\">finagle</span>.<span class=\"cm-variable\">service</span>.<span class=\"cm-variable\">TimeoutFilter</span></pre></div>\n<div><pre><span class=\"cm-keyword\">import</span> <span class=\"cm-variable\">com</span>.<span class=\"cm-variable\">twitter</span>.<span class=\"cm-variable\">finagle</span>.<span class=\"cm-variable\">stats</span>.<span class=\"cm-variable\">NullStatsReceiver</span></pre></div>\n</div>\n</div>\n",
        "lines": 109,
        "lines_more": 104,
        "preview_is_truncated": true,
        "channels": [
            "C1SEX00P4"
        ],
        "groups": [],
        "ims": [],
        "comments_count": 1,
        "initial_comment": {
            "id": "Fc2L9DUTDJ",
            "created": 1475775105,
            "timestamp": 1475775105,
            "user": "U1SEX00GJ",
            "is_intro": true,
            "comment": "コメント",
            "channel": ""
        }
    }
}

リスポンスの値について

重要な部分のみ解説します。

url_private

チームに参加しているユーザーに限りデータ本体にアクセスできます。

permalink_public

公開設定をした場合はチーム外のユーザーからもアップロードされているファイルをこのURLからアクセスできます。

permalink

チームに参加しているユーザーに限りデータにアクセスできます。 このデータに対してコメントを残すことができます。

url_private_download"

チームに参加しているユーザーに限りデータをダウンロードできます。

edit_link

このURLからデータをアップロードしたユーザーに限りデータを変更することができます。

実際にコマンドラインからアップロードするには

こちらを参考にしてください

mochizuki4.hatenablog.com