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
- Apache Maven
- twitter4j
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のデベロッパーサイトから取得する。
]
# 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に設定したアカウントを見ると、上記のツイートがリツイートされているのが分かる。