Retired Colourman

何度も朝がやってくる

DartでTwitterのStreaming APIに接続してみた

結果

出来た。

github.com

技術的な話

別にそこまで技術的な話があるのかと言われるとないです。

//接続部分
//OAuthで接続する(?)用のインスタンスを作成。鍵とかつくってる部分はコード読んで
var streamClient = new oauth.Client(oauthToken); 
//Streaming APIのエンドポイント
Uri uri = Uri.parse("https://userstream.twitter.com/1.1/user.json");
//リクエストを生成
var request = new http.Request("GET", uri);
//リクエストを送信。
var response = await streamClient.send(request); 
//来たレスポンスをStream<String>にしてる。
displaytweet(response.stream.toStringStream());

  
// ツイート表示部分
Future<String> displaytweet(Stream<String> tweets) async {
  await for (var tweet in tweets) {
    //ここでtryをやってるのは、JSONのデコードに失敗する可能性があるから。この辺もホントは適切な処理してあげなきゃいけない。
    try { 
      var map = JSON.decode(tweet);
      if (!map.containsKey("delete")) {
        print(map["user"]["name"] + " " + map["text"]);
      }
    } catch (e) {
      print(e);
    }
  }
  return "";
} 

はてなブログDartシンタックスハイライトにいい加減対応してくれ。頼む。

(今はjavascriptで代用)

Dartチームがつくってるパッケージでhttpっていうのがあって、それを利用したoauthっていうパッケージを使ってる。正直詳しく解説しても日本でDartかいている人が殆どいないので無駄な気がするし、気になる人はコードを読むかコメント欄で教えて下さい。

問題はいくつかあって、Streamで飛んでくるデータがかならずしもJson単位じゃない(途中で途切れててJSON.decodeするとエラーが吐かれる)から、その辺を上手くくっつけて渡してあげるプログラムを書いてあげなきゃいけないってこと。これはtwitter.dartをstreaming APIを対応させる時に書こうと思ってる。

ただ、ちゃんとTwitter Streaming API に接続できるとわかったのはよかった。時間があるときにちゃんとライブラリにも対応させようと思う。

(受験生なのになんでこんな記事書いてるんだろう)

9/26追記

Fix Stream Parse Program · sh4869/dart_twitter_stream_test@e11ff05 · GitHub

直せました。byteStreamで受け取った時に必ずしもJsonごととは限らないのが原因だったので、普通につなぎ合わせる工夫をすればよかったんだけど、こんなことにめっちゃ時間がかかってしまった。悲しい。まあ何はともあれ使えるようになったので、これでupdate_nameも作れるね、やったね。