Twitter4j로 웹에서 자동으로 트윗할 수 있도록 하는 기능을 만들려고 했는데, 검색결과가 2015년 이후로는 거의 없다시피 하고, pin방식은 아예 없어서 작성해봅니다.

 

1. 트위터 앱 생성과 키 발급

 

  우선 앱이 있어야 사용자가 인증을 받을 수 있습니다

트위터_개발자_계정_취득하기 (2021년 글)

트위터_API_사용_준비 (2020년 글, 일부 UI의 차이)

 

  자세히 설명해 둔 블로그로 이 부분은 설명을 대체하겠습니다.

  *2021년들어 인증 절차가 까다로워졌다는 말이 있던데, 저는 정직하게 '내 서비스랑 연동해서 자동 트윗하는 봇 만들꺼다' 하고 보냈더니 별 추가 절차 없이 통과되었습니다. 

 

  개발자 계정을 잘 발급 받으시고, projects / app까지 생성하시면 다음과 같은 항목을 보실 수 있습니다.

  

  Access Token이 없으시면 APP - Keys and Tokens에서 발급받으시면 됩니다.

  모든 항목은 단 한번만 보여지며, 재발급시엔 기존 토큰들이 날아가는 듯 하니 어딘가 저장해놓고 사용하는게 좋겠습니다.

 

  Access Token을 이용하면, 트위터 로그인 과정 없이도 자바 코드상에서 인증받고, 트윗을 쓰고, RT하고, 답글을 다는 등 트위터 이용이 가능합니다.

 

  하지만 이 때 사용되는 계정은 app을 생성한 개발자 계정입니다. 지금 저는 봇계정을 만들어 그쪽에서 자동으로 트윗되도록 하고 싶은 상황이니, 본 계정을 사용할 수 있다고 해도 별 소용이 없습니다.

 

  이럴때 사용하는 게 위의 Consumer key / secret입니다. 이 값들로 우리는 다른 계정에게 Access Token 요청을 보낼 수 있으며, 요청이 수락되면 그 계정의 Access Token을 얻어 조작할 수 있게 되죠.

 

익숙한 이미지

  트위터 앱 승인 함부로 하면 안된다는 이유가 이겁니다. ID / PW가 해킹당하지 않더라도 재미있는 서비스 앱을 승인해줬는데 어느순간 내 계정에 광고가 올라오는 상황이 발생할 수 있는 것이죠.

 

  이만 각설하고, Consumer key / secret으로 다른 계정의 Access Token 획득 방법에 대해 알아보겠습니다.

 

2. 해당 키로 인증해 pin 발급받기

 

  우선, JAVA에서 twitter 서비스를 사용할 수 있게 해주는 라이브러리를 추가해야 합니다.

  twitter4j 다운받기

  

  여러 jar 파일 중 twitter4j-core-x.x.x파일만 사용해도 충분합니다

 

  우선 위에서 취득한 Consumer key / secret을 이용해 사용자에게 앱 인증 요청을 보내야합니다.

 

//전역변수 선언
static String accessToken="";
static String accessSecret="";
	
static Twitter twitter;
RequestToken requestToken=null;
AccessToken finalAccessToken=null;

//twitter 객체 초기화 + consumer 인증 set
twitter = TwitterFactory.getSingleton();
twitter.setOAuthConsumer(TwitterInfo.getInstance().getAPIKey(), 
		TwitterInfo.getInstance().getAPISecretKey());

  twitter 객체를 획득한 후, setOAuthConsumer 함수를 이용해 Consumer의 key와 secret을 설정합니다.

  해당 함수는 2번째 실행부터는 에러가 발생한다고 하는데, singleton 패턴이 적용된 생성자 내부에서 실행하여 에러 발생을 막았습니다.

 

twitter = TwitterFactory.getSingleton();
		
