ソースはここで アプリはここ
Twitter4jとGoogle Apps EngineとjQuery Mobile使いました。
まず認証部分。 Twitter4Jを使って、ユーザにアプリを承認させます。 ユーザさんが承認してくれるとgetOAuthRequestTokenの引数で指定したコールバックに指定した画面へかえってくる。
private void doOAuth(HttpServletRequest req, HttpServletResponse resp) throws IOException { Twitter twitter = (new TwitterFactory()).getInstance(); try { RequestToken reqToken = twitter .getOAuthRequestToken(req.getRequestURL() + "?" + QUERY_MODE + "=" + QUERY_CALLBACK); HttpSession session = req.getSession(); session.setAttribute(SESSION_REQUEST_TOKEN, reqToken); resp.sendRedirect(reqToken.getAuthenticationURL()); } catch (TwitterException e) { Logger logger = Logger.getLogger(this.getClass().getName()); logger.warning(e.getMessage()); } }そしてコールバックされてきたときの処理。 ここでさっきセッション中に保存したRequest TokenとTwitterから返されたVerifierを使ってAccess Tokenを取得しにいく。
private void doCallBack(HttpServletRequest req, HttpServletResponse resp) throws IOException { HttpSession session = req.getSession(); AccessToken accessToken = null; accessToken = (AccessToken)session.getAttribute(SESSION_ACCESS_TOKEN); // in case of already having access token if(accessToken != null){ doWriteHTML(req, resp); }else{ Twitter twitter = (new TwitterFactory()).getInstance(); String verifier = req.getParameter(SESSION_AUTH_VERIFIER); try { accessToken = twitter.getOAuthAccessToken((RequestToken) session .getAttribute(SESSION_REQUEST_TOKEN), verifier); } catch (TwitterException e) { Logger logger = Logger.getLogger(this.getClass().getName()); logger.warning(e.getMessage()); } if (accessToken != null) { session.setAttribute(SESSION_ACCESS_TOKEN, accessToken); session.removeAttribute(SESSION_REQUEST_TOKEN); doWriteHTML(req, resp); } else { resp.setContentType("text/plain"); } } }無事取得できた後は画面表示のためのHTMLを動的に生成していく まずフォロワーさん一覧を取得するためにgetFriendsIDs()を呼び出す。 その後そのフォロワーさんのステータスを取得するためにlookupUsers()を呼び出す。 Twitter利用者の使ってるクライアントソフト名はStatusクラスのsorceというプロパティに入ってるので、 User->Status->Sourceとたどっていくことで欲しい情報がとれます。
private void writeBodyContentList(HttpServletRequest req, HttpServletResponse resp)throws IOException { HttpSession session = req.getSession(); Twitter twitter = TwitterFactory.getSingleton(); AccessToken token = (AccessToken) session .getAttribute(SESSION_ACCESS_TOKEN); if (token == null) { logger.warning("access token missing!"); } twitter.setOAuthAccessToken(token); try { IDs ids = twitter.getFriendsIDs(-1); long[] friendIds = ids.getIDs(); ResponseListuserList = twitter.lookupUsers(friendIds); for (User user : userList) { String name = user.getName(); URL imageURL = user.getProfileImageURL(); resp.getWriter().print("<li>"); resp.getWriter().print("<img src='http://"); resp.getWriter().print(imageURL.getHost()); resp.getWriter().print(imageURL.getPath()); resp.getWriter().print("'/>"); resp.getWriter().print(name); String source = user.getStatus().getSource(); // composing a <a> tag, since when the source is "web", API return <a> tag. if ("web".equals(source)) { source = "<a href = http://twitter.com>web</a>"; } resp.getWriter().println(source); resp.getWriter().println("</li>"); } } catch (TwitterException e) { resp.getWriter().println(e); } }
0 件のコメント:
コメントを投稿