/** * */ package logbook.gui.twitter; import java.io.File; import logbook.config.AppConfig; import logbook.gui.WindowBase; import org.apache.commons.lang3.StringUtils; import twitter4j.StatusUpdate; import twitter4j.Twitter; import twitter4j.TwitterException; import twitter4j.TwitterFactory; import twitter4j.User; import twitter4j.auth.AccessToken; /** * @author Nekopanda * */ public class TwitterClient { /** twitter認証状況 */ private AccessToken accessToken; private User user; private Twitter twitter; private static TwitterClient instance; public static TwitterClient getInstance() throws TwitterException { if (instance == null) { instance = new TwitterClient(); } return instance; } TwitterClient() throws TwitterException { this.twitter = createInstance(); } private static Twitter createInstance() { Twitter twitter = new TwitterFactory().getInstance(); twitter.setOAuthConsumer( "d7OxSWHq0fAsDHc0V7WA7mBmw", "YflGWTXRTM9oi4mnYRd6ssq67DBzIRDZAjF2KASHHyy7KkmYEx"); return twitter; } public boolean prepareAccessToken(WindowBase parent) { if (this.accessToken != null) { return true; } String token = AppConfig.get().getTwitterToken(); String tokenSecret = AppConfig.get().getTwitterTokenSecret(); if (StringUtils.isNotEmpty(token) && StringUtils.isNotEmpty(tokenSecret)) { try { // AccessTokenが有効かチェック AccessToken accessToken = new AccessToken(token, tokenSecret); this.twitter.setOAuthAccessToken(accessToken); this.user = this.twitter.verifyCredentials(); return true; } catch (TwitterException e) { // 一度 setOAuthAccessToken したtwitterインスタンスは再利用できないので作り直す this.twitter = createInstance(); } } OauthDialog oauthDialog = new OauthDialog(parent, this.twitter); oauthDialog.open(); this.accessToken = oauthDialog.getAccessToken(); this.user = oauthDialog.getUser(); if (this.accessToken != null) { AppConfig.get().setTwitterToken(this.accessToken.getToken()); AppConfig.get().setTwitterTokenSecret(this.accessToken.getTokenSecret()); return true; } return false; } public void tweet(WindowBase parent, String text, File imageFile) throws TwitterException { try { this.twitter.updateStatus(new StatusUpdate(text).media(imageFile)); } catch (TwitterException e) { if (e.getStatusCode() == 401) { // 認証エラー -> アクセストークンを更新してリトライする this.accessToken = null; this.twitter = createInstance(); if (this.prepareAccessToken(parent)) { this.twitter.updateStatus(new StatusUpdate(text).media(imageFile)); return; } } throw e; } } /** * @return screenName */ public User getUser() { return this.user; } }