お知らせ
twitter APIのv1が終了になったのと、Yahoo APIサービスが終了したため、本書の手順に沿って作成したプログラムは動作しなくなりました。twitter APIについては最新のtwitter4jのマニュアルをご覧ください。またYahoo APIサービスの代替サービスは今のところ見つけられていません。
この章は、twitterボットの作成方法について説明します。このボットは、フォローをしている人のツイートを集めてその内容を加工してツイートします。ツイートやタイムラインの検索、フォロー返しやフォローはずしなどtwitterに関する一連の操作を行うために、Twitter4jというライブラリを利用しています。また、集めたツイートを加工するためにYahoo! テキスト解析 Web APIを呼び出す方法も説明します。
Google App Engine : サーブレット&JSP |データストア|スケジュールタスク| URL フェッチ
その他 : Twitter4j | Yahoo! テキスト解析 Web API(日本語係り受け解析)
http://guguruchan.appspot.com/
Google App Engine対応版のtwitter4jが2.2.4となってリリースされています。このバージョン(あるいはもう少しだけ古いバージョン)では、書籍で紹介したソースコードに対して、以下の修正が必要となる事があります。フォローとリフォローがうまく行かない場合は、試してみてください。
・p303 リスト8.5
5行目 getFriendsIDsの引数を-1に変更する
10行目 getFollowersIDsの引数を-1に変更する
・p305 リスト8.8
5行目 getFollowersIDsの引数を-1に変更する
10行目 getFriendsIDsの引数を-1に変更する
書籍に書かれたプラグラムでは、データストアに登録されている文章が削除されずクォータを超えてしまいます。そこで、古い文章を削除するサーブレットを作成しました。90日(およそ三カ月)より前の文章が削除の対象です。
DeleteServlet.java
package com.appspot.guguruchan;
import java.io.IOException;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
import javax.jdo.PersistenceManager;
import javax.jdo.Query;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@SuppressWarnings("serial")
public class DeleteServlet extends HttpServlet {
@SuppressWarnings("unchecked")
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
PersistenceManager pm = PMF.get().getPersistenceManager();
try {
/* 削除するデータの日付 */
Calendar calendar = Calendar.getInstance();
calendar.add(Calendar.DAY_OF_MONTH, -90);
Date expireDate = calendar.getTime();
/* 古い文章データクラスの取得 */
Query query = pm.newQuery(Sentence.class);
query.setRange(0, 100);
query.setOrdering("id");
List sentences = (List) query.execute();
/* 文章データクラスの削除 */
for(Sentence sentence : sentences) {
Date registerDate = sentence.getRegisterDate();
if(registerDate != null && registerDate.after(expireDate)) {
/* 有効期限より新しい文章データクラスが出てきたら、削除処理を終了 */
break;
}
pm.deletePersistent(sentence);
}
} finally {
pm.close();
}
}
}