OSDN Git Service

Txxxxx
[traindelaybot/source.git] / workspace / .metadata / .plugins / org.eclipse.core.resources / .history / 78 / a01f6262307200111835fa7adce7cfd2
1 package com.yuji.tdb.twitter;\r
2 \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
13 \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
23 \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
30 \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
42         \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
48                                 }\r
49                         }\r
50                 }\r
51                 return instance;\r
52         }\r
53 \r
54         private TwitterUtil() {\r
55                 df.setTimeZone(TimeZone.getTimeZone("JST")); \r
56         }\r
57 \r
58         public void main(String consumerKey, String consumerSecret, AccessToken accessToken) {\r
59                 try {\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
65 \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
71 \r
72                                 long id = train.getId();\r
73                                 long t = getTwitTime(id);\r
74                                 long period = getTwitPeriod();\r
75 \r
76                                 if (t > 0 && t + period < cur){\r
77                                         continue;\r
78                                 }\r
79                                 twite(twitter, train);\r
80                         }\r
81                 } catch (TwitterException e) {\r
82                         // TODO Auto-generated catch block\r
83                         e.printStackTrace();\r
84                         log.severe(e.toString());\r
85                 }\r
86         }\r
87 \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
93                 try {\r
94                         result = twitter.search(query);\r
95                 }\r
96                 catch (TwitterException e){\r
97                         log.severe("" + Debug.getLineNo());\r
98                         throw e;\r
99                 }\r
100                 List<Tweet> tweets = result.getTweets();\r
101                 \r
102                 Calendar cal = Calendar.getInstance();\r
103                 Date date = cal.getTime();\r
104                 long cur = date.getTime();\r
105 \r
106                 int count = 0;\r
107                 int hit = 0;\r
108                 int mhit = 0;\r
109                 long period = getSearchPeriod();\r
110                 long id = train.getId();\r
111                 \r
112                 int index;\r
113                 int mindex = 0;\r
114                 int size = tweets.size();\r
115                 for (index = 0; index < size; index++) {\r
116                         Tweet tweet = tweets.get(index);\r
117                         \r
118                         Date at = tweet.getCreatedAt();\r
119                         long t = at.getTime();\r
120                         \r
121                         String message = tweet.getText();\r
122                         \r
123                         if (t < cur - period * 60 * 1000){\r
124                                 System.out.println("\81~" + tweet.getFromUser() + " - "\r
125                                                 + tweet.getText() + at);\r
126                                 continue;\r
127                         }\r
128                         hit = filter(message);\r
129                         if (hit <= 0) {\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
133                                 continue;\r
134                         }\r
135                         if (hit > mhit){\r
136                                 hit = mhit;\r
137                                 mindex = index;\r
138                         }\r
139 \r
140                         System.out.println("@" + tweet.getFromUser() + " - "\r
141                                         + tweet.getText() + at);\r
142                         count++;\r
143                 }\r
144 \r
145                 String message = "[" + train.getName() + "] ";\r
146                 if (count < train.getCount()){\r
147                         message += df.format(date) + " \92x\89\84\82È\82µ";       \r
148                 }\r
149                 else {\r
150                         int N = 100;\r
151                         \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) + " " + sample + " count=" + count;                                                  \r
156                 }\r
157                 System.out.println(message); //TODO\r
158                 \r
159                 Status status = null;\r
160                 try {\r
161                         status = twitter.updateStatus(message); //TODO\r
162                         setTwitTime(id, cur);\r
163                 }\r
164                 catch (TwitterException e){\r
165                         log.severe(Debug.getLineNo() + " " + message);\r
166                         log.severe(Debug.getLineNo() + " " + status);\r
167                         throw e;\r
168                 }\r
169         }\r
170         \r
171         private List<Train> getTrainList(){\r
172                 TrainDao dao = TrainDao.getInstance();\r
173                 List<Train> list = dao.search();\r
174                 if (list.size() <= 0){\r
175                         Train train;\r
176                         \r
177                         train = new Train("\8b\9e\95l\93\8c\96k\90ü", "\8b\9e\95l\93\8c\96k", 5);\r
178                         dao.put(train);\r
179                         train = new Train("\93\8c\8aC\93¹\90ü", "\93\8c\8aC\93¹", 5);\r
180                         dao.put(train);\r
181                         train = new Train("\8b\9e\95l\8b}\8ds\90ü", "\8b\9e\8b}", 5);\r
182                         dao.put(train);\r
183                         list = dao.search();\r
184                 }\r
185                 return list;\r
186         }\r
187         \r
188         public int filter(String text) {\r
189                 if (keywords == null) {\r
190                         keywords = new ArrayList<String>();\r
191                         keywords.add("\92x\89\84");\r
192                         keywords.add("\92x\82ê");\r
193                         keywords.add("\90U\82è\91Ö\82¦");\r
194                         keywords.add("\90U\91Ö");\r
195                         keywords.add("\92â\8e~");\r
196                         keywords.add("\8e\96\8cÌ");\r
197                 }\r
198 \r
199                 int count = 0;\r
200                 for (String keyword : keywords) {\r
201                         if (text.indexOf(keyword) >= 0) {\r
202                                 count++;\r
203                         }\r
204                 }\r
205                 return count;\r
206         }\r
207         \r
208         public long getSearchPeriod(){\r
209                 if (searchPeriod <= 0){\r
210                         KeyValueDao dao = KeyValueDao.getInstance();\r
211                         searchPeriod = dao.getInt(KeyValueDao.KEY_SEARCH_PERIOD, 5);\r
212                 }\r
213                 return searchPeriod;\r
214         }\r
215         \r
216         public long getTwitPeriod(){\r
217                 if (twitPeriod <= 0){\r
218                         KeyValueDao dao = KeyValueDao.getInstance();\r
219                         twitPeriod = dao.getInt(KeyValueDao.KEY_TWIT_PERIOD, 5);\r
220                 }\r
221                 return twitPeriod;\r
222         }\r
223         \r
224         private long getTwitTime(long id){\r
225                 String key = KeyValueDao.KEY_TWIT_TIME + id;\r
226                 Long value = twitTimeList.get(key);\r
227                 if (value == null){\r
228                         value = 0L;\r
229                         twitTimeList.put(key, value);\r
230                 }\r
231                 return value;\r
232         }\r
233         \r
234         private void setTwitTime(long id, long value){\r
235                 String key = KeyValueDao.KEY_TWIT_TIME + id;\r
236                 twitTimeList.put(key, value);\r
237         }\r
238 }\r