
Twitter4J ãã OAuth èªè¨¼é¨åã ããå©ç¨ããæ¹æ³2010-09-12
â»åç½®ãé·ãã§ããæ¬é¡ã¯ããããã
9/6 ãããã 9/9 ã«ããã¦ãTwitMgr (é鿏) 㨠Splitwit (é鿏) ã® OAuth èªè¨¼ãæ£ããåä½ããªããªã£ã¦ãã¾ã£ã¦ãã¾ããã
ãããã¯ãJavaScript ã§ Twitter API ãæ±ãã©ã¤ãã©ãªã¨ãã¦ãTwitAPI.js ã使ã£ã¦ãããããããã¾ãåä½ãã¦ããªãã£ãã®ã§ããã§ãåå ã追ã£ãã¨ãããJavaScript å´ã§ã¯ãªããOAuth èªè¨¼ãè©ä»£ãããããããã·ãµã¼ãã§ãã taj-proxy å´ã«åé¡ããããã¨ãããã£ãã®ã§ãä»åã¯ãããç´ããã¨ãã®è©±ã§ãã
ãããããtaj-proxy ã¯ãéçºå½å GAE/j ä¸ã§ãã¾ã Twitter OAuth èªè¨¼ãæ±ããã©ã¤ãã©ãªããªãã£ã (ã¨æã£ã¦ãã) ãããOAuth èªè¨¼é¨åããã¹ã¦ç¬èªå®è£ ãã¦ã¾ãããTwitter å´ã®ä½ããã®å®è£ ã®å¤æ´ã«ããããã®ç¬èªå®è£ ããã¾ãåããªããªã£ããããªã®ã§ãããã±ã£ã¨è¦ã§ã¯å ¨ç¶åå ãåããã¾ããã§ããã(å¤å Signature å¨ãã ã¨ã¯æã)
ããã§æ¹ãã¦ãTwitter OAuth èªè¨¼ãæ±ããã©ã¤ãã©ãªãæ¢ããã¨ãããTwitter4J ã¨ããè¶ ã¡ã¸ã£ã¼ãªã©ã¤ãã©ãªããGAE/j ã«å¯¾å¿ãã¦ãããã¨ãããããæ©é使ç¨ããã¦ããããã¨ã«ããæ¬¡ç¬¬ã§ãã
Twitter4J ã§ã¯ãTwitter API ã¨ä¸å¯¾ä¸ã«å¯¾å¿ãã java ã®ã¡ã½ãããç¨æããã¦ããããããã¦ç°¡åã« TwitterAPI ãå©ç¨ãããã¨ãã§ãã¾ãã(è¨è¨ææ³ã¨ãã¦ã¯ãå代㮠TwitterAPI.js ã«ä¼¼ã¦ã¾ããã)
ã¨ããããTwitAPI.js ã§ã¯ãå°æ¥ç㪠TwitterAPI ã®æ¡å¼µãã«ããã§ãä»»æã®ãã¹ã渡ã㦠TwitterAPI ãå©ç¨ãããã¨ãã§ããããã«ãªã£ã¦ããããããã®ã¾ã¾ã§ã¯ JavaScript å´ããæ¸¡ããããã¹ã Twitter4J ã®ã¡ã½ããã«ç¿»è¨³ããå¿ è¦ãåºã¦ãã¾ããåã«é©ç¨ããã ãã§ã¯æ¸ã¿ã¾ããã§ããã
ããã§ãTwitter4J ã®ä¾¿å©ã¡ã½ããã¯ä½¿ç¨ãããTwitter4J ã¨ãã¦ç¨æããã¦ããå種ã®ã¯ã©ã¹ã使ç¨ãã¦ãOAuth é¨åã ããå©ç¨ããã¦ããã£ãã®ã§ããã®æ¹æ³ã«ã¤ãã¦ã¾ã¨ãã¦ããã¾ãã
ããããæ¬é¡ã§ããé·ãåç½®ãã§ããâ¥ã
ããã§ã¯ã¾ããããããå§ãã OAuth èªè¨¼ã®ããã«å¿ è¦ãªãªã¯ã¨ã¹ããã¼ã¯ã³ (ä½¿ãæ¨ã¦ãã¹ã¯ã¼ãã®ãããªãã®) ãåå¾ãã¾ãã
ä¸è¨ã®çä¼¼ã³ã¼ãã§ã¯æ¨ã¦ã¦ã¾ãããconsumerKey 㨠consumerSecret ãããrequestToken 㨠requestTokenSecret ãåå¾ããã¾ã§ããã¤ã³ãã§ãããã®æç¹ã§ã¯ã¾ã ã¦ã¼ã¶ã«ã¯ä½ãæç¤ºãã¦ããããããã§åå¾ãã requestToken ãæ¬¡ã«ä½¿ãã¾ããã¾ããrequestTokenSecret ãå¿ ããã¢ã§ä¿æãã¦ããã¾ãã
èªè¨¼ã許å¯ãããã¨ãConsumerKey ãåå¾ããéã«ç»é²ããã³ã¼ã«ãã㯠URL ã«çµæãè¿ã£ã¦ãã¾ãã
authenticate ã®å ´åãååã®ã¿èªè¨¼ãå¿ è¦ãªã ãã§ãä¸åèªè¨¼ãã¦ãã¾ãã°æ¬¡åããã¯èªåçã«ã³ã¼ã«ããã¯ãå¼ã°ããããã«ãªãã¾ãã大åã®ã¦ã§ããµã¼ãã¹ã§ã¯ãã¡ãã使ã£ã¦ã¾ããã
ã¡ãªã¿ã« TwitAPI.js ã§ã¯ããã®æ§è³ªä¸ç°¡åã«èªè¨¼æ å ±ãæ¨ªåããããã¨ãå¯è½ãªã®ã§ãauthorize ã®ã¿å©ç¨å¯è½ã«ãã¦ãã¾ãã
å度 Twitter ãµã¼ãã«åãåãããçµæå¾ããããoauth_token 㨠oauth_token_secret ããçã«éè¦ãªã¢ã¯ã»ã¹ãã¼ã¯ã³ã«ãªãã¾ãããããããã°ãOAuth èªè¨¼ã®çµæå¾ãããã対象ã¢ããªã±ã¼ã·ã§ã³å°ç¨ã®ãã¹ã¯ã¼ãã®ãããªãã®ã§ãããã®éãåã¦ã¼ã¶ã®ã¦ãã¼ã¯ãã¼ã§ãã user_id ã¨è¡¨ç¤ºä¸ã®ååã§ãã screen_name ãå¾ãããã®ã§ãããããã¹ã¦ãã»ããã«ãã¦ä¿æãã¦ããã¾ãã
ãã ãscreen_name ã«é¢ãã¦ã¯ã¦ã¼ã¶è¨å®ã§å¤æ´ãå¯è½ãªã®ã§ãããã¢ããªå´ã§ã¦ã¼ã¶ãã¨ã®æ å ±ãä½ãä¿åããå ´åãuser_id ã«é¢é£ã¥ãã¦ä¿åãã¦ããå¿ è¦ãããã¾ãã
Twitter API ã¯ä½¿ç¨ãã HTTP ã¡ã½ããã«ãã广ãç°ãªãã®ã§ GET/POST/DELETE ã«å¿ãã¦ã使ç¨ãã Java ã®ã¡ã½ãããç°ãªãã¾ãã
ãã ããããã£ãç¨éãæ³å®ãããã®ããã«ãTwitter4J ã®ã¯ã©ã¹é¡ã¯é常ã«ããã§ãã¦ãã¦ãã¨ã¦ã使ããããã®ã§å©ããã¾ããã
æ¹ãã¦ãTwitter4J ã®ä½è æ§ã«ã¯è¬è¾ãè¿°ã¹ããã¨æãã¾ãã
9/6 ãããã 9/9 ã«ããã¦ãTwitMgr (é鿏) 㨠Splitwit (é鿏) ã® OAuth èªè¨¼ãæ£ããåä½ããªããªã£ã¦ãã¾ã£ã¦ãã¾ããã
ãããã¯ãJavaScript ã§ Twitter API ãæ±ãã©ã¤ãã©ãªã¨ãã¦ãTwitAPI.js ã使ã£ã¦ãããããããã¾ãåä½ãã¦ããªãã£ãã®ã§ããã§ãåå ã追ã£ãã¨ãããJavaScript å´ã§ã¯ãªããOAuth èªè¨¼ãè©ä»£ãããããããã·ãµã¼ãã§ãã taj-proxy å´ã«åé¡ããããã¨ãããã£ãã®ã§ãä»åã¯ãããç´ããã¨ãã®è©±ã§ãã
ãããããtaj-proxy ã¯ãéçºå½å GAE/j ä¸ã§ãã¾ã Twitter OAuth èªè¨¼ãæ±ããã©ã¤ãã©ãªããªãã£ã (ã¨æã£ã¦ãã) ãããOAuth èªè¨¼é¨åããã¹ã¦ç¬èªå®è£ ãã¦ã¾ãããTwitter å´ã®ä½ããã®å®è£ ã®å¤æ´ã«ããããã®ç¬èªå®è£ ããã¾ãåããªããªã£ããããªã®ã§ãããã±ã£ã¨è¦ã§ã¯å ¨ç¶åå ãåããã¾ããã§ããã(å¤å Signature å¨ãã ã¨ã¯æã)
ããã§æ¹ãã¦ãTwitter OAuth èªè¨¼ãæ±ããã©ã¤ãã©ãªãæ¢ããã¨ãããTwitter4J ã¨ããè¶ ã¡ã¸ã£ã¼ãªã©ã¤ãã©ãªããGAE/j ã«å¯¾å¿ãã¦ãããã¨ãããããæ©é使ç¨ããã¦ããããã¨ã«ããæ¬¡ç¬¬ã§ãã
Twitter4J ã§ã¯ãTwitter API ã¨ä¸å¯¾ä¸ã«å¯¾å¿ãã java ã®ã¡ã½ãããç¨æããã¦ããããããã¦ç°¡åã« TwitterAPI ãå©ç¨ãããã¨ãã§ãã¾ãã(è¨è¨ææ³ã¨ãã¦ã¯ãå代㮠TwitterAPI.js ã«ä¼¼ã¦ã¾ããã)
ã¨ããããTwitAPI.js ã§ã¯ãå°æ¥ç㪠TwitterAPI ã®æ¡å¼µãã«ããã§ãä»»æã®ãã¹ã渡ã㦠TwitterAPI ãå©ç¨ãããã¨ãã§ããããã«ãªã£ã¦ããããããã®ã¾ã¾ã§ã¯ JavaScript å´ããæ¸¡ããããã¹ã Twitter4J ã®ã¡ã½ããã«ç¿»è¨³ããå¿ è¦ãåºã¦ãã¾ããåã«é©ç¨ããã ãã§ã¯æ¸ã¿ã¾ããã§ããã
ããã§ãTwitter4J ã®ä¾¿å©ã¡ã½ããã¯ä½¿ç¨ãããTwitter4J ã¨ãã¦ç¨æããã¦ããå種ã®ã¯ã©ã¹ã使ç¨ãã¦ãOAuth é¨åã ããå©ç¨ããã¦ããã£ãã®ã§ããã®æ¹æ³ã«ã¤ãã¦ã¾ã¨ãã¦ããã¾ãã
ããããæ¬é¡ã§ããé·ãåç½®ãã§ããâ¥ã
ãªã¯ã¨ã¹ããã¼ã¯ã³ãåå¾ãã
Twitter API ã OAuth ã§ä½¿ç¨ããéã«ãéçºè å´ã§å¿ è¦ãª ConsumerKey 㨠ConsumerSecret ã¯ãã§ã«å徿¸ã¿ãªãã¨ãåæã¨ãã¾ããããã¾ã ã§ããããã»ãã®æ å ±ãå½ãã£ã¦ãã ãããããã§ã¯ã¾ããããããå§ãã OAuth èªè¨¼ã®ããã«å¿ è¦ãªãªã¯ã¨ã¹ããã¼ã¯ã³ (ä½¿ãæ¨ã¦ãã¹ã¯ã¼ãã®ãããªãã®) ãåå¾ãã¾ãã
ä¸è¨ã®çä¼¼ã³ã¼ãã§ã¯æ¨ã¦ã¦ã¾ãããconsumerKey 㨠consumerSecret ãããrequestToken 㨠requestTokenSecret ãåå¾ããã¾ã§ããã¤ã³ãã§ãããã®æç¹ã§ã¯ã¾ã ã¦ã¼ã¶ã«ã¯ä½ãæç¤ºãã¦ããããããã§åå¾ãã requestToken ãæ¬¡ã«ä½¿ãã¾ããã¾ããrequestTokenSecret ãå¿ ããã¢ã§ä¿æãã¦ããã¾ãã
Configuration conf = ConfigurationContext.getInstance(); OAuthAuthorization oauth = new OAuthAuthorization(conf, consumerKey, consumerSecret); HttpClientWrapper http = new HttpClientWrapper(conf); try { HttpResponse res = http.post(conf.getOAuthRequestTokenURL(), oauth); String result = res.asString(); if (res.getStatusCode() != 200) { System.out.println(result); return false; } Map<String, String> results = OAuthUtil.parseResult(result); String requestToken = results.get("oauth_token"); String requestTokenSecret = results.get("oauth_token_secret"); } catch (TwitterException e) { e.printStackTrace(); return false; } return true;
public static Map<String, String> parseResult(String result) { String[] results = result.split("&"); Map<String, String> map = new HashMap<String, String>(); for (String param : results) { String[] kv = param.split("="); String key = kv[0]; String value = kv[1]; map.put(key, value); } return map; }
Twitter4J ã®å½¹è ãã¡
- Configuration ã¯ã©ã¹
- Twitter4J ã®è¨å®æ å ±ãä¿æãã¦ãã¾ããã·ã³ã°ã«ãã³ãªã®ã§ããããã¦ã¤ã³ã¹ã¿ã³ã¹ãåå¾ãã¦æ§ã ã«ä½¿ç¨ãã¾ãã
- OAuthAuthorization ã¯ã©ã¹
- Twitter4J ã§ OAuth ã®èªè¨¼æ å ±ãæ±ãã¯ã©ã¹ã§ãããã®æç¹ã§ã¯ã¾ã consumerKey 㨠consumerSecret ããæã¡ã¾ããã
- HttpClientWrapper ã¯ã©ã¹
- GAE/j ã§ã¯å¤é¨ãµã¤ãã«å¯¾ãã¦ã½ã±ãããéããã¨ãã§ãããApache Commons Http Client ãªã©ã®æ®éã® HttpClient ã¯è»ä¸¦ã¿å ¨æ» ã¨ããç¶æ³ã®ä¸ãHttpClientWrapper ã¯ãGAE/j ã§ãå©ç¨å¯è½ãª HttpURLConnection ãç¶æ³ã«å¿ãã¦ä½¿ç¨ã㦠GAE/j ä¸ã§ãã¹ã ã¼ãºãªåä½ãå¯è½ã¨ãããè¶ ãã¤ã¹ãªã¯ã©ã¹ã§ãã
ç¬èªã¡ã½ãã
- OAuthUtil.parseResult ã¡ã½ãã
- HttpResponse#asString() ã¡ã½ããã§ã¯ãåã«ãµã¼ãããã®ãªãã©ã¤ãæååã§è¿ãã¦ãã¾ããTwitter API ã®ä»æ§ä¸ãOAuth èªè¨¼æ®µéã§ã¯ãåå=å¤&åå=å¤&åå=å¤... ã¨ããæååãè¿ã£ã¦ããã®ã§ãããã Map ã«ãã¼ã¹ããã ãã§ãã
OAuth èªè¨¼ã®è¦æ±
åã«ä»¥ä¸ã® URL ãã¦ã¼ã¶ã«è¡¨ç¤ºã㦠(é常ããã©ã¦ã¶ã§ããã°ãªãã¤ã¬ã¯ã) ã¦ã¼ã¶ããã®èªè¨¼è¨±å¯ãå¾ ã¡ã¾ããèªè¨¼ã許å¯ãããã¨ãConsumerKey ãåå¾ããéã«ç»é²ããã³ã¼ã«ãã㯠URL ã«çµæãè¿ã£ã¦ãã¾ãã
https://twitter.com/oauth/authorize?oauth_token=requestToken https://twitter.com/oauth/authenticate?oauth_token=requestTokenããã§ãauthorize ã¯ãå¿ ãæ¯åã¦ã¼ã¶ã®æåã«ããèªè¨¼ãå¿ è¦ã«ãªãã¾ãã
authenticate ã®å ´åãååã®ã¿èªè¨¼ãå¿ è¦ãªã ãã§ãä¸åèªè¨¼ãã¦ãã¾ãã°æ¬¡åããã¯èªåçã«ã³ã¼ã«ããã¯ãå¼ã°ããããã«ãªãã¾ãã大åã®ã¦ã§ããµã¼ãã¹ã§ã¯ãã¡ãã使ã£ã¦ã¾ããã
ã¡ãªã¿ã« TwitAPI.js ã§ã¯ããã®æ§è³ªä¸ç°¡åã«èªè¨¼æ å ±ãæ¨ªåããããã¨ãå¯è½ãªã®ã§ãauthorize ã®ã¿å©ç¨å¯è½ã«ãã¦ãã¾ãã
ã¢ã¯ã»ã¹ãã¼ã¯ã³ã®åå¾
ã¦ã¼ã¶ãã OAuth èªè¨¼ã許å¯ãããã¨ãã³ã¼ã«ãã㯠URL ã«çµæãè¿ã£ã¦ãã¾ãããã®éããªã¯ã¨ã¹ããã©ã¡ã¼ã¿ã¨ã㦠oauth_token ãæ¸¡ãããã®ã§ãããã requestToken ã¨è¦ãªãããã¢ã§ä¿æãã¦ããã requestTokenSecret ãåãåºãã¾ããå度 Twitter ãµã¼ãã«åãåãããçµæå¾ããããoauth_token 㨠oauth_token_secret ããçã«éè¦ãªã¢ã¯ã»ã¹ãã¼ã¯ã³ã«ãªãã¾ãããããããã°ãOAuth èªè¨¼ã®çµæå¾ãããã対象ã¢ããªã±ã¼ã·ã§ã³å°ç¨ã®ãã¹ã¯ã¼ãã®ãããªãã®ã§ãããã®éãåã¦ã¼ã¶ã®ã¦ãã¼ã¯ãã¼ã§ãã user_id ã¨è¡¨ç¤ºä¸ã®ååã§ãã screen_name ãå¾ãããã®ã§ãããããã¹ã¦ãã»ããã«ãã¦ä¿æãã¦ããã¾ãã
ãã ãscreen_name ã«é¢ãã¦ã¯ã¦ã¼ã¶è¨å®ã§å¤æ´ãå¯è½ãªã®ã§ãããã¢ããªå´ã§ã¦ã¼ã¶ãã¨ã®æ å ±ãä½ãä¿åããå ´åãuser_id ã«é¢é£ã¥ãã¦ä¿åãã¦ããå¿ è¦ãããã¾ãã
Configuration conf = ConfigurationContext.getInstance(); AccessToken accessToken = new AccessToken(requestToken, requestTokenSecret); OAuthAuthorization oauth = new OAuthAuthorization(conf, consumerKey, consumerSecret, accessToken); HttpClientWrapper http = new HttpClientWrapper(conf); try { HttpResponse res = http.post(conf.getOAuthAccessTokenURL(), oauth); String result = res.asString(); if (res.getStatusCode() != 200) { System.out.println(result); return false; } Map<String, String> results = OAuthUtil.parseResult(result); String accessToken = results.get("oauth_token"); String accessTokenSecret = results.get("oauth_token_secret"); String userId = results.get("user_id"); String screenName = results.get("screen_name"); } catch (TwitterException e) { e.printStackTrace(); return false; } return true;
Twitter4J ã®å½¹è ãã¡
- AccessToken ã¯ã©ã¹
- Twitter4J ã§ OAuth ã®ãã¼ã¯ã³æ å ±ãæ±ãã¯ã©ã¹ã§ãããã®æç¹ã§ã¯ä¸æãã¹ã¯ã¼ãã«ç¸å½ãããrequestToken ãä¿æãã¾ãã
- OAuthAuthorization ã¯ã©ã¹
- åã¨éã£ã¦ãå徿¸ã¿ã®ãªã¯ã¨ã¹ããã¼ã¯ã³æ å ±ãæ¸¡ãã¾ãããããããã¨ã§ãå ã»ã©ã¦ã¼ã¶ã OAuth èªè¨¼ããçµæãçµã³ã¤ã㦠Twitter å´ã«ä¼ãããã¨ãã§ãã¾ãã
Twitter API ã®å¼ã³åºã
accessToken 㨠accessTokenSecret ãå¾ãããã°ãå¾ã¯ããã使ã£ã¦ä»»æã® Twitter API ãå¼ã³åºããããã«ãªãã¾ããTwitter API ã¯ä½¿ç¨ãã HTTP ã¡ã½ããã«ãã广ãç°ãªãã®ã§ GET/POST/DELETE ã«å¿ãã¦ã使ç¨ãã Java ã®ã¡ã½ãããç°ãªãã¾ãã
Configuration conf = ConfigurationContext.getInstance(); AccessToken accessToken = new AccessToken(accessToken, accessTokenSecret); OAuthAuthorization oauth = new OAuthAuthorization(conf, consumerKey, consumerSecret, accessToken); HttpClientWrapper http = new HttpClientWrapper(conf); String url = "https://twitter.com/some_api_path.json"; HttpParameter[] parameters = new HttpParameter[]{new HttpParameter(name1, value1), new HttpParameter(name2, value2)}; try { HttpResponse res = http.get(url, parameters, oauth); // HttpResponse res = http.post(url, parameters, oauth); // HttpResponse res = http.delete(url, parameters, oauth); String result = res.asString(); if (res.getStatusCode() != 200) { System.out.println(result); return false; } // Document document = res.asDocument(); // for xml // JSONObject jsonObj = res.asJSONObject(); // for json object // JSONArray jsonArr = res.asJSONArray(); // for json array } catch (TwitterException e) { e.printStackTrace(); return false; } return true;
Twitter4J ã®å½¹è ãã¡
- AccessToken ã¯ã©ã¹
- åã¨éã£ã¦ã䏿ãã¹ã¯ã¼ãã«å½ãã requestToken ã§ã¯ãªããèªè¨¼æ¸ã¿ã® accessToken ãä¿æãã¾ãã
- OAuthAuthorization ã¯ã©ã¹
- èªè¨¼æ¸ã¿ã®ã¢ã¯ã»ã¹ãã¼ã¯ã³æ å ±ãæ¸¡ããã¨ã§ãä»»æã® API ãå¼ã³åºãå¯è½ã«ãªãã¾ãã
- url
- ä»»æã® Twitter API ã® URL ãæå®å¯è½ã§ããTwitter API ã®ä»æ§ã¨ãã¦ãæ¡å¼µåãã«å½ããé¨åããjson ã¨ã xml ã«å¤ããã¨ãTwitter ãè¿ãçµæã®ãã©ã¼ããããå¶å¾¡ã§ãã¾ãã詳ããã¯ãTwitter API ã®ããã¥ã¡ã³ããåç §ãã¦ãã ããã
- HttpParameter ã¯ã©ã¹
- HttpClientWrapper ã¯ã©ã¹ã«ãä»»æã®ãã©ã¡ã¼ã¿ã渡ãããã«ä½¿ãã¾ããã©ããã£ããã©ã¡ã¼ã¿ãæå¹ã«æ©è½ãããã¯ãTwitter API ã®ããã¥ã¡ã³ããåç §ãã¦ãã ããã
ãã¨ãã
Twitter4J ã使ç¨ããã»ã¨ãã©ã®äººã¯ãæåããç¨æããã¦ãã便å©ã¡ã½ããã§ååäºè¶³ããã¨æãã®ã§ãOAuth é¨åã®ã¿ä½¿ç¨ããã¨ãã£ãç¨éã¯éå®çãã¨æãã¾ããä¾ãã°ãTwitter4J æªå¯¾å¿ã®æ° API ã使ãããå ´åããä»åã®ã±ã¼ã¹ã®ããã«ç¬èªã®ã¢ããªã§å¤ãã£ããã¨ããããå ´åãªã©ã§ããããããã ããããã£ãç¨éãæ³å®ãããã®ããã«ãTwitter4J ã®ã¯ã©ã¹é¡ã¯é常ã«ããã§ãã¦ãã¦ãã¨ã¦ã使ããããã®ã§å©ããã¾ããã
æ¹ãã¦ãTwitter4J ã®ä½è æ§ã«ã¯è¬è¾ãè¿°ã¹ããã¨æãã¾ãã
ã«ãã´ãª: Development ã¿ã°: twitter java