トーク bot に送信した画像をダウンロードする


普段使わない API シリーズ第二弾。
トーク BOT の コンテンツダウンロード API です。

前回の記事「LINEWORKS のコンテンツアップロード API を使う」と合わせると、別テナント同士でトーク bot を介して画像をやりとりすることができます。
お客様サポート用の bot とかだと、この機能は必要ですよね。

でもこれ、実はすんごい苦戦しました。
「わっかんないよっ!( ノД`)」と投げ出しかけましたが、先輩方の温かいアドバイスと、
前回「次はダウンロード API にするぞ!」と言ったことによるセルフ叱咤激励により、
ようやく完成しました!ヾ(´∀`)ノ

完成したコード

事前に fs モジュールと request モジュールはインストールしておきます。

> npm install fs
> npm install request

こちらが実際のコードです。

download.js
const fs = require('fs');
const request = require('request');
const options = {
    method: "GET",
    uri: "http://storage.worksmobile.com/openapi/message/download.api",
    encoding: null,
    headers: {
        "consumerKey": consumer_key,
        "Authorization": "Bearer " + token,
        "x-works-apiid": api_id,
        "x-works-resource-id": resourceId
    }
};
request(options, function (error, response, body) {
    if (error){
        console.log(error);
        return;
    }
    fs.writeFileSync('image.png', body, 'binary');
});

それでは、今回のハイライトをば。

request 時の encoding

これ、突き止めるのに苦労しました。。。みんな、当たり前に知ってることなのかな?

6行目の encoding: null
こうしておかないと、response で送られてくる画像データがわけのわからない文字化けデータになります。

encoding: null 指定しておくと binary データで送られてきます。

これは、通常 request モジュールは responsebody データを toString() に渡しているからです。
この時点でテキストデータとなり、utf-8 でエンコードされます。
画像は binary データで処理しますので encoding: null の設定をしておく必要があります。

request モジュールで画像を扱うときには必要な知識ですね!大変勉強になりました(´▽`)

writeFileSync 時に拡張子と binary の指定

ローカルのフォルダに保存する際には fs.writeFileSync を使いました。
ファイル名には拡張子をつけて明確に「PNG ファイルだよ!」と強調しておきます。
こちらも、encoding の指定をしておかないと既定値の utf-8 になるので binary を指定しておきます。

これで、トーク bot に送信した画像データを、あれやこれやすることができますよ!
やったね!(^^)/

おわりに

ここまでお付き合いいただきありがとうございました。

これ、本当に苦戦しました( ノД`)シクシク…
request での画像データの扱い方とか、binary の知識とか、色々と足らないものがわかった一件でした。
ここ一年近く GoogleAppsScript と node.js 使って、少しは慣れたかな?と思っていましたが、まだまだ知識不足ですね。もっと勉強しないと。

ではまた!(^^)/

参考にさせていただきましたm(_ _)m

LINEWORKS Developers
request (GitHub)
fs.writeFileSync (公式)

node.js でインターネット上の画像をダウンロード