Node.jsを使ってChatworkに画像をアップロードをする


動機

ChatworkAPIで画像をアップロードしたいときにcurlを使えばサクッとできますが、Node.jsで使いたい場合のケースもあると思います。
ただ、検索してみるとPythonとChatworkAPIの説明は有志ある方があるけれども、Node.jsとChatworkAPIを使っての画像アップロードの方法についての説明が中々ない・・・
という思いをきっかけに書いてみました。

(´-`).。oO(頑張ってアップロードできるコードを書いてみよう・・・)

コードを書く前に確認

  • request, fsを使うため、npmにてインストールされていること

サンプルコード

/**
 * chatworkにAPI経由で画像をアップロードするテスト(Node.js)
 */
var con = require('./const.js');
var req = require('request');
var fs  = require('fs');

var formData = {
    'file' : {
        'value'   : fs.createReadStream('./hogehoge.png'), // アップロードしたいファイルを指定してください
        'options' : {
            'filename'     : 'hogehoge.png', // ファイル名は任意でどうぞ
            'Content-Type' : 'image/png'     // 画像ファイルに合わせて変更してください
        }
    },
    'message'        : 'hogehogeをnode.js使って送るよ!' // 一緒に送信したいメッセージはこちらに。なければ省略可。
};

var options = {
    'url'      : 'https://api.chatwork.com/v2/rooms/' + con.room_id + '/files',
    'formData' : formData,
    'headers'  : {
        'X-ChatWorkToken' : con.token_id,
        'Content-Type'    : 'multipart/form-data'
    }
};

req.post(options, function (error, response, body) {
   console.log(body);  // 送信後の処理はこちら
});

※room_idとtoken_idは別のjsにmodule.exportsで記載しています

解説

ChatworkAPIリファレンスにあるリクエストボディイメージ(例)ですが、
このフォーム部分の準備をformData変数で行っています。

--------------------------f295b94a5560e2eb
Content-Disposition: form-data; name="file"; filename="hogehoge.png"
Content-Type: image/png
abc012....binarydata....789de
...
--------------------------f295b94a5560e2eb
Content-Disposition: form-data; name="message"
hogehogeをnode.js使って送るよ!
--------------------------f295b94a5560e2eb--

実行した後のチャット画面

以下のようになります。
やった、、、あがった!ε-(´∀`*)ホッ

最後に

例外処理とか色々実装する必要がありますが、ひとまずアップロードするという目標達成のために割愛させて頂いてます。。。
送信ユーザーを別にするなどはまたどこかの機会で。

下記サイト様の内容を参考させて頂きましたm(_ _)m