概要

昔使っていたTwitter4jを再度使おうと思ったけど、何年も経った多少変化もあったようなので使い方を調べる。

@CretedDate 2016/07/30
@Versions Twitte4J 4.0.4

開発環境構築

sbtではなくTypesafe activatorを利用する。下記からmini-packageをダウンロード。

https://www.lightbend.com/activator/download

解凍した中に入っているbin/activatorを叩いて新規プロジェクトを作成。

$ bin/activator new

Browse the list of templates: http://lightbend.com/activator/templates
Choose from these featured templates or enter a template name:
  1) minimal-akka-java-seed
  2) minimal-akka-scala-seed
  3) minimal-java
  4) minimal-scala
  5) play-java
  6) play-scala

> 4 ← minimal-scalaを選択

Enter a name for your application (just press enter for 'minimal-scala')

> twitter4j-example ← プロジェクト名を入力

$ cd twitter4j-example

eclipseを使うので、project/plugins.sbt (新規作成)に下記を記述。

addSbtPlugin("com.typesafe.sbteclipse" % "sbteclipse-plugin" % "4.0.0")

build.sbtをtwitter4jを呼べるように下記のように編集。scalaVersionは適宜環境に合わせて変更すること。

name := """twitter4j-example"""

version := "1.0"

scalaVersion := "2.11.7"

libraryDependencies ++= Seq(
    "org.twitter4j" % "twitter4j-core" % "4.0.4",
    "org.scalatest" %% "scalatest" % "2.2.4" % "test"
)

EclipseKeys.withSource := true

eclipseプロジェクトに変換

$ bin/activator eclipse

出来上がったらScala IDE for Eclipseを立ち上げ、生成したプロジェクトフォルダをimport。

oAuth関連のキーとか取得

Twitterにログインした状態でTwitter Application Managementを開いてCreate New Appをクリックして、適当な名前でアプリケーションを作成する。

この時、Twitterに携帯番号を登録していないと、登録しないと使わせないぜ的なことを言ってくる。Twitterで携帯番号を登録する際は国番号81の後に0が入っているとなんか弾かれるので、1桁目の0はなしで登録する。

生成されたアプリケーションの「Keys and Access Tokens」のところを参照すると、「Consumer Key (API Key)」と「Consumer Secret (API Secret)」が参照できる。

また同ページの下に「Create Access Tokens」というボタンがあるので、ここからトークンも生成できる。生成するとYour Access Tokenのところに「Access Token」と「Access Token Secret」が生成されている。

Consumer Key, Consumer Secret, Access Token, Access Token Secretの4つがあれば検索はTwitter4jの処理は実行できる。

APIの実行制限回数を取得してみる

下記はAPIのauthentication関連の設定をしてクライアントを生成し、search apiの利用回数を表示するコード。

package jp.mwsoft.twitter4j.example

import twitter4j.TwitterFactory
import twitter4j.Query
import scala.collection.JavaConversions._
import twitter4j.auth.AccessToken

object SearchExample extends App {
  val factory = new TwitterFactory()
  val twitter = factory.getInstance()
  twitter.setOAuthConsumer("Consumer Key", "Consumer Secret")
  val accessToken = new AccessToken("Access Token", "Access Token Secret")
  twitter.setOAuthAccessToken(accessToken)

  def showLimit(key: String) {
    for ((k, v) <- twitter.getRateLimitStatus(key)) {
      println(k, v)
    }
  }

  showLimit("search")
}

下記が実行結果。

(/search/tweets,RateLimitStatusJSONImpl{remaining=180, limit=180, resetTimeInSeconds=1469813942, secondsUntilReset=899})

limitが180回。実行できる残り回数(remaining)が180回。カウントがリセットされるまでの時間(secondsUntilReset)が899秒、約15分。

15分に180回叩いて良いということなので、だいたい5秒に1リクエストして良いということになる。自分はこうしたAPIは余裕を持って叩く派なので10秒に1回としておく。

検索APIを叩く

検索する場合はsearchに検索したい引数を指定すればいい。

  def search(searchWord: String) {
    val query = new Query(searchWord)
    query.setCount(5)
    val result = twitter.search(query)
    println(s"${result.getCount}件取得")
    for (tweet <- result.getTweets) {
      println(tweet.getText)
    }
  }

  search("ほげ")

from:usernameとかキーワード以外にユーザ名等を指定することもできる。

どのように指定ができるかは下記URLに詳しい。

https://dev.twitter.com/rest/public/search