twitter streaming API への接続

その昔、twitter が Jabber プロトコルをサポートしていたことを覚えている人は何人いるだろうか?(笑)

どうもぼかぁ最新データをとるのにいちいちポーリングするのってのが全般的に好きではなくて twitter も Jabber 復活を心待ちにしていたのですが、果たしていつの日だったかストリーミング API として戻ってきたのでした。 良かった 🙂

というわけで、API 公開からずいぶんずいぶん経ってしまいましたが、何となく思い立って Groovy からつないでみました。

Java には twitter4j というとてもよくサポートされたtwitter ライブラリがありますので、まずはこちらを利用させていただきます!

Twitter4J – A Java library for the Twitter API

Twitter4J は Twitter API の Java ラッパです。 Twitter4J を使うと JSON や HTTP に詳しくなくても容易に Twitter とインタラクトするアプリケーションを書くことが出来ます。

さて、まず twitter につなぐのに面倒なのが oAuth 。。 とりあえず動作確認したいだけなのにアプリの登録とかしなければならなくあれですが、しょうがないのでしますです。

Twitter / アプリケーションを登録

ここでOAuthを使ったアプリケーションを登録することができます。OAuthは新しい外部アプリケーションの認証システムです。

アプリの登録をすると、consumerKey と consumerSecret がもらえますのでメモして、以下の Groovy ソースに入れて実行してみます。

import twitter4j.*
 
def oAuthConsumer = "入れる"
def oAuthConsumerSecret = "入れる"
 
def twitter = new TwitterFactory().getInstance()
twitter.setOAuthConsumer(oAuthConsumer, oAuthConsumerSecret)
 
def requestToken = twitter.getOAuthRequestToken()
def accessToken = ""
 
println "ブラウザで以下の URL にアクセスして表示された PIN コードを入力してください。"
println " ${requestToken.getAuthorizationURL()}"
System.in.withReader {
    print "PIN コード: "
    accessToken = twitter.getOAuthAccessToken(requestToken, it.readLine())
}
 
println "access.token=${accessToken.getToken()}"
println "access.token.secret=${accessToken.getTokenSecret()}"

実行すると URL がでてきますので、ブラウザにコピって入力して先ほど登録したアプリケーションからのアクセスを自分の twitter アカウントに対して許可してあげます。 そうすると PIN コードでてくるので、こっちのアプリに入力してあげると、今度はアクセストークンが2つもらえます。

コンシューマキー 2 つと、アクセストークン 2 つが揃ったらいよいよアプリをかきます。

ここではストリーミング API を使ってリアルタイムに自分のタイムラインをひろってみます。

import twitter4j.*
import twitter4j.conf.*
 
def consumer = "入れる"
def consumer_secret = "入れる"
def access_token = "入れる"
def access_token_secret = "入れる"
 
def builder = new ConfigurationBuilder()
builder.setOAuthConsumerKey(consumer)
builder.setOAuthConsumerSecret(consumer_secret)
builder.setOAuthAccessToken(access_token)
builder.setOAuthAccessTokenSecret(access_token_secret)
 
def config = builder.build()
def twitter = new TwitterFactory(config).getInstance()
def stream =
    new TwitterStreamFactory(config).getInstance(twitter.getOAuthAccessToken())
 
stream.addListener(new UserStreamAdapter() {
    @Override
    public void onStatus(Status status) {
        def user = status.getUser().getScreenName()
        def text = status.getText()
        println "@${user} ${text}"
    }
})
 
println "Start streaming..."
stream.user()
 
System.in.withReader {
    while((line = it.readLine()) && (line=line.trim()));
}
 
println "Stop streaming and cleanup..."
stream.cleanUp()

じゃんじゃんじゃん。 エンター押すと終了です。

ソケットつなぎっぱなしになりますのでリアルタイムにタイムラインが表示されると思います。 Web より速くでるときもあるみたいですね。 😀

これでたとえば、Ubuntu とかだと notify-send で簡単に画面に通知出せますので、画像ファイル取得とかちょこちょこつけると・・・

stream01

あっという間に通知クライアントのできあがり。 よい。

てなわけで oAuth はちょっと面倒ですが、それ以外は twitter4j と Groovy のおかげでとてもお手軽。 クライアントつくってみてはどうでしょう。

そういえば、オープンソースの twitter クライアントって、コンシューマーキーはどうしているんだろう・・・。

う。

twitter streaming API への接続」への2件のフィードバック

  1. そういえば、オープンソースの twitter クライアントって、コンシューマーキーはどうしているんだろう・・・。

    WordPress のプラグインだと WordTwit とかは、コンシューマKeyをソースに埋め込んでますね。
    僕の SimpleTweet は、コンシューマKeyの取得はユーザにやってもらってます。
    その辺の理由は、過去にエントリしてるよ。
    http://dogmap.jp/2010/02/16/twitter-oauth/

  2. どもっす! エントリ拝見しておりました〜 🙂
    やっぱり埋め込むとあれですよね。 Linux にもいくつかオープンソースクライアントありますので、ちょいとみてみます!

コメントを残す