1 package twitter.manage;
4 import java.io.FileInputStream;
5 import java.io.FileNotFoundException;
6 import java.io.FileOutputStream;
7 import java.io.IOException;
8 import java.net.MalformedURLException;
10 import java.util.ArrayList;
11 import java.util.Collection;
12 import java.util.Collections;
13 import java.util.Date;
14 import java.util.LinkedList;
15 import java.util.List;
16 import java.util.Properties;
17 import java.util.logging.Level;
18 import java.util.logging.Logger;
20 import twitter.log.TwitterLogManager;
21 import twitter4j.Annotations;
22 import twitter4j.DirectMessage;
23 import twitter4j.GeoLocation;
24 import twitter4j.HashtagEntity;
25 import twitter4j.PagableResponseList;
26 import twitter4j.Paging;
27 import twitter4j.Place;
28 import twitter4j.Query;
29 import twitter4j.QueryResult;
30 import twitter4j.RateLimitStatus;
31 import twitter4j.Status;
32 import twitter4j.StatusUpdate;
33 import twitter4j.Tweet;
34 import twitter4j.Twitter;
35 import twitter4j.TwitterException;
36 import twitter4j.TwitterFactory;
37 import twitter4j.URLEntity;
38 import twitter4j.User;
39 import twitter4j.UserList;
40 import twitter4j.UserMentionEntity;
41 import twitter4j.conf.Configuration;
42 import twitter4j.conf.ConfigurationBuilder;
43 import twitter4j.auth.*;
45 public class TweetManager {
48 * DirectMessageのユーザ情報等からステータスを生成
53 private class DirectMessageUserStatus implements Status {
58 private static final long serialVersionUID = 1L;
59 // 受信したdirectMessageの情報
60 private DirectMessage message = null;
62 private User user = null;
64 public DirectMessageUserStatus(DirectMessage directMessage, User user) {
65 this.message = directMessage;
70 public String[] getContributors() {
75 public Date getCreatedAt() {
76 return message.getCreatedAt();
80 public GeoLocation getGeoLocation() {
90 public String getInReplyToScreenName() {
91 return ((SimpleUser) user).getStatusInReplyToScreenName();
95 public long getInReplyToStatusId() {
96 return ((SimpleUser) user).getStatusInReplyToUserId();
100 public long getInReplyToUserId() {
105 public Place getPlace() {
110 public RateLimitStatus getRateLimitStatus() {
111 return user.getRateLimitStatus();
115 public Status getRetweetedStatus() {
120 public String getSource() {
125 public String getText() {
126 return message.getText();
130 public User getUser() {
135 public boolean isFavorited() {
136 return ((SimpleUser) user).isStatusFavorited();
140 public boolean isRetweet() {
145 public boolean isTruncated() {
149 public int compareTo(Status t) {
150 throw new UnsupportedOperationException("Not supported yet.");
154 public Annotations getAnnotations() {
155 // TODO 自動生成されたメソッド・スタブ
160 public HashtagEntity[] getHashtagEntities() {
161 // TODO 自動生成されたメソッド・スタブ
166 public long getRetweetCount() {
167 // TODO 自動生成されたメソッド・スタブ
172 public URLEntity[] getURLEntities() {
173 // TODO 自動生成されたメソッド・スタブ
178 public UserMentionEntity[] getUserMentionEntities() {
179 // TODO 自動生成されたメソッド・スタブ
184 public boolean isRetweetedByMe() {
185 // TODO 自動生成されたメソッド・スタブ
190 private Twitter twitter = null;
191 // クライアントのConsumer Key
192 private static final String CONSUMER_KEY = "tbo5erit2M2ZzN6n8tEYcA";
193 // クライアントのConsumer Secret 外部に漏れてはいけない
194 private static final String CONSUMER_SECRET = "tODurbdySLYU1pKjtB3MQTDRBGy562dHzVf7d62mm8";
196 private String accessToken = "";
197 // secretToken 外部に漏れてはいけない
198 private String secretToken = "";
200 private static final String PROPERTIES_DIRECTORY = TweetConfiguration.PROPERTIES_DIRECTORY;
202 private static final String TWEET_INFO_FILENAME = TweetConfiguration.TWEET_INFO_FILENAME;
204 private static final String ACCOUNT_INFORMATION_FILENAME = TweetConfiguration.ACCOUNT_INFORMATION_FILENAME;
206 private final int MAX_TWEET_NUM = 99;
208 private long sinceTweetID = 0;
209 // 前回取得したmentionのtweetID
210 private long sinceMentionID = 0;
211 // 前回取得したsendDirectMessageの情報
212 private long sinceSendDirectMessageID = 0;
213 // 前回取得したdirectMessageの情報
214 private long sinceDirectMessageID = 0;
216 private Properties property = null;
218 private Properties accountProperty = null;
220 private TwitterLogManager logManager = null;
222 public TweetManager() {
223 logManager = new TwitterLogManager();
229 * @throws IOException
230 * @throws FileNotFoundException
232 public void loadProperties() throws FileNotFoundException, IOException {
233 if (property == null) {
234 this.property = new Properties();
236 property.load(new FileInputStream("./" + PROPERTIES_DIRECTORY + "/"
237 + TWEET_INFO_FILENAME));
239 String sti = this.property.getProperty("sinceTweetID");
241 * String smi = this.property.getProperty("sinceMentionID"); String
242 * ssdmi = this.property.getProperty("sinceSendDirectMessageID"); String
243 * sdmi = this.property.getProperty("sinceDirectMessageID");
247 this.sinceTweetID = Long.parseLong(sti);
249 * this.sinceMentionID = Long.parseLong(smi);
250 * this.sinceSendDirectMessageID = Long.parseLong(ssdmi);
251 * this.sinceDirectMessageID = Long.parseLong(sdmi);
253 } catch (NumberFormatException e) {
261 * @throws IOException
263 public void saveProperties() throws IOException {
265 File logDir = new File("./" + PROPERTIES_DIRECTORY);
266 if (!logDir.exists()) {
267 // ディレクトリが存在しないので作成する
268 if (logDir.mkdir() == false) {
269 throw new IOException(PROPERTIES_DIRECTORY
270 + "ディレクトリを作成できませんでした.");
273 if (property == null) {
274 this.property = new Properties();
277 this.property.setProperty("sinceTweetID", sinceTweetID + "");
279 * this.property.setProperty("sinceMentionID", sinceMentionID + "");
280 * this.property.setProperty("sinceSendDirectMessageID",
281 * sinceSendDirectMessageID + "");
282 * this.property.setProperty("sinceDirectMessageID",
283 * sinceDirectMessageID + "");
286 property.store(new FileOutputStream("./" + PROPERTIES_DIRECTORY + "/"
287 + TWEET_INFO_FILENAME), null);
293 * @throws FileNotFoundException
294 * @throws IOException
296 public void loadAccountProperties() throws FileNotFoundException,
298 if (accountProperty == null) {
299 this.accountProperty = new Properties();
301 accountProperty.load(new FileInputStream("./" + PROPERTIES_DIRECTORY
302 + "/" + ACCOUNT_INFORMATION_FILENAME));
304 this.accessToken = this.accountProperty.getProperty("accessToken");
305 this.secretToken = this.accountProperty.getProperty("secretToken");
311 * @throws IOException
313 public void saveAccountProperties() throws IOException {
315 File logDir = new File("./" + PROPERTIES_DIRECTORY);
316 if (!logDir.exists()) {
317 // ディレクトリが存在しないので作成する
318 if (logDir.mkdir() == false) {
319 throw new IOException(PROPERTIES_DIRECTORY
320 + "ディレクトリを作成できませんでした.");
323 if (accountProperty == null) {
324 this.accountProperty = new Properties();
327 this.accountProperty.setProperty("accessToken", this.accessToken);
328 this.accountProperty.setProperty("secretToken", this.secretToken);
330 accountProperty.store(new FileOutputStream("./" + PROPERTIES_DIRECTORY
331 + "/" + ACCOUNT_INFORMATION_FILENAME), null);
339 * @throws TwitterException
341 public List<Status> getDirectMessages(int num) throws TwitterException {
342 List<DirectMessage> directMessages = twitter
343 .getDirectMessages(new Paging(1, num));
345 List<Status> messageList = new LinkedList<Status>();
347 if (directMessages != null && directMessages.size() > 0) {
349 this.sinceDirectMessageID = directMessages.get(0).getId();
350 // 一番新しいtweetを一番したに持ってくる
351 for (DirectMessage message : directMessages) {
352 User user = message.getSender();
353 DirectMessageUserStatus status = new DirectMessageUserStatus(
355 messageList.add(0, status);
361 } catch (IOException e) {
372 * @throws TwitterException
374 public List<Status> getSendDirectMessages(int num) throws TwitterException {
375 List<DirectMessage> directMessages = twitter
376 .getSentDirectMessages(new Paging(1, num));
378 List<Status> messageList = new LinkedList<Status>();
379 if (directMessages != null && directMessages.size() > 0) {
381 this.sinceSendDirectMessageID = directMessages.get(0).getId();
382 // 一番新しいtweetを一番したに持ってくる
383 for (DirectMessage message : directMessages) {
384 User user = message.getRecipient();
385 DirectMessageUserStatus status = new DirectMessageUserStatus(
387 messageList.add(0, status);
392 } catch (IOException e) {
403 * @throws TwitterException
405 public List<Status> getMentions(int num) throws TwitterException {
406 List<Status> statuses = twitter.getMentions(new Paging(1, num));
408 List<Status> tweetList = new LinkedList<Status>();
409 if (statuses != null && statuses.size() > 0) {
411 this.sinceMentionID = statuses.get(0).getId();
412 // 一番新しいtweetを一番したに持ってくる
413 for (Status status : statuses) {
414 tweetList.add(0, status);
419 } catch (IOException e) {
426 * まだ取得していないDirectMessageを取得
429 * @throws TwitterException
431 public List<Status> getNewDirectMessages() throws TwitterException {
432 if (this.sinceDirectMessageID == 0) {
433 return getDirectMessages(MAX_TWEET_NUM);
435 List<DirectMessage> directMessages = twitter
436 .getDirectMessages(new Paging(sinceDirectMessageID));
437 // もし20件データ取得したらもっとデータがある可能性がある
438 if (directMessages.size() >= 20) {
439 List<DirectMessage> ndata = twitter.getDirectMessages(new Paging(1,
441 ndata = ndata.subList(21, ndata.size());
442 for (DirectMessage s : ndata) {
443 // すでに取得したことのあるデータだったとき
444 if (s.getId() <= sinceDirectMessageID) {
447 directMessages.add(s);
451 List<Status> messageList = new LinkedList<Status>();
452 if (directMessages != null && directMessages.size() > 0) {
454 this.sinceDirectMessageID = directMessages.get(0).getId();
455 // 一番新しいtweetを一番したに持ってくる
456 for (DirectMessage message : directMessages) {
457 Status status = message.getSender().getStatus();
458 messageList.add(0, status);
463 } catch (IOException e) {
470 * まだ取得していないSendDirectMessageを取得
473 * @throws TwitterException
475 public List<Status> getNewSendDirectMessages() throws TwitterException {
476 if (this.sinceSendDirectMessageID == 0) {
477 return getSendDirectMessages(MAX_TWEET_NUM);
479 List<DirectMessage> directMessages = twitter
480 .getDirectMessages(new Paging(sinceSendDirectMessageID));
481 // もし20件データ取得したらもっとデータがある可能性がある
482 if (directMessages.size() >= 20) {
483 List<DirectMessage> ndata = twitter
484 .getSentDirectMessages(new Paging(1, MAX_TWEET_NUM));
485 ndata = ndata.subList(21, ndata.size());
486 for (DirectMessage s : ndata) {
487 // すでに取得したことのあるデータだったとき
488 if (s.getId() <= sinceSendDirectMessageID) {
491 directMessages.add(s);
495 List<Status> messageList = new LinkedList<Status>();
496 if (directMessages != null && directMessages.size() > 0) {
498 this.sinceSendDirectMessageID = directMessages.get(0).getId();
499 // 一番新しいtweetを一番したに持ってくる
500 for (DirectMessage message : directMessages) {
501 Status status = message.getRecipient().getStatus();
502 messageList.add(0, status);
507 } catch (IOException e) {
514 * まだ取得していないMention情報を取得
517 * @throws TwitterException
519 public List<Status> getNewMentionData() throws TwitterException {
521 if (sinceMentionID == 0) {
522 return getMentions(MAX_TWEET_NUM);
524 // getFriendsTimelineではRetweetは表示されないので注意
525 List<Status> statuses = twitter.getMentions(new Paging(sinceMentionID));
526 // もし20件データ取得したらもっとデータがある可能性がある
527 if (statuses.size() >= 20) {
528 List<Status> ndata = twitter.getMentions(new Paging(1,
530 ndata = ndata.subList(21, ndata.size());
531 for (Status s : ndata) {
532 // すでに取得したことのあるデータだったとき
533 if (s.getId() <= sinceMentionID) {
541 List<Status> tweetList = new LinkedList<Status>();
542 if (statuses != null && statuses.size() > 0) {
544 sinceMentionID = statuses.get(0).getId();
546 // 一番新しいtweetを一番したに持ってくる
547 for (Status status : statuses) {
548 tweetList.add(0, status);
553 } catch (IOException e) {
560 * まだ取得していないtweet情報を取得
563 * @throws TwitterException
565 public List<Status> getNewTimelineData() throws TwitterException {
567 if (sinceTweetID == 0) {
568 return getTimeline(MAX_TWEET_NUM);
570 // getFriendsTimelineではRetweetは表示されないので注意
571 List<Status> statuses = twitter
572 .getHomeTimeline(new Paging(sinceTweetID));
573 // もし20件データ取得したらもっとデータがある可能性がある
574 if (statuses.size() >= 20) {
575 List<Status> ndata = twitter.getHomeTimeline(new Paging(1,
577 ndata = ndata.subList(21, ndata.size());
578 for (Status s : ndata) {
579 // すでに取得したことのあるデータだったとき
580 if (s.getId() <= sinceTweetID) {
587 List<Status> tweetList = new LinkedList<Status>();
588 if (statuses != null && statuses.size() > 0) {
590 sinceTweetID = statuses.get(0).getId();
592 // 一番新しいtweetを一番したに持ってくる
593 for (Status status : statuses) {
594 tweetList.add(0, status);
599 for (Status s : tweetList) {
602 } catch (IOException e) {
608 } catch (IOException e) {
615 * タイムラインを取得 一番新しいツイートは要素の一番下に追加
620 * @throws TwitterException
622 public List<Status> getTimeline(int num) throws TwitterException {
623 // getFriendsTimelineではRetweetは表示されないので注意
624 List<Status> statuses = twitter.getHomeTimeline(new Paging(1, num));
626 List<Status> tweetList = new LinkedList<Status>();
627 if (statuses != null && statuses.size() > 0) {
629 sinceTweetID = statuses.get(0).getId();
631 // 一番新しいtweetを一番したに持ってくる
632 for (Status status : statuses) {
633 tweetList.add(0, status);
638 for (Status s : tweetList) {
641 } catch (IOException e) {
646 } catch (IOException e) {
659 public List<Status> getNewSearchResult(long sinceID, String searchWord) {
662 return getSearchResult(MAX_TWEET_NUM, searchWord);
665 // TODO:同じようなコードを二回書いてる.ここは修正の必要があるかも
667 Query query = new Query(searchWord);
669 query.setRpp(this.MAX_TWEET_NUM);
673 query.setSinceId(sinceID);
675 QueryResult queryResult = null;
677 queryResult = twitter.search(query);
678 } catch (TwitterException ex) {
679 Logger.getLogger(TweetManager.class.getName()).log(Level.SEVERE,
680 "Twitter searchに失敗しました", ex);
681 ex.printStackTrace();
684 List<Status> tweetList = new LinkedList<Status>();
686 if (queryResult != null) {
687 for (Tweet tweet : queryResult.getTweets()) {
689 SimpleUser user = new SimpleUser();
691 user.setName(tweet.getFromUser());
692 user.setScreenName(tweet.getFromUser());
694 user.setId(tweet.getFromUserId());
698 .setProfileImageURL(new URL(tweet
699 .getProfileImageUrl()));
700 } catch (MalformedURLException ex) {
701 Logger.getLogger(TweetManager.class.getName()).log(
702 Level.SEVERE, null, ex);
705 SimpleStatus status = new SimpleStatus();
706 status.setCreatedAt(tweet.getCreatedAt());
707 status.setId(tweet.getId());
708 status.setSource(tweet.getSource());
709 status.setText(tweet.getText());
710 status.setUser(user);
713 tweetList.add(status);
716 // リスト逆転 一番あたらしいtweetを一番下に
717 Collections.reverse(tweetList);
731 public List<Status> getSearchResult(int num, String searchWord) {
732 Query query = new Query(searchWord);
738 QueryResult queryResult = null;
740 queryResult = twitter.search(query);
741 } catch (TwitterException ex) {
742 Logger.getLogger(TweetManager.class.getName()).log(Level.SEVERE,
743 "Twitter searchに失敗しました", ex);
744 ex.printStackTrace();
747 List<Status> tweetList = new LinkedList<Status>();
749 if (queryResult != null) {
750 for (Tweet tweet : queryResult.getTweets()) {
752 SimpleUser user = new SimpleUser();
754 user.setName(tweet.getFromUser());
755 user.setScreenName(tweet.getFromUser());
757 user.setId(tweet.getFromUserId());
761 .setProfileImageURL(new URL(tweet
762 .getProfileImageUrl()));
763 } catch (MalformedURLException ex) {
764 Logger.getLogger(TweetManager.class.getName()).log(
765 Level.SEVERE, null, ex);
768 SimpleStatus status = new SimpleStatus();
769 status.setCreatedAt(tweet.getCreatedAt());
770 status.setId(tweet.getId());
771 status.setSource(tweet.getSource());
772 status.setText(tweet.getText());
773 status.setUser(user);
776 tweetList.add(status);
780 // リスト逆転 一番あたらしいtweetを一番下に
781 Collections.reverse(tweetList);
790 * nullの場合,自分自身のお気に入りを取得
792 public List<Status> getFavoritesTweet(String screenName)
793 throws TwitterException {
794 // getFriendsTimelineではRetweetは表示されないので注意
795 List<Status> statuses = null;
796 if (screenName == null) {
798 statuses = twitter.getFavorites();
800 statuses = twitter.getFavorites(screenName);
802 // リスト逆転 一番あたらしいtweetを一番下に
803 Collections.reverse(statuses);
813 * @throws TwitterException
815 public List<Status> getUserTimeline(int num, long userID)
816 throws TwitterException {
817 List<Status> statuses = twitter.getUserTimeline(userID, new Paging(1,
821 if (statuses != null && statuses.size() > 0) {
822 Collections.reverse(statuses);
829 * 指定したユーザが保持しているリスト一覧を取得
831 * @param userScreenName
834 public List<UserList> getUserLists(String userScreenName) {
835 List<UserList> userlist = new ArrayList<UserList>();
840 PagableResponseList<UserList> list = this.twitter.getUserLists(
841 userScreenName, cursor);
842 userlist.addAll(list);
844 if (list.hasNext()) {
846 cursor = list.getNextCursor();
851 } catch (TwitterException ex) {
852 Logger.getLogger(TweetManager.class.getName()).log(Level.SEVERE,
859 * 指定したユーザをフォローしているリストを返す
861 * @param userScreenName
864 public List<UserList> getUserListSubscriptions(String userScreenName) {
865 List<UserList> userlist = new ArrayList<UserList>();
870 PagableResponseList<UserList> list = this.twitter
871 .getUserListSubscriptions(userScreenName, cursor);
872 userlist.addAll(list);
874 if (list.hasNext()) {
876 cursor = list.getNextCursor();
881 } catch (TwitterException ex) {
882 Logger.getLogger(TweetManager.class.getName()).log(Level.SEVERE,
889 * 指定したユーザが追加されているリストを返す
891 * @param userScreenName
894 public List<UserList> getUserListMemberships(String userScreenName) {
895 List<UserList> userlist = new ArrayList<UserList>();
900 PagableResponseList<UserList> list = this.twitter
901 .getUserListMemberships(userScreenName, cursor);
902 userlist.addAll(list);
904 if (list.hasNext()) {
906 cursor = list.getNextCursor();
911 } catch (TwitterException ex) {
912 Logger.getLogger(TweetManager.class.getName()).log(Level.SEVERE,
921 * @param userScreenName
928 * @throws TwitterException
930 public List<Status> getUserListStatuses(String userScreenName, int listID,
932 List<Status> tweetList = null;
934 tweetList = this.twitter.getUserListStatuses(userScreenName,
935 listID, new Paging(1, num));
936 } catch (TwitterException ex) {
937 Logger.getLogger(TweetManager.class.getName()).log(Level.SEVERE,
941 if (tweetList != null && tweetList.size() > 0) {
942 Collections.reverse(tweetList);
950 * @param userScreenName
957 public List<Status> getNewUserListStatuses(String userScreenName,
958 int listID, long sinceID) {
960 return getUserListStatuses(userScreenName, listID, MAX_TWEET_NUM);
962 List<Status> tweetList = null;
964 tweetList = this.twitter.getUserListStatuses(userScreenName,
965 listID, new Paging(sinceID));
966 } catch (TwitterException ex) {
967 Logger.getLogger(TweetManager.class.getName()).log(Level.SEVERE,
971 if (tweetList != null && tweetList.size() > 0) {
972 Collections.reverse(tweetList);
983 * @throws TwitterException
985 public List<Status> getNewUserTimeline(long userID, long sinceID)
986 throws TwitterException {
989 return getUserTimeline(MAX_TWEET_NUM, userID);
992 List<Status> statuses = twitter.getUserTimeline(userID, new Paging(
996 if (statuses != null && statuses.size() > 0) {
997 Collections.reverse(statuses);
1006 public void loginTwitter() throws FileNotFoundException, IOException {
1007 twitter = new TwitterFactory().getInstance();
1009 loadAccountProperties();
1011 twitter.setOAuthConsumer(CONSUMER_KEY, CONSUMER_SECRET);
1012 // ここにユーザのアクセストークンを入れる
1013 AccessToken ac = new AccessToken(accessToken, secretToken);
1014 twitter.setOAuthAccessToken(ac);
1018 } catch (FileNotFoundException e) {
1019 e.printStackTrace();
1020 } catch (IOException e) {
1021 e.printStackTrace();
1026 * Configurationを生成する
1030 private Configuration getTwitterConfiguration() {
1031 ConfigurationBuilder confbuilder = new ConfigurationBuilder();
1032 confbuilder.setOAuthConsumerKey(CONSUMER_KEY);
1033 confbuilder.setOAuthConsumerSecret(CONSUMER_SECRET);
1034 return confbuilder.build();
1038 * 初回時アクセストークンを取得する際に利用する
1042 * @throws TwitterException
1044 public void getAccessToken(String username, String password)
1045 throws TwitterException {
1046 // consumer key secretを設定
1047 Configuration conf = this.getTwitterConfiguration();
1048 twitter = new TwitterFactory(conf).getInstance();
1050 AccessToken oAuthAccessToken = twitter.getOAuthAccessToken(username, password);
1051 this.accessToken = oAuthAccessToken.getToken();
1052 this.secretToken = oAuthAccessToken.getTokenSecret();
1055 // 取得したOAuthのトークンを保存
1056 saveAccountProperties();
1057 } catch (IOException ex) {
1058 ex.printStackTrace();
1067 public void tweet(String message) {
1068 twitter4j.Status status;
1070 status = twitter.updateStatus(message);
1071 } catch (TwitterException e) {
1073 e.printStackTrace();
1081 * @param replyToStatusID
1083 public void replyTweet(String message, long replyToStatusID) {
1084 twitter4j.Status status;
1086 // status = twitter.updateStatus(message, replyToStatusID);
1087 StatusUpdate updateMsg = new StatusUpdate(message);
1088 updateMsg.setInReplyToStatusId(replyToStatusID);
1089 status = twitter.updateStatus( updateMsg );
1090 } catch (TwitterException e) {
1092 e.printStackTrace();
1101 * @throws TwitterException
1103 public void sendDirectMessage(String screenName, String text)
1104 throws TwitterException {
1105 twitter.sendDirectMessage(screenName, text);
1109 * 指定したステータスIDの発言をRetweet
1112 * @throws TwitterException
1114 public void retweet(long statusID) throws TwitterException {
1115 twitter.retweetStatus(statusID);
1122 * @throws TwitterException
1124 public void createFavorite(long statusID) throws TwitterException {
1125 twitter.createFavorite(statusID);
1129 * 指定した発言のお気に入りを取り下げる
1133 public void destroyFavorite(long statusID) throws TwitterException {
1134 twitter.destroyFavorite(statusID);
1141 * @throws TwitterException
1143 public RateLimitStatus getRateLimitStatus() throws TwitterException {
1144 return twitter.getRateLimitStatus();
1152 public String getScreenName() {
1154 if (twitter != null) {
1155 return twitter.getScreenName();
1157 } catch (TwitterException e) {