package com.yuji.tdb; import java.io.IOException; import java.util.ArrayList; import java.util.Calendar; import java.util.Date; import java.util.List; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import twitter4j.Query; import twitter4j.QueryResult; import twitter4j.Status; import twitter4j.Tweet; import twitter4j.Twitter; import twitter4j.TwitterException; import twitter4j.TwitterFactory; import twitter4j.auth.AccessToken; import twitter4j.auth.OAuthAuthorization; import twitter4j.auth.RequestToken; import twitter4j.conf.Configuration; import twitter4j.conf.ConfigurationBuilder; import com.yuji.tdb.common.CommonUtil; @SuppressWarnings("serial") public class TrainDelayBotServlet extends HttpServlet { private static RequestToken requestToken = null; private static AccessToken accessToken = null; private static String consumerKey = null; private static String consumerSecret = null; public void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException { resp.setContentType("text/plain"); resp.getWriter().println(" traindelaybot Hello, world"); String consumerKey = req.getParameter("key"); String consumerSecret = req.getParameter("secret"); String result = req.getParameter("result"); if (!CommonUtil.isNull(consumerKey) && !CommonUtil.isNull(consumerSecret)) { setOAuthAuthorization(req, resp, consumerKey, consumerSecret); return; } else if (!CommonUtil.isNull(result)) { resultOAuthAuthorization(); return; } main(); } private void setOAuthAuthorization(HttpServletRequest req, HttpServletResponse resp, String consumerKey, String consumerSecret) { try { ConfigurationBuilder confBuilder = new ConfigurationBuilder(); confBuilder.setDebugEnabled(true); confBuilder.setOAuthConsumerKey(consumerKey); confBuilder.setOAuthConsumerSecret(consumerSecret); Configuration conf = confBuilder.build(); String url = req.getRequestURL().toString(); OAuthAuthorization oauth = new OAuthAuthorization(conf); // Twitterの認証画面からの戻り先を指定します。 // AccessTokenコントローラを指定します。 String callbackURL = url + "?result=yes"; // RequestToken requestToken = // oauth.getOAuthRequestToken(callbackURL); requestToken = oauth.getOAuthRequestToken(callbackURL); // RequestTokenをセッションに保存しておきます。 // sessionScope("RequestToken", requestToken); // Twitterの認証画面へリダイレクトします。 TrainDelayBotServlet.consumerKey = consumerKey; TrainDelayBotServlet.consumerSecret = consumerSecret; resp.sendRedirect(requestToken.getAuthenticationURL()); } catch (TwitterException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } private void resultOAuthAuthorization() { try { // Twitter twitter = new TwitterFactory().getInstance(); if (requestToken == null || CommonUtil.isNull(consumerKey) || CommonUtil.isNull(consumerSecret)) { return; } // String tokenKey = requestToken.getToken(); // String tokenSecret = requestToken.getTokenSecret(); ConfigurationBuilder confBuilder = new ConfigurationBuilder(); confBuilder.setDebugEnabled(true).setOAuthConsumerKey(consumerKey) .setOAuthConsumerSecret(consumerSecret); TwitterFactory factory = new TwitterFactory(confBuilder.build()); Twitter twitter = factory.getInstance(); accessToken = twitter.getOAuthAccessToken(requestToken); } catch (TwitterException e) { // TODO Auto-generated catch block e.printStackTrace(); } } private void main() { String text = "京浜東北"; try { ConfigurationBuilder confBuilder = new ConfigurationBuilder(); confBuilder.setDebugEnabled(true).setOAuthConsumerKey(consumerKey) .setOAuthConsumerSecret(consumerSecret); TwitterFactory factory = new TwitterFactory(confBuilder.build()); Twitter twitter = factory.getInstance(accessToken); Calendar cal = Calendar.getInstance(); Date date = cal.getTime(); long cur = date.getTime(); Query query = new Query(); query.setRpp(100); // TODO query.setQuery(text); QueryResult result = twitter.search(query); List tweets = result.getTweets(); int count = 0; String sample = ""; for (Tweet tweet : tweets) { Date at = tweet.getCreatedAt(); long t = at.getTime(); String message = tweet.getText(); if (t < cur - 30 * 60 * 1000){ continue; } if (!filter(message)) { // 遅延以外の書き込み continue; } if (sample == null){ sample = message; } System.out.println("@" + tweet.getFromUser() + " - " + tweet.getText() + at); } String message = ""; if (count < 1){ message = "遅延なし " + date.toString(); } else { sample = CommonUtil.replaceString(sample, "@", "(a)"); message = sample + " " + date.toString() + "count=" + count; } Status status = twitter.updateStatus(message); } catch (TwitterException e) { // TODO Auto-generated catch block e.printStackTrace(); } } private List keywords = null; private boolean filter(String text) { if (keywords == null) { keywords = new ArrayList(); keywords.add("遅延"); keywords.add("遅れ"); keywords.add("振り替え"); keywords.add("停"); } for (String keyword : keywords) { if (text.indexOf(keyword) >= 0) { return true; } } return false; } }