twitter4j 라이브러리 이용하기


트위터는 API를 통해서 메쉬업 개발을 허용하고 있습니다. 이 트위터 API의 이용을 보다 편리하게 사용 할 수 있는 라이브러리인 twitter4j 를 사용해 보겠습니다.

우선 twitter4j 홈페이지로 가서 Jar 파일을 다운 받아야 합니다.

바로가기 : twitter4j 홈페이지


twitter4j 홈페이지

twitter4j 홈페이지



밑으로 내려보면 Download 라고 하는 곳이 있습니다. 이곳에서 twitter4j-x.x.x.zip 을 다운받습니다. ( 안드로이드 어플리케이션을 개발하시는 분들은 그 밑에 있는 twitter4j-android-x.x.x.zip 을 다운받으시면 됩니다.


twitter4j-x.x.x.zip 의 내용

twitter4j-x.x.x.zip 의 내용




그 안에 보시면 lib 라고 하는 폴더가 있습니다.


twitter4j Jar 파일

twitter4j Jar 파일



이곳에 있는 여러 Jar 파일 중, twitter4j-core-x.x.x.jar 파일을 가져다 사용하시면 됩니다.

twitter4j는 트위터 API를 보다 쉽게 이용 할 수 있도록 편리한 메소드들을 제공합니다. 트위터 어플리케이션 개발하시는 분들에겐 필수라고 할 수 있겠지요. ^^



JSP 세션 ID와 Localhost, 127.0.0.1



트위터 API를 이용해서 서드파티 어플리케이션을 개발 할 때, 주의해야 할 점이 있습니다. 바로 127.0.0.1 과 localhost 를 구별해야 한다는 것이죠.

트위터 어플리케이션을 개발 할 경우 실수 할 수 있는 부분이 있습니다.



이런식의 흐름일 경우 세션이 공유되지 않아 중요한 정보를 사용 할 수 없습니다. 이클립스를 이용해서 JSP를 개발 할 경우 톰캣 서버의 호스트 이름이 기본적으로 localhost로 되어 있습니다. localhost라는 도메인을 가지고 서버에 페이지가 생성되는 것이지요.

localhost라는 도메인을 가지고 있는 페이지에서 세션에 데이터를 저장하고 OAuth 로그인 페이지로 넘어갑니다. dev.twitter.com에서 어플리케이션의 리디렉션 URL을 지정할 수 있습니다. OAuth 로그인이 완료되면, 리디렉션 URL로 oauthToken과 함께 넘겨주게 되는데, 그 리디렉션 URL에는 localhost를 지정 할 수 없습니다.

그래서 아무 생각없이 127.0.0.1을 입력하게 됩니다. ( hosts 파일에 보시면 localhost 와 127.0.0.1은 이름만 다를뿐 localhost가 127.0.0.1 이죠. )

하지만 이렇게 할 경우 정상 동작하지 않습니다. 그 이유는 localhost와 127.0.0.1 이 세션 ID를 공유하지 않기 때문입니다.

과연 실제로도 그런지 테스트를 해보고 싶으신 분들은 localhost 페이지에서 Request.getSessionID() 를 해보시고, 리디렉션 URL( 127.0.0.1 )에서 Request.getSessionID()을 해보시기 바랍니다. 세션 ID가 다르게 뜨는 걸 볼 수 있습니다.




따라서 이클립스의 JSP 프로젝트 생성시, 서버의 호스트 이름을 127.0.0.1 로 하시기 바랍니다.

즉,



이런식으로 해 주셔야 세션이 공유되고, 트위터의 서드파티 어플리케이션 개발을 순조롭게 하실 수 있습니다.

물론 직접 웹 서버에 올려서 개발을 하실 경우엔 상관없습니다...




Twitter4j 라이브러리 버그 리포팅 "401:Authentication credentials..."


트위터 웹 어플리케이션을 개발하면서 Twitter4j 라는 어플리케이션을 사용하고 있는데요. 오픈 라이브러리이다보니 자잘한 버그들이 많이 있습니다. 이번에 잡은 버그는 JSP로 서드파티 어플리케이션을 개발하면서 나왔던 버그입니다. 웹에 공개되어 있는 Twitter4j 라이브러리와 JSP 연동 예제를 따라하다보면 다음과 같은 에러 메시지가 뜨게 됩니다.
( 에러 메시지라고 할까요. 아니면 Exception이라고 할까요.)




401:Authentication credentials (https://dev.twitter.com/docs/auth) were missing or incorrect. Ensure that you have set valid conumer key/secret, access token/secret, and the system clock in in sync.
The screen name / password combination seems to be invalid.Relevant discussions can be on the Internet at:
    http://www.google.co.jp/search?q=96430884 or
    http://www.google.co.jp/search?q=00002d45
TwitterException{exceptionCode=[96430884-00002d45 9aae86e9-14926980], statusCode=401, retryAfter=-1, rateLimitStatus=null, featureSpecificRateLimitStatus=null, version=2.2.4}


이 에러 메시지가 떠서 한참을 고생했었는데, AccessToken을 얻는 과정에서 뭔가 잘 못 되었나봅니다. 일단 Exception이 발생한 부분을 보면



if (token.equals(oauthToken)) {
 try
{          
accessToken = twitter.getOAuthAccessToken(oauthToken,requestToken.getTokenSecret());
 }
catch (TwitterException e)
{
            e.printStackTrace();
            System.out.println("트위터인증실패 : " + e);
}


dev.twitter.com 에서 지정해 놓은 리디렉션 URL에 추가되어 얻어진 oauthToken( 결국 requestToken.getToken()에서 얻어진 토큰 )과 requestToken.getTokenSecret() 으로 얻어진 Secret 을 이용해서 AceessToken을 얻어 이것을 이용해 OAuth 로그인을 한 계정의 정보에 접근을 하게 됩니다.

이 때, AccessToken을 얻는 과정에서 Exception이 발생하게 되는데, 왜 그런지는 모르겠지만 오버라이드 된 다른 메소드를 사용해서 해결했습니다.

해결 방법은...


a.jsp ( OAuth 로그인 이전 페이지... 여기서 OAuth 로그인 페이지로 넘어감 )

request.getSession().setAttribute("ReqToken",requestToken);


리퀘스트 토큰 자체를 세션에 저장합니다. ( 원래는 requestToken.getToken(), requestToken.getTokenSecret() 을 이용해서 토큰과 시크릿을 만들어서 세션에 저장했었죠. )

b.jsp ( OAuth 로그인 이후, 리디렉션 URL로 저장된 곳 )

RequestToken reqToken = (RequestToken)request.getSession().getAttribute("ReqToken");

...

accessToken = twitter.getOAuthAccessToken(reqToken);


이런식으로 세션에 RequestToken 객체를 저장했다가 다시 꺼내와서 RequestToken 으로 캐스팅해서 AccessToken을 얻는 방식을 사용하면 됩니다.

다른 해결 방법이 있는지는 모르겠지만 저는 이런식으로 Twitter4j 라이브러리가 던지는 Exception을 해결 했습니다.




+ Recent posts