LoginSignup
4
2

More than 5 years have passed since last update.

Node-RED上にTwitterに画像ファイル付きでリプライする処理を作ってみた

Last updated at Posted at 2018-06-11

なんでこんなことをしたのか

とあるハッカソンで、あるTwitterのボットに、画像ファイルとつきでリプライする処理が必要になり、それが動いたので、まとめておこうとしています。

機能の分解

ここではやろうとした処理を整理しておきます。
必要だった機能は、以下になります。

・画像ファイルを添付して送れるREST APIを用意する
・リクエストに添付されている画像ファイルを変数に組み込み
・特定のTwitterボットにリプライの形でメッセージを送る

Node-Red上のコード

image.png

これを元に、各機能の詳細を見ていきましょう。

画像ファイルを添付して送れるREST APIを用意する

まずは、この部分です。
image.png

メソッドはPOSTにして、URLを任意のものを入れておしまいです。
こんな感じです。

image.png

リクエストに添付されている画像ファイルを変数に組み込み

次はこの部分です。
image.png

以下は、リクエストの中身から、画像ファイルを抽出し、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ボットにリプライの形でメッセージを送る

次はここの部分ですね。
image.png

msg.payloadにTwitterに返信するつもりで、@リプライしたいIDを入れてください。
メッセージの内容は任意ですが、IDとメッセージの間にスペースを空けておかないと、リプライしたい人のIDが間違うので、注意が必要です。

msg.payload = "@リプライしたいID" +  " メッセージの内容";
return msg;

テストするために

multiple/form-data形式で、任意の変数名で画像ファイルをアップロードしてください。

この後は・・・

本当は、この後の処理として、ボットに画像をリプライするとの、そのリプライとして画像を判定した結果をもらえます。しかし、Node-REDのtwitterがストリーム処理のため、欲しい結果だけを拾うことができないでいます。なので、暫定的にcloudantにストリームの結果を格納して、そこから取り出す処理をしてみましたが、いまいち美しくない書き方でした。
何か手をご存知の方がいらっしゃったら、REST APIの一連の処理で、リプライのリプライに対する結果を拾う方法を教えてください。

4
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
2