報國挺身日記 このページをアンテナに追加 RSSフィード

2010/04/02

[][] DispatchでOAuth 20:46

Twitter APIのBASIC認証は2010年6月に「廃止予定」というのが気になっている。

今、Scalaの本を読んで勉強しているので、Scalaで何か書いてみたい。

Twitter APIについては、これまでJavaで Twitter4Jを使用してプログラムを書いていた。Scalaの場合でもTwitter4Jを使えば良いのだが、それだとScalaの勉強にはならないと思って、Scala用のOAuthライブラリを探してみた。

その結果、Dispatchというものしか見つけられなかったので、これを使ってstatus更新処理を書いてみると、以下のようになった。(出力されるAuthorize URLにアクセスして、そこから表示されるPINを入力する)

import dispatch._
import oauth._
import oauth.OAuth._

object TwitterTest {
  import Http._

  val CONSUMER_KEY    = "XXX...."
  val CONSUMER_SECRET = "XXX...."
  val CONSUMER = Consumer(CONSUMER_KEY, CONSUMER_SECRET)

  def main(args: Array[String]) {
    val http = fix(new Http)

    val req_token = http(Auth.request_token(CONSUMER))
    println(req_token)
    val authorize_url = Auth.authorize_url(req_token)
    println("Authorize URL: " + authorize_url.to_uri)
    print("PIN: ")
    var PIN = readLine

    val (access_token: Token, user_id: String, screen_name: String)
      = http(Auth.access_token(CONSUMER, req_token, PIN))
    println(access_token)
    println("ACCESS_TOKEN value: "  + access_token.value)
    println("ACCESS_TOKEN secret: " + access_token.secret)
    println("user_id: "     + user_id)
    println("screen_name: " + screen_name)

    val status = "更新テスト#1です。"
    val res = http(Status.update(status, CONSUMER, access_token))
    println(res)
  }

  def fix(http: Http): Http = {
    // WARNING 
    // Invalid cookie header: "Set-Cookie: .....
    // .... Unable to parse expires attribute: ....
    import org.apache.http.cookie.params.CookieSpecPNames

    http.client.getParams().
        setParameter(CookieSpecPNames.DATE_PATTERNS,
            java.util.Arrays.asList("EEE, dd MMM-yyyy-HH:mm:ss z",
                                    "EEE, dd MMM yyyy HH:mm:ss z"))
    http
  }
}

import json._
import JsHttp._

object Twitter {
  val host = :/("twitter.com")
}

object Auth {
  val svc = Twitter.host / "oauth"

  def request_token(consumer: Consumer): Handler[Token]
    = request_token(consumer, OAuth.oob)

  def request_token(consumer: Consumer, callback_url: String) = 
    svc.secure / "request_token" << OAuth.callback(callback_url) <@ consumer as_token
    
  def authorize_url(token: Token)    = svc / "authorize" <<? token
  def authenticate_url(token: Token) = svc / "authenticate" <<? token
  
  def access_token(consumer: Consumer, token: Token, verifier: String) = 
    svc.secure.POST / "access_token" <@ (consumer, token, verifier) >% { m =>
      (Token(m).get, m("user_id"), m("screen_name"))
    }
}

object Status extends Request(Twitter.host / "statuses") {
  def update(status: String, consumer: Consumer, token: Token) = 
        new UpdateStatusBuilder(status, consumer, token)

  class UpdateStatusBuilder(status: String, consumer: Consumer, token: Token) 
          extends Builder[Handler[JsObject]] {
    def product = Status / "update.json" << Map("status" -> status) <@
                    (consumer, token) ># obj
  }
}

fix()の処理は省いても動作するが、警告が表示されるので追加しておいた。

Dispatchの使い方自体がよくわからないので苦労したが、型情報を頼りに試行錯誤した結果、とにかく動いた。

2010/02/21

[] タイムライン情報 15:02

タイムラインを取得するTwitter API

//twitter.com/statuses/home_timeline.json

で各statusを取得していると、”contributors”という見慣れない項目があることに気付いた。

何の意味かわからなかったが、「Twitter Contributorsは企業の参入に拍車をかけるか?」 のための項目らしい。一個のアカウントを複数人で使うため。user情報にも"contributors_enabled"という項目が追加されている。

それにしてもタイムラインを取得するAPIで、各status(tweet)ごとにuser情報が丸ごと埋め込まれて返されるのは、無駄が多過ぎる。APIの呼び出し回数を減らすためと、複数のtweetの間にユーザ情報が変更された場合に対応するためだと思うが、ユーザのアイコンやtime zoneが変更されたとしても大した問題ではないだろう。

現時点でユーザ情報の属性は、最新statusに関するものを除いて28個ある。このうちタイムラインの表示などで必要になる可能性があるのは、id, screen_name, name, profile_image_url, urlぐらいではないか? profile_link_color等は全く必要ない。

2010/01/20

[] Twitterユーザー調査 23:45

2010年1月 最新Twitterユーザー調査

この調査の対象ユーザは、

なお,この調査は,HubSpot社の前述ツール"Twitter Grader"で収集した約500万Twitterユーザーアカウント,600万Tweetを元に分析した結果である。

という説明からすると、Twitter Graderでアカウント名を入力したユーザだけが対象ということだろうか。そうであれば、follower数がある程度以上のユーザでなければ影響力を調べようとも思わない筈なので、ユーザ全体からは偏った対象になっている。

Twitterのユーザを無作為に抽出する方法というのはあるのだろうか?

地域限定でもよければ、"Tokyo"というキーワードでユーザ検索して、さらに現在地が"Tokyo"のユーザだけ対象にするというという方法が考えられる。しかし、この方法でも、現在地を入力しているユーザだけという意味で少し偏っている。

2009/12/06

[] 意外と面白い 14:21

将来、iPhoneアプリにTwitter連携機能を組み込むかもしれないと思って、少し前にアカウントを作った。人の発言を眺めているだけだが、それでも結構面白い。自分が何もしなくても、色々な話題が勝手にやってくるという感じ。

適当に政治家五人をfollowしてみたら、その中の三人からfollowされた。これは予想外。このアカウントをプログラムのテスト用に使うのは、まずいかもしれない。