Scalaで Twitter ストリーミングAPI

| # Comments | 1 Trackback
TwitterのストリーミングAPIをだらだらと取得するプログラムをScalaで作成してみました。

対象は statuses/sample としましたが、URLを変更するだけで他のAPIでも同様に取得できると思います。
XML文字列取得後の処理はハンドラで処理ができるようにしてありますので、画面に垂れ流すなり加工して遊ぶなりご自由にどうぞ。

ソース

class Streaming(id: String, pw: String) {

  import _root_.java.io.InputStream
  import _root_.java.net.{ Authenticator, PasswordAuthentication, URL }

  import _root_.scala.collection.mutable.ListBuffer
  import _root_.scala.io.Source

  import _root_.scala.actors.{ Actor, TIMEOUT }

  val url = new URL("http://stream.twitter.com/1/statuses/sample.xml?delimited=length")

  Authenticator.setDefault(new Authenticator {
    override def getPasswordAuthentication = {
      new PasswordAuthentication(id, pw.toCharArray)
    }
  })

  val handlers = ListBuffer[String => Unit]()

  private var in: InputStream = null

  def start {
    streaming.getState match {
      case Actor.State.New => {
        in = url.openStream
        streaming.start
      }
      case Actor.State.Terminated => throw new IllegalStateException("Streaming was closed.")
      case _ => throw new IllegalStateException("Streaming has already been started.")
    }
  }

  def close {
    try {
      streaming.getState match {
        case Actor.State.New => throw new IllegalStateException("Streaming has not been started yet.")
        case Actor.State.Terminated => throw new IllegalStateException("Streaming was closed.")
        case _ => {
          streaming !? CLOSE
        }
      }
    }
    finally {
      if(in != null) {
        in.close
        in = null
      }
    }
  }

  private case class CLOSE()

  private object streaming extends Actor {
    def act = {
      val source = Source.fromInputStream(in)

      def readState = {
        val length = source.getLine(1).replaceAll("\\s", "").toInt
        source.take(length) mkString
      }

      loop {
        receiveWithin(0) {
          case TIMEOUT => {
            val state = readState
            handlers foreach { handler => handler(state) }
          }
          case CLOSE => {
            reply()
            exit
          }
        }
      }
    }
  }

}

使い方

※ Twitterアカウントが必要です。

val twitter = new Streaming("userid", "password")
twitter.handlers += { xml => println(xml) } // ハンドラ { (String) => Unit } 設定
twitter.start

・・・

twitter.close

Streamingのコンストラクタには、TwitterのID/パスワードを指定してください。

トラックバック(1)

TwitterのStreaming APIを使ってツイートを収集し、様々な解析を... 続きを読む

comments powered by Disqus

Twitter Icon

AdSense

Creative Commons License
このブログはクリエイティブ・コモンズでライセンスされています。
Powered by Movable Type 5.14-ja

Google検索

カスタム検索

2013年10月

    1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31