なんでこんなことをしたのか
とあるハッカソンで、あるTwitterのボットに、画像ファイルとつきでリプライする処理が必要になり、それが動いたので、まとめておこうとしています。
機能の分解
ここではやろうとした処理を整理しておきます。
必要だった機能は、以下になります。
・画像ファイルを添付して送れるREST APIを用意する
・リクエストに添付されている画像ファイルを変数に組み込み
・特定のTwitterボットにリプライの形でメッセージを送る
Node-Red上のコード
これを元に、各機能の詳細を見ていきましょう。
画像ファイルを添付して送れるREST APIを用意する
メソッドはPOSTにして、URLを任意のものを入れておしまいです。
こんな感じです。
リクエストに添付されている画像ファイルを変数に組み込み
以下は、リクエストの中身から、画像ファイルを抽出し、Twitterに画像を送るための変数に格納するコードです。ここではjpegのときの抽出の仕方になります。こちらのページを参考にし、Twitterと連携するようにコードを一部修正しています。
スマホで撮った写真をNode-REDにアップロードする
var buf = msg.req.body;
var SOI = new Buffer("FFD8","hex");
var EOI = new Buffer("FFD9","hex");
var iSOI = 0;
var file = "";
for (var i=0 ; i<=buf.length ; i++) {
if(SOI.equals(buf.slice(i,i+2))) {
iSOI = i;
}
if(EOI.equals(buf.slice(i,i+2))) {
file = buf.slice(iSOI,i+2);
break;
}
}
msg.media = file ;
return msg;
msg.mediaに添付画像を格納すればOKです。
以下に、その入れ方の記述があります。
https://flows.nodered.org/node/node-red-node-twitter
特定のTwitterボットにリプライの形でメッセージを送る
msg.payloadにTwitterに返信するつもりで、@リプライしたいIDを入れてください。
メッセージの内容は任意ですが、IDとメッセージの間にスペースを空けておかないと、リプライしたい人のIDが間違うので、注意が必要です。
msg.payload = "@リプライしたいID" + " メッセージの内容";
return msg;
テストするために
multiple/form-data形式で、任意の変数名で画像ファイルをアップロードしてください。
この後は・・・
本当は、この後の処理として、ボットに画像をリプライするとの、そのリプライとして画像を判定した結果をもらえます。しかし、Node-REDのtwitterがストリーム処理のため、欲しい結果だけを拾うことができないでいます。なので、暫定的にcloudantにストリームの結果を格納して、そこから取り出す処理をしてみましたが、いまいち美しくない書き方でした。
何か手をご存知の方がいらっしゃったら、REST APIの一連の処理で、リプライのリプライに対する結果を拾う方法を教えてください。