いっぺーちゃんの いろいろやってみよ~

Espruino on ESP32 で Twitter(その4)

前々回前回とtweetする方のプログラムだったので、今回はtweet内容を受信するプログラムを試してみます。

最初に注意事項です。あまりたくさんのtweetを一度に受信してしまうと、メモリ不足で落ちてしまいます。

 

ここでは、Streaming API の User streams を使用します。
User streams というのは、大雑把に言うと自分のタイムラインに流れてくるメッセージを監視するものです。
取得対象はその時点で流れてくるメッセージなので、過去にtweetされたメッセージは取得できません。

APIの詳細は User streams — Twitter Developers を参照してください。

 

それでは、以下のプログラムを実行してみましょう。

 

consumer_key    = '取得した Consumer key';
consumer_secret = '取得した Consumer secret';
access_token    = '取得した Access Token';
access_secret   = '取得した Access Token Secret';

if (typeof(ESP32) ==='function') {
    // platform is espruino on ESP32
    // Wi-Fi アクセスポイントへの接続
    var wifi = require('MyWifi');
}
if (typeof(E) ==='function') {
    // platform is espruino
    // set time zone  fixed to 'JST'
    E.setTimeZone(9);
}

// モジュール読み込み
var tiny_twitter = require("tiny_twitter");

// 初期化
var tw = new tiny_twitter(consumer_key, consumer_secret, access_token, access_secret, true);

tw.on("connect", function() {
    console.log("%%%% CONNECTED %%%%");
});
tw.on("response_header", function(data, code, msg) {
    if (code != 200) {
        console.log("%%%% RESPONSE ERROR!!!   " + code.toString() + " : " + msg);
    }
    console.log("%%%% RESPONSE_HEADER %%%%\n" + data + "\n%%%%%%%%%%%%%%%%%%%%%%%%%");
});
tw.on("data", function(data) {
    console.log("%%%% DATA %%%%");
    // console.log(JSON.stringify(data,  null, '\t'));
    if (data.text) {
        console.log(data.text);
    } else {
        console.log("** NO TEXT **");
    }
    console.log("%%%%%%%%%%%%%%%%%%%%%%%%%");
});
tw.on("end", function() {
    console.log("%%%% END %%%%");
});

// オプション指定
param = {"with":"user"};

// twitterに接続
tw.userstream(param);

 

初期化までと、接続時、ヘッダ受信時、切断時のイベントハンドラは前回と同じです。
データ受信時のイベントハンドラでは受信したメッセージ本体だけを表示するように変更してあります。
受信したデータ全部を表示したいときは、以下の部分を有効化してください。

 console.log(JSON.stringify(data,  null, '\t'));

 

あとは、オプションを指定してuserstreamを実行しています。
このプログラムは接続すると、サーバ側から切断されるか、リセットするまで接続を保持します。
このモジュールは簡易的な実装なので、能動的な接続の切断や再接続については考慮されていません。

 

プログラムを実行すると、以下のように表示されるでしょう。

%%%% CONNECTED %%%%
%%%% RESPONSE_HEADER %%%%
HTTP/1.1 200 OK
~中略~
%%%%%%%%%%%%%%%%%%%%%%%%%
%%%% DATA %%%%
** NO TEXT **
%%%%%%%%%%%%%%%%%%%%%%%%%

最初に「** NO TEXT **」と表示されるのは、friends list というのが送られてくるからです。フォローしている人の一覧のようです。

この状態で、ここで使用しているアカウントで、ブラウザやスマホからtweetしてみましょう。

%%%% DATA %%%%
hogehoge1
%%%%%%%%%%%%%%%%%%%%%%%%%

こんな表示が出ると思います。

え?こんな表示が出た?

%%%% DATA %%%%
dDc_・
%%%%%%%%%%%%%%%%%%%%%%%%%

それは、日本語をtweetしたからでしょう。
Espruinoは日本語に対応していないので、半角文字しか認識できません。
ちなみに、↑が出たときは「ついったー」とtweetしました。

 

オプション指定を以下のようにすると、自分のtweetとフォローしている人のtweetが取得できます。
(タイムラインの表示とほぼ同じ)

param = {"with":"followings"};

 

また、以下の指定では、自分のtweetすべてとキーワード"hogehoge"を含むtweet(フォローしている人以外も)が取得できます。

param = {"with":"user", "track":"hogehoge"};

trackに指定するキーワードは空白区切り、またはカンマ区切りで複数指定することができます。

空白区切り "track":"hogehoge fugafuga" hogehoge と fugafuga の両方を含む
カンマ区切り "track":"hogehoge,fugafuga" hogehoge か fugafuga のどちらか一方を含む

 

"track"に"test"のような一般的なキーワードを指定すると、たくさんのtweetが取得できてしまい、メモリ不足で落ちますので、注意してください。
複数のアカウントからのメッセージを取得したいような場合、ユニークなキーワードを含めてtweetするような運用にするのが良いでしょう。
また、キーワードには "#hoge" のように、ハッシュタグを指定することもできます。
しつこいようですが、Espeuinoは日本語に対応していないので、日本語のキーワードは指定できません。

 

「自分のtweet かつ、キーワード○○を含む」というような指定はできないようです。このような条件を実現するには、一旦自分のtweetをすべて取得して、
その中でメッセージに○○を含むかどうか確認するしか方法はないようです。



 

 

次回 に続く。。。