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をすべて取得して、
その中でメッセージに○○を含むかどうか確認するしか方法はないようです。
次回 に続く。。。