본문 바로가기

SNS

JAVA 트위터 연동하기

기존에 구글 스크립트를 이용해서 연동하고 있었는데, 어느순간 갑자기 연동이 안된다....

알고보니 구글 스크립트 2개를 가져다 쓰고 있었는데 이 구글 스크립트 URL에서 404 오류가 나는 것이다.

Oauth라고 인증관련 스크립트인데 URL은 다음과 같다.

<script src="http://oauth.googlecode.com/svn/code/javascript/oauth.js"></script>

<script src="http://oauth.googlecode.com/svn/code/javascript/sha1.js"></script>


다시 스크립트로 작업을 하기 위해 찾아 헤매다가 답이 보이지않고 위 스크립트 관련 코멘트도 발견되지 않아서 결국 java로 개발하기로 했다. 라이브 러리는 twitter4j를 사용하였다. twitter4j가 static으로 돌아가고 있어서 static으로 처리하는 걸 고려해보아야한다. 일딴 빠르게 작업하기 위해 모두 하드코딩으로 작업했다.


SnsController 를 만들고 다음 코드를 static으로 선언했다.

// Twitter

static String accessToken = ""; //Access Token

static String accessSecret = ""; //Access Token Secret

static String consumerKey = ""; //Consumer Key (API Key)

static String consumerSecret = ""; //Consumer Secret (API Secret)

static{

// Twitter

Twitter twitter = TwitterFactory.getSingleton();

twitter.setOAuthConsumer(consumerKey, consumerSecret);

}


String 변수 4개는 반드시 필요하니 정의해주고 static 블럭에서 Consumer를 초기화 하였다. 이 부분은 한번 설정하면 다시 할 필요가 없기 때문에 별도로 정의했다. 매번 시도하려고 해도 에러가 발생한다. 다음은 소스 부분이다.

import java.text.SimpleDateFormat;

import java.util.Date;

import java.util.List;

import java.util.Map;


import twitter4j.JSONArray;

import twitter4j.JSONObject;

import twitter4j.Paging;

import twitter4j.Status;

import twitter4j.Twitter;

import twitter4j.TwitterFactory;

import twitter4j.User;

import twitter4j.auth.AccessToken;



ModelAndView mav = new ModelAndView("sns/twitter");

try {

logger.info("TwitterFactory.getSingleton() start");

Twitter twitter = TwitterFactory.getSingleton();

AccessToken accesstoken = new AccessToken(accessToken, accessSecret);

twitter.setOAuthAccessToken(accesstoken);

User user = twitter.verifyCredentials();

Paging paging = new Paging(1, 16);

List<Status> list = twitter.getUserTimeline(paging);

JSONArray jsonArr = new JSONArray();

System.out.println("타임라인 계정:"+user.getScreenName());

for(Status status : list) {

JSONObject jsonItem = new JSONObject();

jsonItem.put("screen_name",status.getUser().getScreenName());

jsonItem.put("id",status.getId());

jsonItem.put("text",status.getText());

SimpleDateFormat sdf = new SimpleDateFormat("yyyy년 M월 d일 a h:mm");

jsonItem.put("created_at", sdf.format(status.getCreatedAt()));

jsonArr.put(jsonItem);

}

mav.addObject("jsonArr", jsonArr);

} catch (Exception e) {

e.printStackTrace();

}


return mav;


상단에 import는 다른 타입으로 했다가 삽질한게 몇개 있어서 넣었다. 동일한 클래스가 다른 패키지에도 존재하니 주의해서 넣자. 이제 한부분씩 설명해보자.

Twitter twitter = TwitterFactory.getSingleton();

AccessToken accesstoken = new AccessToken(accessToken, accessSecret);

twitter.setOAuthAccessToken(accesstoken);


트위터 accesstoken 처리 부분이다.

이제 타임라인을 가져오는 부분을 보자

Paging paging = new Paging(1, 16);

List<Status> list = twitter.getUserTimeline(paging);


new Paging은 페이지의 리스트를 가져오는데, 1페이지에 글의 갯수는 16개라는 뜻이다. 페이징 기능 참 구현하기 쉽겠다.

JSONArray jsonArr = new JSONArray();


for(Status status : list) {

JSONObject jsonItem = new JSONObject();

jsonItem.put("screen_name",status.getUser().getScreenName());

jsonItem.put("id",status.getId());

jsonItem.put("text",status.getText());

SimpleDateFormat sdf = new SimpleDateFormat("yyyy년 M월 d일 a h:mm");

jsonItem.put("created_at", sdf.format(status.getCreatedAt()));

jsonArr.put(jsonItem);

}

mav.addObject("jsonArr", jsonArr);


json으로 변환하는 부분이다. JSONArray를 이용하여 리스트를 만들어주면 되겠다. 그리고 간만에 jsp를 해서 까먹고 있었는데, 출력하는  jsp파일 안에  page 설정이나 taglib 설정은 하면 안된다. 공백이 들어가서 한참 고생했다. 내용에는 ${jsonArr} 만 정의하니 잘되네... 하.. 아까운 내 시간...


일딴 좀 급하게 만든 감이 있어서 어설프지만 시간이 없는 관계로 이렇게 적용하려고 한다. 혹시 이상한 부분이 있다면 언제나 코멘트 환영이다.


참고한 사이트가 많은데, 솔직히 도움된 사이트는 몇개 없다.


http://twitter4j.org/ko/code-examples.html

http://mycup.tistory.com/151