Outsider's Dev Story

Stay Hungry. Stay Foolish. Don't Be Satisfied.
RetroTech 팟캐스트 44BITS 팟캐스트

Twitter4j로 트위터 사용하기 #2

이 포스팅은 Twitter4j로 트위터 사용하기 #1에서 이어진 포스팅입니다.

Twitter4j사이트의 Code Example에 간단한 예제가 나와있어서 참고하면 되지만 너무 심플한 예제라 큰 도움은 되지 않습니다. 차라리 JavaDoc을 많이 보게 되더군요.



인증토큰 얻기
Twitter4J를 사용하려면 당연히 최신버전의 Twitter4J jar파일을 프로젝트에 추가하여 하고 해당 소스를 사용할때 당연히 import도 해야하지만 그런부분은 여기서는 생략하고 소스만 보겠습니다. ㅎ



final String CONSUMER_KEY = "발급받은 CONSUMER Key";
final String CONSUMER_SECRET = "발급받은 CONSUMER Secret 키";

Twitter twitter = new Twitter();
twitter.setOAuthConsumer(CONSUMER_KEY, CONSUMER_SECRET);

RequestToken requestToken = null;
try {
   requestToken = twitter.getOAuthRequestToken();
} catch (TwitterException e) {
}
//store requestToken.getToken() & requestToken.getTokenSecret()
//Retirect to requestToken.getAuthorizationURL()


위 코드를 통해서 토큰을 얻을 수 있습니다. requestToken.getToken()과 requestToken.getTokenSecret()에서 스트링타입의 토큰을 트위터로부터 받아오게 되고 사용자가 트위터사이트에서 인증을 허락한 뒤에 다시 사용해야 하므로 세션등에 저장해 둡니다. requestToken.getAuthorizationURL()는 트위터 인증URL에 토큰을 파라미터로 넘겨주는 주소로 다음과 같은 형태입니다.

http://twitter.com/oauth/authorize?oauth_token=인증토큰

위의 URL을 이용해서 유저를 리다이렉트 시키면 아래와 같은 화면이 나오게 됩니다.

Twitter 인증화면

제가 만들때는 구조상 아이프레임내에서 처리해야 했기 때문에 위 페이지를 아이프레임에서 띄웠습니다만 저 페이지에는 (window.top !== window.self)와 같이 페이지가 프레임에서 띄워졌는지를 검사하는 코드가 있고 프레임일 경우는 전체페이지에 띄우도록 수정해 버립니다. 이부분은 꼼수를 쓰면 막을수 있을지도 모르겠지만 프레임에서 띄우면 사용자가 URL을 볼수가 없기 때문에 트위터와 동일한 모양의 페이지를 만들어 놓고 아이디와 패스워드를 가로챌 수 있는 보안상의 문제가 있기 때문에 굳이 프레임에서 띄우지 않고 새창에서 인증이 진행되도록 하였습니다. OAuth도 인증과정은 유저에게 맡기기 때문에 URL을 사용자에게 표시해 주는 것은 중요합니다.

이제 사용자가 트위터사이트에서 해당 클라이언트의 접근을 허락할것인지 거절할 것인지를 선택합니다. 거절하게 되면 당연히 트위터의 인증을 하지못하게 되고 Allow를 하게되면 트위터가 사용자를 다시 Consumer사이트로 리다이렉트 시키게 됩니다.

http://리다이렉트URL?oauth_token=인증토큰

리다이렉트URL은 트위터 어플등록을 할 때 입력했던 URL을 이용해서 발급했던 인증토큰을 다시 파라미터로 붙혀서 보내주게 되고 파라미터명은 oauth_token입니다. 리다이렉트 페이지에서 해당 토큰을 다시 받아서 인증처리를 해주면 됩니다.



인증하기


Twitter twitter = new Twitter();
twitter.setOAuthConsumer(CONSUMER_KEY, CONSUMER_SECRET);

String oauthToken = 파라미터로 받은 oauth_token
if (저장된token.equals(oauthToken)) {
   try {
       accessToken = twitter.getOAuthAccessToken(oauthToken, 저장된serectToken);
   } catch (TwitterException e) {
   }

   twitter.setOAuthAccessToken(accessToken);

    //store oauthToke & secretToken to DB
}



받아온 oauth_token값과 앞단계에서 발급받은 토큰의 값을 기뵤해서 값을 경우에 2개의 값(token, serect token)으로  accessToken을 만들어서 twitter객체가 OAuth권한을 얻도록 합니다. 여기까지 진행되면 twitter객체를 이용해서 해당 유저의 트위터를 이용할 수 있게 됩니다. 첫 토큰획득과 2번째 비교할때의 시간텀이 길어지게 되면 트위터에서 인증을 거부합니다.

일시적인 인증이 아니라면 Token과 Secret Token을 디비에 저장해 두면 다음에 사용자가 로그인 했을 경우에도 다시 트위터의 접근 권한을 자동으로 얻을 수 있습니다.



Twitter twitter = new Twitter();
twitter.setOAuthConsumer(CONSUMER_KEY, CONSUMER_SECRET);

AccessToken accessToken = null;
accessToken = new AccessToken(저장된Token, 저장된SecretToken);
twitter.setOAuthAccessToken(accessToken);


위 코드처럼 2개의 토큰을 이용해서 twitter객체가 다시 인증된 상태로 만들면 됩니다. 이 twitter객체를 세션등에 저장해 놓고 계속 사용하면 됩니다. 그리고 트위터는 인증을 할때 유저의 스크린네임을 돌려주기 때문에 accessToken.getScreenName()를 이용하면 인증하면서 바로 스크린 네임을 얻을 수 있습니다.



트윗 가져오기


List<Status> statuses;

Paging page = new Paging();
page.count(20);
page.setPage(1);

try {
   statuses = twitter.getHomeTimeline(page);
} catch (TwitterException e) {
}

for (Status status : statuses) {
   //status.getId()
   //status.getUser().getName() 
   //status.getUser().getScreenName() 
   //status.getUser().getURL()
   //status.getText()
   //status.getCreatedAt()
   //status.getUser().getProfileImageURL()
   //status.getSource()
}


페이징이 필요할때는 Paging객체를 만들어서 사용하면 되고 사용자의 타임라인은 getHomeTimeline을 이용하여 얻습니다. 각 트윗에 대한 정보는 status객체를 통해서 얻어낼수 있고 사용자 정보는 User객체를 통해서 추가적으로 얻을 수 있습니다. 멘션이나 Direct Message는 getMentions, getDirectMessages를 통해서 가져올 수 있습니다.



트윗작성하기


Status status = null;
try {
   status = twitter.updateStatus(텍스트);
} catch (TwitterException e) {
}


트윗을 올리는 것은 아주 간단합니다. updateStatus메서드를 이용해서 텍스트를 전송하면 바로 트윗이 올라갑니다. Reply의 경우에는 twitter.updateStatus(텍스트, 리플라이할 트윗의 id); 와 같은 형태로 사용하면 됩니다.



이외에도 Twitter4j에서는 많은 기능을 제공하고 있고 거의 모든 트위터의 기능을 아주 쉽게 사용할 수 있게 잘 작성되어 있습니다. 저도 쓰는거만 만져보고 다 보지는 못했네요.
2010/02/20 03:32 2010/02/20 03:32