Created
June 26, 2013 09:13
-
-
Save joeartsea/5865948 to your computer and use it in GitHub Desktop.
Twitter Bot on AppEngine/Java http://www.artsnet.jp/archives/940
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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