티스토리 뷰
트위터의 API를 사용하기 위한 방법은 여러가지가 있습니다.
https://developer.twitter.com/en/docs/twitter-api/tools-and-libraries
해당 페이지를 보면, 오피셜 툴로서는 Python, Node.js(javascript), Ruby만 제공하고 있고,
그 외의 언어는 커뮤니티 도구로서 제공되고 있습니다. (공식 제공이 아니라고 이해하고 있습니다.)
요즘에는 Java가 아닌, Python이나 Node.js 같은 것으로 연결하기 더 편한 트위터 api입니다만,
저는 한 언어로만 개발을 하기 원했고, 그래서 TwitterClient라는 부품을 활용하여 트위터와 해보았습니다.
글을 쓰는 이유는, 해당 주제의 포스팅이 2013년의 포스팅밖에 존재하지 않았고,
심지어 그 포스팅은 TwitterClient가 아닌 Twitter4j로 연동을 하고 있었기 때문입니다.
즉 기록용입니다.
들어가기에 앞서, 이 포스팅에서는 트위터 API의 각종 키를 습득하는 과정은 생략 되어있습니다.
파이썬이나 노드와 연동할 때도 필요한 중요한 정보다보니,
구글링을 하면 아주 쉽게 습득 가능한 정보기 때문입니다.
쓸대 없는 스크롤 늘림은 하지 않는 걸로..
제가 현재 개발 중인 환경은 Java11, Springboot 2.4.13 을 사용하고 있습니다.
그리고 api연동용 jar는 아래의 깃허브에서 받아 왔습니다.
https://github.com/redouane59/twittered
- build.gradle 설정
먼저 build.gradle 에 아래의 의존성을 추가해줍니다.
implementation 'io.github.redouane59.twitter:twittered:2.2'
Maven을 사용하시는 분은 깃허브쪽에 설정 방법이 나와있습니다.
깃허브에는 [ implementation("io.github.redouane59.twitter:twittered:VERSION") ] 라고 되어있는데,
버전을 안고치고 저대로 넣는 바람에 삽질을 좀 했었습니다.
https://search.maven.org/artifact/io.github.redouane59.twitter/twittered/2.2/jar
이 곳에서 정확한 버전을 찾아내어 수정 후, 정상적으로 jar를 받아 오는 것을 확인했습니다.
- 트위터 연동 메서드 작성
gradle을 리플래시 해주고, jar가 정상적으로 추가 된 것이 확인 되었다면 바로 메서드를 작성해주시면 됩니다.
우선 전체 소스
연동되고, 아이디와 연동해서 지금 기준으로부터 1주일 전까지의 트윗을 죄다 들고와 출력하는 메서드입니다.
public class TwitterLoadingService {
// 트위터 등록정보
private TwitterClient twitterClient = new TwitterClient(TwitterCredentials.builder()
.accessToken("연동용 accessToken")
.accessTokenSecret("연동용 accessTokenSecret")
.apiKey("연동용 apiKey")
.apiSecretKey("연동용 apiSecretKey")
.build());
public void TestTwitterLoading() {
LocalDateTime endLocalDateTime = LocalDateTime.now();
LocalDateTime startLocalDateTime = endLocalDateTime.minusDays(7);
// 파라메터 설정
AdditionalParameters additionalParameters = AdditionalParameters.builder()
.startTime(startLocalDateTime)
.endTime(endLocalDateTime)
.build();
UserV2 userV2 = twitterClient.getUserFromUserName("@를 제외한 트위터 아이디");
System.out.println("아이디 로딩 체크");
System.out.println("아이디 : " + userV2.getId());
TweetList tweetList =
twitterClient.getUserTimeline(userV2.getId(), additionalParameters);
System.out.println("트윗 로딩 체크");
System.out.println("가져온 트윗 수 : " + tweetList.getData().size());
for(TweetV2.TweetData tweet : tweetList.getData()) {
System.out.println("Id : " + tweet.getId());
System.out.println("text : " + tweet.getText());
System.out.println("==============================");
}
}
}
소스 살펴보자면,
// 트위터 등록정보
private TwitterClient twitterClient = new TwitterClient(TwitterCredentials.builder()
.accessToken("연동용 accessToken")
.accessTokenSecret("연동용 accessTokenSecret")
.apiKey("연동용 apiKey")
.apiSecretKey("연동용 apiSecretKey")
.build());
TwitterClient라는 객체를 만들어줌으로서, 이 객체를 통해 트위터와 통신을 하게 됩니다.
TwitterClient 클래스를 열어보면 많은 메서드들이 존재하는 걸 알 수 있구요.
필요한 메서드를 사용하여 원하는 정보를 끌어 올 수 있습니다.
많이 있기에 일일이 다 설명은 할 수 없고, 메서드 이름이 꽤나 직관적으로 되어있기 때문에 바로 알 수 있어요.
해당 메서드들의 설명은 ITwitterClientV1, ITwitterClientV2, ITwitterClientArchive 인터페이스에
영문이지만 적혀져있습니다.
그리고 지금은 토큰과 키를 직접 넣는 걸로 되어있지만, 향후 서버에 올려서 실제로 구동 시킬 때는
저 토큰이 외부에 노출 되어서는 안됩니다.
저는 Vim으로 직접 서버에 때려박는 형태로 올려서 Git에는 노출되지 않게끔 할 생각입니다만,
properties로 해결하거나 json으로 해결 하실 분은 TwitterClient의 Git에 참고할만한 부분이 존재하니 참고하시면 될 것 같습니다.
https://github.com/redouane59/twittered#with-program-argument
메서드 부분
public void TestTwitterLoading() {
LocalDateTime endLocalDateTime = LocalDateTime.now();
LocalDateTime startLocalDateTime = endLocalDateTime.minusDays(7);
// 파라메터 설정
AdditionalParameters additionalParameters = AdditionalParameters.builder()
.startTime(startLocalDateTime)
.endTime(endLocalDateTime)
.build();
AdditionalParameters라는 파라메터 클래스에 검색 조건을 집어넣습니다.
만, 파라메터 클래스에 있는 파라메터는
public static final String SINCE_ID = "since_id";
public static final String UNTIL_ID = "until_id";
public static final String START_TIME = "start_time";
public static final String END_TIME = "end_time";
public static final String MAX_RESULTS = "max_results";
public static final String NEXT_TOKEN = "next_token";
public static final String PAGINATION_TOKEN = "pagination_token";
public static final String GRANULARITY = "granularity";
이것이 전부이며, 트윗 id를 기준으로 걸러내거나, 시간을 기준으로 걸러내거나,
최대 검색갯수나 영문을 알 수 없는 토큰 같은게 있습니다.
저는 기간 설정만 있으면 되었기에 기간을 LocalDateTime 형으로 지정해줬습니다.
키워드 조건을 지정 할 수 없는게 흠이네요.
UserV2 userV2 = twitterClient.getUserFromUserName("lovelive_staff");
System.out.println("아이디 로딩 체크");
System.out.println("아이디 : " + userV2.getId());
먼저 유저네임으로 아이디를 추출합니다.
이 api로 트위터 타임라인을 검색 할 때는 id라는 것이 필요한데,
이것은 트위터 계정에 부여된 숫자로 이루어진 고유 id를 뜻합니다.
@lovelive_staff 같은건 언제든 변경 가능한 유저네임으로 취급합니다.
따라서, 현 유저네임으로 해당 유저네임의 id를 습득하는 작업을 우선적으로 진행해줘야합니다.
getUserFromUserName 메서드로 습득하며, 매개변수로는 @를 제외한 트위터 유저네임을 넣습니다.
그리고 UserV2형의 리턴값을 얻어, 리턴 받은 객체안에서 id를 습득합니다.
TweetList tweetList =
twitterClient.getUserTimeline(userV2.getId(), additionalParameters);
//getUserFromUserName
System.out.println("트윗 로딩 체크");
System.out.println("가져온 트윗 수 : " + tweetList.getData().size());
for(TweetV2.TweetData tweet : tweetList.getData()) {
System.out.println("Id : " + tweet.getId());
System.out.println("text : " + tweet.getText());
System.out.println("==============================");
}
}
그 후, 습득한 id와 설정한 검색조건(파라메터 클래스)을 가지고 타임라인을 습득합니다.
TweetList라는 단일 객체로 결과값이 돌아오는데,
이 객체 안에
private List<TweetV2.TweetData> data;
라는 데이터 리스트가 들어있습니다.
저 TweetData 객체 안에 원하는 정보가 들어있을 것입니다.
- 한계점
트위터 api들이 다 이런 형태인지는 모르겠지만,
파이썬도 그렇고 자바도 그렇고 1개의 유저네임에 대한 타임라인을 습득 할 뿐,
복수의 유저네임에 대해서 복수의 타임라인을 습득하는 그런 작업은 불가능한 것 같았습니다.
아마 트위터 API의 부하와 관련 되어서.. 요청횟수 제한이 걸린 것과 연관이 있을 거 같지만,
그 덕에 복수의 유저 아이디에서 여러 데이터를 추출하려고 하는 것에 약간의 귀찮음이 생긴 상태네요.
결론은 단순히 [ 유저id 찾기 - 타임라인 습득 - 원하는 정보 취득] 이라는 사이클을 유저네임 수만큼 돌린다. 지만
코드가 더러워지는게 유감이네요...
일단 저는 이 방법으로 정상적인 트위터 연동과 타임라인 습득이 가능했습니다.
이제 이 데이터를 어떻게 가공해서 써먹을지 고민을 해야겠네요.
'웹 개발' 카테고리의 다른 글
Vue.js로 웹페이지 리빌드하기 - (1) 라이브러리 선정 (0) | 2021.12.23 |
---|---|
AWS 프리티어 사용 중에 과금이 되었다. (0) | 2021.12.15 |
SpringBoot로 재활 훈련 하는 중.. (0) | 2021.10.28 |
파이썬 공부 시작. (0) | 2021.08.16 |
django-admin.py startproject mysite 가 무반응 일 때 (0) | 2021.08.16 |