트위터 API로 트위터에 접속하는 방법을 설명한다. 언어는 JSP이고 라이브러리는 twitter4j이다.
이클립스 설정은 아래의 글을 확인하면 된다.
http://duongame.blogspot.kr/2015/08/blog-post_16.html
개괄적인 트위터 API의 예제에 대한것은 트랙백을 참고하고, 소스위주로 설명한다. 아직은 서버가 없으므로 localhost에서 톰캣으로 한다.
먼저 트위터 개발자 계정(
http://dev.twitter.com)에 가서 create an app을 한다.
application을 만들었으면 거기서
customer key와 customer secret을 복사하여 twitter.java에 다음과 같이 입력한다.
public class TwitterClient {
public TwitterClient() {
System.out.println("TwitterClient.TwitterClient");
}
Twitter twitter;
RequestToken requestToken = null;
AccessToken accessToken = null;
final String CONSUMER_KEY = "IAsSj*****************";
final String CONSUMER_SECRET = "MKxMB**********************************";
그리고 Callback URL을 등록을 한다. localhost는 등록이 되지 않으므로 127.0.0.1:8080으로 등록하자. 위에서는 http://127.0.0.1:8080/twt/redirect.jsp로 등록을 했다.
다음 이클립스 화면과 같이 TwitterClient.java와 index.jsp, main.jsp, signin.jsp, redirect.jsp를 만들자.
index.jsp는 그냥 main.jsp로 redirect하는 역할만 한다. 나중에 메인 페이지를 다른것으로 만들기 위해서 만들어 놨다.
<script>
location.href = "main.jsp";
</script>
main.jsp는 signin.jsp에 링크만 걸어놨다.
<a href="signin.jsp">트위터</a>
signin.jsp는 requestToken을 만들고 authorizationURL을 만들어서 twitter로 redirect를
한다. requestToken을 만드는 과정은 twitter4j에 customer key와 customer secret을 넘겨주면
완성된다. redirect.jsp에 넘겨주기 위해 생성된 requestToken과 TwitterClient 객체를
session에 저장한다.
[signin.jsp]
<
%@page import="twt.TwitterClient"%>
<
%@page import="twitter4j.auth.RequestToken"%>
<%
TwitterClient tw = new TwitterClient();
RequestToken token = tw.getRequestToken();
String authUrl = token.getAuthorizationURL();
session.setAttribute("requestToken", token);
session.setAttribute("tw", tw);
%>
<script>
location.href = "<%=authUrl%>";
</script>
[TwitterClient.java]
public RequestToken getRequestToken()
{
twitter = new TwitterFactory().getInstance();
twitter.setOAuthConsumer(CONSUMER_KEY, CONSUMER_SECRET);
requestToken = null;
try {
requestToken = twitter.getOAuthRequestToken();
}
catch(TwitterException te) {
te.printStackTrace();
}
System.out.print("TwitterClient.getRequestToken: ");
System.out.print(requestToken.getToken() + " ");
System.out.println(requestToken.getAuthorizationURL());
return requestToken;
}
그러면 이제 최종적으로 redirect.jsp를 보자. 이 페이지는 twitter 서버에서 등록해둔 호출 서버로 redirect
page로 redirect되는데 우리가 127.0.0.1로 해놓았기 때문에 다시 우리 데스크탑 서버로 돌아온다.
parameter중에서 oauth_token이 그 응답이다. 이것을 가지고 아까 저장해준 TwitterClient와
RequestToken을 꺼내서 getAccessToken을 하면 접속이 완료된다. 그후에 타임라인을 테스트하는 함수인
printStatuses를 부르면 이클립스 콘솔창에 현재 타임라인이 나타나는 것을 볼수 있다.
[rediect.jsp]
<
%@page import="twt.TwitterClient"%>
<
%@page import="twitter4j.auth.AccessToken"%>
<
%@page import="twitter4j.auth.RequestToken"%>
<%
// twitter에서 넘겨줌
String oauth_token = request.getParameter("oauth_token");
// signin.jsp에서 저장한 것들
RequestToken token = (RequestToken)session.getAttribute("requestToken");
TwitterClient tw = (TwitterClient)session.getAttribute("tw");
tw.getAccessToken(oauth_token, token);
tw.printStatuses();
%>
[TwitterClient.java]
public AccessToken getAccessToken(String oauthToken, RequestToken requestToken)
{
if(requestToken == null) {
System.out.print("requestToken == null");
}
if(oauthToken == null) {
System.out.print("oauthToken == null");
}
twitter = new TwitterFactory().getInstance();
twitter.setOAuthConsumer(CONSUMER_KEY, CONSUMER_SECRET);
System.out.println("TwitterClient.getAccessToken: ");
if(requestToken.getToken().equals(oauthToken)) {
try {
System.out.print("requestToken: ");
System.out.print(requestToken.getToken() + " ");
System.out.println(requestToken.getTokenSecret());
accessToken = twitter.getOAuthAccessToken(requestToken);
//accessToken = twitter.getOAuthAccessToken(token.getToken(), token.getTokenSecret());
twitter.setOAuthAccessToken(accessToken);
System.out.print("accessToken: ");
System.out.print(accessToken.getToken() + " ");
System.out.println(accessToken.getTokenSecret());
}
catch(TwitterException te) {
te.printStackTrace();
}
}
else {
System.out.println("oauth_token error");
}
return accessToken;
}
public void printStatuses()
{
ResponseList<Status> statuses;
Paging page = new Paging();
page.count(20);
page.setPage(1);
try {
statuses = twitter.getHomeTimeline(page);
for (Status status : statuses) {
//status.getId()
System.out.println(status.getUser().getScreenName() + ":" + status.getText());
//status.getUser().getScreenName()
//status.getUser().getURL()
//status.getText()
//status.getCreatedAt()
//status.getUser().getProfileImageURL()
//status.getSource()
}
}
catch(TwitterException te) {
te.printStackTrace();
}
}
이제 실행을 해보자. 서버의 hostname은 반드시 127.0.0.1이고 port는 8080이어야 한다. hostname이 localhost라면 session문제가 생기므로 새로운 서버를 만들기 바란다.
signin.jsp를 실행한 화면
애플리케이션 승인후에 redirect.jsp를 부르는 화면
redirect.jsp로 와서 timeline을 display하는 화면