2012年4月15日日曜日

フォロワーさんのTwitterクライアントを表示するアプリ

フォロワーさんのTwitterクライアントを表示するアプリを作ってみました。

ソースはここアプリはここ

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();
   ResponseList userList = 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);
  }
 }