Skip to content

Instantly share code, notes, and snippets.

@joeartsea
Created June 26, 2013 09:13
Show Gist options
  • Save joeartsea/5865948 to your computer and use it in GitHub Desktop.
Save joeartsea/5865948 to your computer and use it in GitHub Desktop.
Twitter Bot on AppEngine/Java http://www.artsnet.jp/archives/940
package daibentter;
import java.io.IOException;
import java.util.Date;
import java.util.List;
import javax.servlet.ServletException;
import javax.servlet.http.*;
import twitter4j.Status;
import twitter4j.Twitter;
import twitter4j.TwitterException;
import twitter4j.TwitterFactory;
import twitter4j.http.*;
import com.google.appengine.api.datastore.*;
import com.google.appengine.api.datastore.Query.FilterOperator;
import com.google.appengine.api.datastore.Query.SortDirection;
@SuppressWarnings("serial")
public class AtsumatterServlet extends HttpServlet {
public void doGet(HttpServletRequest req, HttpServletResponse resp)
throws IOException {
//各キー情報
String consumerKey = "ここにアプリケーション登録で取得したconsumerKeyを書く";
String consumerSecret = "ここにアプリケーション登録で取得したconsumerSecretを書く";
String token = "ここにEclipseのコンソールで取得したtokenを書く";
String tokenSecret = "ここにEclipseのコンソールで取得したtokenSecretを書く";
try {
//ここがBasic認証なのでここを書き直します。
//Twitter twitter = new Twitter("username", "password");
// Twitterオブジェクトを生成
TwitterFactory factory = new TwitterFactory();
AccessToken accessToken = new AccessToken(token, tokenSecret);
Twitter twitter = factory.getOAuthAuthorizedInstance(consumerKey, consumerSecret, accessToken);
//リプライを取得
List<Status> replies = twitter.getMentions();
for (Status reply : replies) {
//リプライしたユーザーがフォロワーなら処理する
if(twitter.existsFriendship(reply.getUser().getScreenName(), "daibentter")) {
//Low Level APIを使用
DatastoreService service = DatastoreServiceFactory.getDatastoreService();
Transaction transaction = service.beginTransaction();
try {
//リプライが既に投稿されたデータに存在するか検索
Query query = new Query("Post");
query.addFilter("postUser", FilterOperator.EQUAL, reply.getUser().getScreenName());
query.addFilter("postText", FilterOperator.EQUAL, reply.getText());
query.addSort("postDate", SortDirection.DESCENDING);
PreparedQuery pq = service.prepare(query);
FetchOptions limit = FetchOptions.Builder.withOffset(0).limit(1);
List<Entity> results = pq.asList(limit);
if(results.isEmpty()) {
//存在しなければポスト
String postUser = "[@" + reply.getUser().getScreenName() + " #daibentter]";
String postText = reply.getText().replaceFirst("@daibentter", "");
twitter.updateStatus(postText + postUser);
//ポスト内容をBigTableへ登録
Entity post = new Entity("Post");
post.setProperty("postUser", reply.getUser().getScreenName());
post.setProperty("postText", reply.getText());
post.setProperty("postDate", new Date());
service.put(transaction, post);
transaction.commit();
}
} finally {
if (transaction.isActive()) {
transaction.rollback();
}
}
}
}
} catch (TwitterException e) {
e.printStackTrace();
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment