フォロワーさんの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);
}
}