ズッキーニのプログラミング実験場

プログラミング + アカデミック + 何か面白いこと。 記載されているものは基本的に私が所属する団体とは関係がありません。

   Dec 21

[Twitter4j][Java]twitter4jでリツイート数が最も高いツイートをリツイートする

by zuqqhi2 at 2014年12月21日
Pocket

Target

一番リツイート数が多いツイートを自動的にリツイートする。

Environment

  • OS
    • Linux 2.6.32-279.el6.x86_64 #1 SMP Fri Jun 22 12:19:21 UTC 2012 x86_64 x86_64 x86_64 GNU/Linux
  • JDK
    • 1.7.0_55
  • Apache Maven
    • 3.0.4
  • twitter4j
    • 4.0.2

Develop

まず、mavenで環境整備する。

準備

以下のコマンドでプロジェクトを作成する。

mvn archetype:generate \
  -DarchetypeArtifactId=maven-archetype-quickstart \
  -DinteractiveMode=false \
  -DgroupId=com.example.twitter \
  -DartifactId=get-popular-tweet

twitter4jを利用できるようにするために、pom.xmlを更新する。

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>com.example.twitter</groupId>
  <artifactId>get-popular-tweet</artifactId>
  <packaging>jar</packaging>
  <version>1.0-SNAPSHOT</version>
  <name>get-popular-tweet</name>
  <url>http://maven.apache.org</url>
  <dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>3.8.1</version>
      <scope>test</scope>
    </dependency>
    <dependency>
      <groupId>org.twitter4j</groupId>
      <artifactId>twitter4j-core</artifactId>
      <version>4.0.2</version>
    </dependency>
  </dependencies>
  <build>
    <plugins>
      <plugin>
        <artifactId>maven-compiler-plugin</artifactId>
        <version>2.3.2</version>
        <configuration>
          <source>1.7</source>
          <target>1.7</target>
        </configuration>
      </plugin>
      <plugin>
        <artifactId>maven-assembly-plugin</artifactId>
        <configuration>
          <archive>
            <manifest>
              <mainClass>fully.qualified.MainClass</mainClass>
            </manifest>
          </archive>
          <descriptorRefs>
            <descriptorRef>jar-with-dependencies</descriptorRef>
          </descriptorRefs>
        </configuration>
      </plugin>
    </plugins>
  </build>
</project>

ここで “maven-compiler-plugin” と “maven-assembly-plugin”というプラグインも追加しているが、
それは以下の理由から。

  • maven-compiler-plugin
    • mavenはデフォルトでJDK1,3を使おうとするから、これでJDKバージョンを指定できる。
  • maven-assembly-plugin
    • コンパイルすると、依存ライブラリを含めたjarファイルを生成してくれる。

次に”twitter4j.properties”というファイルを作る。
ここに、twitter4jのコンフィグを設定する。設置場所は”pom.xml”と同じディレクトリ。
以下のauthキーはtwitterのデベロッパーサイトから取得する。

debug=false
oauth.consumerKey=xxxxxxx
oauth.consumerSecret=xxxxxxx
oauth.accessToken=xxxxxx
oauth.accessTokenSecret=xxxxxx

]

# tree
.
├── pom.xml
├── twitter4j.properties
└── src
    ├── main
    │   └── java
    │       └── com
    │           └── example
    │               └── twitter
    │                   └── App.java
    └── test
        └── java
            └── com
                └── example
                    └── twitter
                        └── AppTest.java

11 directories, 3 files

これで準備は完了。

プログラミング

“src/main/java/com/example/twitter/App.java” このファイルを変更して開発する。

package com.example.twitter;

import java.util.List;

import twitter4j.Status;
import twitter4j.Twitter;
import twitter4j.TwitterException;
import twitter4j.TwitterFactory;
import twitter4j.User;
import twitter4j.Query;
import twitter4j.QueryResult;
import twitter4j.Query.ResultType;

public class App
{
  public static void main( String[] args )
  {
    Twitter twitter = new TwitterFactory().getInstance();

    Query query = new Query("ラーメン");
    query.setCount(100);
    query.setResultType(Query.ResultType.mixed); // Must use mixed. not popular.
    query.until("2014-12-21");
    query.since("2014-12-20");

    QueryResult result;
    int numHits = 0;
    int curPage = 1;
    Status popularTweet = null;

    while (true) {
      try {
        result = twitter.search(query);
      } catch (Exception e) {
        System.out.println(e);
        break;
      }

      numHits += result.getCount();

      List<Status> tweets = result.getTweets();
      for (Status tweet : tweets) {
        // Save most popular tweet
        if (popularTweet == null
            || popularTweet.getRetweetCount() < tweet.getRetweetCount()) {
                  popularTweet = tweet;
        }
      }

       // Go to next page (set page limit to 5)
      if (!result.hasNext()) break;
      query = result.nextQuery();
      curPage += 1;
      if (curPage >= 5) break;
    }

    System.out.println("Number of Hits           : " + numHits);
    System.out.println("User                         : " + popularTweet.getUser().getScreenName());
    System.out.println("Tweet                       : " + popularTweet.getText());
    System.out.println("Number of Retweeted : " + popularTweet.getRetweetCount());
    System.out.println("Date                        : " + popularTweet.getCreatedAt());

    // Retweet most popular tweet
    if (popularTweet != null)
      Status status = twitter.retweetStatus(popularTweet.getId());
  }
}

“Query.ResultType.popular”を選んだ場合なぜか15件だけしか取得できないため、注意が必要。

結果

# 依存ライブラリも含めたjarファイルを生成
$ mvn clean compile assembly:single

# 実行
$ java -cp target/get-popular-tweet-1.0-SNAPSHOT-jar-with-dependencies.jar com.example.twitter.App                                       [/home/hidetomo/work/get-popular-tweet]
Number of Hits      : 400
User                : iori_iori
Tweet               : RT @Pirate_Radio_: 大好きなラーメン屋がネットで酷評されてて足が遠ざかった。観たいと思ってた映画を評論家が★1つで「時間の無駄」と書かれてて観なかった経験がある。先日久々に食べたラーメンは旨くDVDで観た映画は面白かった。基準を外に託すと誰かに聞かないと幸せか…
Number of Retweeted : 26318
Date                : Sun Dec 21 08:58:39 JST 2014

美味しいラーメンのお店情報が得られるかと思ったけど、
関係ないツイートだった(-_-;)

twitterでtwitter4j.propertiesに設定したアカウントを見ると、上記のツイートがリツイートされているのが分かる。

Related Posts

Pocket

You can follow any responses to this entry through the RSS 2.0 feed. You can leave a response, or trackback from your own site.

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です