1 package com.yuji.tdb.twitter;
\r
3 import java.text.DateFormat;
\r
4 import java.text.SimpleDateFormat;
\r
5 import java.util.ArrayList;
\r
6 import java.util.Calendar;
\r
7 import java.util.Date;
\r
8 import java.util.HashMap;
\r
9 import java.util.List;
\r
10 import java.util.Map;
\r
11 import java.util.TimeZone;
\r
12 import java.util.logging.Logger;
\r
14 import twitter4j.Query;
\r
15 import twitter4j.QueryResult;
\r
16 import twitter4j.Status;
\r
17 import twitter4j.Tweet;
\r
18 import twitter4j.Twitter;
\r
19 import twitter4j.TwitterException;
\r
20 import twitter4j.TwitterFactory;
\r
21 import twitter4j.auth.AccessToken;
\r
22 import twitter4j.conf.ConfigurationBuilder;
\r
24 import com.yuji.tdb.common.CommonUtil;
\r
25 import com.yuji.tdb.db.KeyValueDao;
\r
26 import com.yuji.tdb.db.Train;
\r
27 import com.yuji.tdb.db.TrainDao;
\r
28 import com.yuji.tdb.debug.Debug;
\r
29 import com.yuji.tdb.utility.StringUtility;
\r
31 public class TwitterUtil {
\r
32 private static final Logger log = Logger
\r
33 .getLogger(TwitterUtil.class.getName());
\r
34 private static TwitterUtil instance = null;
\r
35 private static Object obj = new Object();
\r
36 //private DateFormat df = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
\r
37 private DateFormat df = new SimpleDateFormat("HH:mm");
\r
38 private static List<String> keywords = null;
\r
39 private long searchPeriod = 0;
\r
40 private long twitPeriod = 0;
\r
41 private Map<String, Long> twitTimeList = new HashMap<String, Long>();
\r
43 public static TwitterUtil getInstance() {
\r
44 if (instance == null) {
\r
45 synchronized (obj) {
\r
46 if (instance == null) {
\r
47 instance = new TwitterUtil();
\r
54 private TwitterUtil() {
\r
55 df.setTimeZone(TimeZone.getTimeZone("JST"));
\r
58 public void main(String consumerKey, String consumerSecret, AccessToken accessToken) {
\r
60 ConfigurationBuilder confBuilder = new ConfigurationBuilder();
\r
61 confBuilder.setDebugEnabled(true).setOAuthConsumerKey(consumerKey)
\r
62 .setOAuthConsumerSecret(consumerSecret);
\r
63 TwitterFactory factory = new TwitterFactory(confBuilder.build());
\r
64 Twitter twitter = factory.getInstance(accessToken);
\r
66 List<Train> list = getTrainList();
\r
67 for (Train train : list){
\r
68 Calendar cal = Calendar.getInstance();
\r
69 Date date = cal.getTime();
\r
70 long cur = date.getTime();
\r
72 long id = train.getId();
\r
73 long t = getTwitTime(id);
\r
74 long period = getTwitPeriod();
\r
76 if (t > 0 && cur < t + period * 60 * 1000){
\r
79 twite(twitter, train);
\r
81 } catch (TwitterException e) {
\r
82 // TODO Auto-generated catch block
\r
83 e.printStackTrace();
\r
84 log.severe(e.toString());
\r
88 private void twite(Twitter twitter, Train train) throws TwitterException {
\r
89 Query query = new Query();
\r
90 //query.setRpp(1000); // TODO
\r
91 query.setQuery(train.getSearchWord());
\r
92 QueryResult result = null;
\r
94 result = twitter.search(query);
\r
96 catch (TwitterException e){
\r
97 log.severe("" + Debug.getLineNo());
\r
100 List<Tweet> tweets = result.getTweets();
\r
102 Calendar cal = Calendar.getInstance();
\r
103 Date date = cal.getTime();
\r
104 long cur = date.getTime();
\r
109 long period = getSearchPeriod();
\r
110 long id = train.getId();
\r
114 int size = tweets.size();
\r
115 for (index = 0; index < size; index++) {
\r
116 Tweet tweet = tweets.get(index);
\r
118 Date at = tweet.getCreatedAt();
\r
119 long t = at.getTime();
\r
121 String message = tweet.getText();
\r
123 if (t < cur - period * 60 * 1000){
\r
124 System.out.println("
\81~" + tweet.getFromUser() + " - "
\r
125 + tweet.getText() + at);
\r
128 hit = filter(message);
\r
130 System.out.println("
\81¢" + tweet.getFromUser() + " - "
\r
131 + tweet.getText() + at);
\r
132 //
\92x
\89\84\88È
\8aO
\82Ì
\8f\91\82«
\8d\9e\82Ý
\r
140 System.out.println("@" + tweet.getFromUser() + " - "
\r
141 + tweet.getText() + at);
\r
145 String message = "[" + train.getName() + "] ";
\r
146 if (count < train.getCount()){
\r
147 message += df.format(date) + "
\92x
\89\84\82È
\82µ";
\r
152 String sample = tweets.get(mindex).getText();
\r
153 //sample = CommonUtil.replaceString(sample, "@", "(a)");
\r
154 sample = StringUtility.parseSubstring(sample, N);
\r
155 message += df.format(date) + "(" + count + "
\83c
\83C
\81[
\83g)" + " " + sample;
\r
157 System.out.println(message); //TODO
\r
159 Status status = null;
\r
161 if (count < train.getCount()){
\r
162 //
\92x
\89\84\82È
\82µ
\r
163 //status = twitter.updateStatus(message); //TODO
\r
164 //setTwitTime(id, cur); // TODO
\92x
\89\84\82È
\82µ
\82Ì
\8e\9e\82Ì
\82Ý
\r
167 //
\92x
\89\84\82 \82è
\r
168 status = twitter.updateStatus(message); //TODO
\r
169 setTwitTime(id, cur);
\r
172 catch (TwitterException e){
\r
173 log.severe(Debug.getLineNo() + " " + message);
\r
174 log.severe(Debug.getLineNo() + " " + status);
\r
179 private List<Train> getTrainList(){
\r
180 TrainDao dao = TrainDao.getInstance();
\r
181 List<Train> list = dao.search();
\r
182 if (list.size() <= 0){
\r
185 train = new Train("
\8b\9e\95l
\93\8c\96k
\90ü", "
\8b\9e\95l
\93\8c\96k", 5);
\r
187 train = new Train("
\93\8c\8aC
\93¹
\90ü", "
\93\8c\8aC
\93¹", 5);
\r
189 train = new Train("
\8b\9e\95l
\8b}
\8ds
\90ü", "
\8b\9e\8b}", 5);
\r
191 list = dao.search();
\r
196 public int filter(String text) {
\r
197 if (keywords == null) {
\r
198 keywords = new ArrayList<String>();
\r
199 keywords.add("
\92x
\89\84");
\r
200 keywords.add("
\92x
\82ê");
\r
201 keywords.add("
\90U
\82è
\91Ö
\82¦");
\r
202 keywords.add("
\90U
\91Ö");
\r
203 keywords.add("
\92â
\8e~");
\r
204 keywords.add("
\8e\96\8cÌ");
\r
208 for (String keyword : keywords) {
\r
209 if (text.indexOf(keyword) >= 0) {
\r
216 public long getSearchPeriod(){
\r
217 if (searchPeriod <= 0){
\r
218 KeyValueDao dao = KeyValueDao.getInstance();
\r
219 searchPeriod = dao.getInt(KeyValueDao.KEY_SEARCH_PERIOD, 5);
\r
221 return searchPeriod;
\r
224 public long getTwitPeriod(){
\r
225 if (twitPeriod <= 0){
\r
226 KeyValueDao dao = KeyValueDao.getInstance();
\r
227 twitPeriod = dao.getInt(KeyValueDao.KEY_TWIT_PERIOD, 60);
\r
232 private long getTwitTime(long id){
\r
233 String key = KeyValueDao.KEY_TWIT_TIME + id;
\r
234 Long value = twitTimeList.get(key);
\r
235 if (value == null){
\r
237 setTwitTime(id, value);
\r
242 private void setTwitTime(long id, long value){
\r
243 String key = KeyValueDao.KEY_TWIT_TIME + id;
\r
244 twitTimeList.put(key, value);
\r
245 KeyValueDao dao = KeyValueDao.getInstance();
\r
246 dao.put(key, String.valueOf(value));
\r