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

micropython on ESP32 でTwitter(その3)

今回はtweet内容を受信するプログラムを試してみます。
Espruino on ESP32 で Twitter(その4) のmicropython版です。

あまりたくさんのtweetを一度に受信してしまうと、メモリ不足で落ちてしまいます。
それを防ぐため、1つのtweetのデータが大きすぎる場合は、そのデータを破棄します。現在は16kByte以上のデータは破棄するように設定してあります(もっと小さい方が良いかも)。
(引用ツイートのリツイートで色々ユーザ情報が付加されているとデータが大きくなることがあります。サーバ側でフィルタをかけられれば良いのですが。。。)
また、不完全なデータ(一部が抜け落ちている等)が送られてきた場合は、その後のtweetを含めて破棄されることがあります。
(データの終わりが見つからないので、↑の大データリミットに引っかかって破棄されます。このとき、後続のデータも含めて破棄されます。データの先頭や最後をうまく見つける方法があれば良いのですが。。。)

以下のプログラムをコンソールでコピペ実行するか、pyboard.pyで実行します。
twitterに接続したあと、データ受信待ちになります。
以下の設定の場合、自分がtweetするか、「てすとつぃーと」を含むtweetがあった場合、データを表示します。

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

import sys
platform = sys.platform
# platform :    ESP32 => 'esp32'
#               Linux => 'linux'

from tiny_twitter import tiny_twitter
import ujson as json

if platform == 'esp32' :
    # ESP32のときは時刻合わせする
    import ntptime
    import utime
    utime.set_time(ntptime.time())

# データ受信時のコールバック関数
def CallbackFunc(jsn) :
    # print("#### " + json.dumps(jsn))
    print("--------\n" + jsn.get("text", "NO_DATA") + "\n--------")

# 初期化
tw = tiny_twitter(consumer_key, consumer_secret, access_token, access_secret, CallbackFunc, debug=True)


# twitterに接続
param = {"with":"user", "track":"てすとつぃーと"};
tw.userstream(param);

 

ほとんど前回と同じなので、違う部分だけ説明。

コールバック関数は、基本的に前回と同じですが、今回はtweet内容だけ表示するようにしてあります。

日本語を正常に表示するには、コンソールの日本語モードをUTF-8に設定しておく必要があります。
が、それ以外の言語(韓国語やアラビア語など)が送られてくるとコンソールによっては正常に表示されません。

def CallbackFunc(jsn) :
    # print("#### " + json.dumps(jsn))
    print("--------\n" + jsn.get("text", "NO_DATA") + "\n--------")

たとえば、こんな感じでlangプロパティが"ja"(日本語)か"en"(英語)のときだけ表示するという処理にすると
日本語と英語のtweetのみを表示できるようになります。

def CallbackFunc(jsn) :
    lang = jsn.get("lang", "UNKNOWN")
    text = jsn.get("text", "NO_DATA")
    if lang == "ja" or lang == "en" :
        print("-------- lang: " + lang)
        print(text)
        print("--------")

しかし、langプロパティはサーバ側でtweet内容から判断して付加している情報ですので、完璧ではありません。
たまに韓国語や中国語が混じっている場合があります。
また、日本語や英語であっても絵文字は表示できません。

 

twitterに接続します。
paramに設定できるパラメータは GET user — Twitter DevelopersStreaming API request parameters — Twitter Developers を参照してください。

"language":"en,ja"を追加すれば、↑のようにcallbackで振り分けなくても英語と日本語だけ取得になるような気がします(試してないけど)。

正常に接続されれば、接続されたまま、データを受信するたびにコールバック関数が呼び出されます。
ソケット通信がブロッキング動作のため、tiny_twitter.userstream()はエラーが発生して接続がcloseされるまで戻ってきません。

param = {"with":"user", "track":"てすとつぃーと"};
tw.userstream(param);

 

次回に続く。。。