requestToken=null;
try {
	requestToken = twitter.getOAuthRequestToken();
}catch(TwitterException e) {
	e.printStackTrace();
}
System. out.println(requestToken.getAuthorizationURL());
        

  그 후 getOAuthRequestToken() 함수를 이용해 requestToken을 획득합니다.

  requestToken.getAuthorizationURL() 의 값이 인증 URL입니다. 서버라면 이 주소로 redirect되도록 할 수 있습니다.

 

  그 후는 사용자가 트위터 계정을 로그인하고, 앱 사용 승인버튼을 눌러주면 됩니다.

 

3. pin으로 인증해 최종 accesstoken받기

 

  원래는 사용자가 승인버튼을 누르면, 인증정보를 담은 채 본래 인증창이 비롯된 페이지로 되돌아간다고 합니다.

  하지만 따로 돌아갈 url을 지정해놓지 않았거나, 저처럼 호스팅되지 않은 서버에서 온 요청같은 경우 이 방법은 사용할 수 없습니다.

 

  그래서 트위터는 7자리 숫자 pin을 제공하며, 서비스에서 해당 pin으로 다시 요청을 보내면 그 때 accessToken을 발급해 줍니다.

  대충 맨날 하는 문자인증과 비슷하다고 보시면 될 듯 합니다.

 

  처리 방법도 문자인증 방법과 비슷합니다. client에게 네가 받은 그 정보를 다시 나에게 달라고 요청하는 것이죠.

  (물론 제 경우는 서버도 client도 같은 시스템이므로 어떻게든 우겨넣기만 하면 상관없긴 합니다)

 

public void tweetGetAccessTokenTest(String pin) {
	try {
		finalAccessToken = twitter.getOAuthAccessToken(requestToken, pin);
	}catch(TwitterException e) {
		e.printStackTrace();
	}
}

  그렇게 받은 pin 정보는, 이전에 취득했던 requestToken과 함께 다시 한번 트위터에게 제출됩니다.

  getOAuthAccessToken함수를 이용합니다.

 

  이 과정까지 성공적으로 완료했다면, 정상적으로 AccessToken을 획득한 것으로 이제 이 계정은 제 맘대로 할 수 있는 겁니다. (안됩니다)

 

twitter.setOAuthAccessToken(finalAccessToken);
	try {
    	//계정명 획득
		User user = twitter.verifyCredentials();
		System.out.println(user.getScreenName());
		
        //계정에 트윗 등록
		String msg = "this is test tweet from application";
		Status status = twitter.updateStatus(msg);		
	}catch(Exception e) {
		e.printStackTrace();
}

정상적으로 출력 / 트윗되었다

  다음 코드와 같이, AccessToken을 Set해주기만 하면 사용자 ID를 가져올 수도 있고, 원하는 문자열로 트윗을 보낼 수도 있습니다.

 

4. AccessToken을 저장해 둬 재사용 가능하게 하기

 

  여기까지만 하면, 매번 AccessToken을 획득해야한다는 수고로운 일이 생깁니다.

  물론 그럴 필요는 없습니다. AccessToken만 저장해두면 언제든지 꺼내서 재사용이 가능해집니다.

 

  위에서 획득한 AccessToken은 Consumer key/secret처럼 key/secret 두가지 token으로 되어 있습니다.

  getToken() 함수와, getTokenSecret()함수가 각 token을 획득 할 수 있으며, 플젝에 직접 박아놓든, DB에 저장하거나 한 후 필요할 때 조회하면 됩니다.

 

twitter = TwitterFactory.getSingleton();
finalAccessToken=new AccessToken(TwitterInfo.getInstance().getAccessToken(), 
		TwitterInfo.getInstance().getAccessSecret());

twitter.setOAuthAccessToken(finalAccessToken);




try {
	User user = twitter.verifyCredentials();
	System.out.println(user.getScreenName());
	
	String msg = "this is test tweet from application";
	Status status = twitter.updateStatus(msg);
}catch(Exception e) {
	e.printStackTrace();
}

  저는 TwitterInfo class에 값을 직접 저장했으며, consumer token과 함께 생성자에서 호출해 설정하는 식으로 마무리했습니다.

 

 

  이상으로 twitter4j를 이용한 트위터 인증 획득 방법을 마치겠습니다.

 

+ Recent posts