일상일지

[Twitter API] 크롤링한 데이터를 자동트윗하는 봇 만들기 본문

개발

[Twitter API] 크롤링한 데이터를 자동트윗하는 봇 만들기

서호Seoho 2021. 11. 13. 14:30
반응형
반응형

안녕하세요. 바한입니다.
오랜만의 포스팅입니다.
오늘은 웹사이트를 크롤링하여 얻어온 데이터를 자동트윗 하는 트윗봇을 만들어보겠습니다.

트위터 API를 이용하기 전에, 트위터 디벨로퍼 포탈에 들어가서 트위터 API를 사용을 허락받아야합니다.
그런 정보는 다른 블로그 참고해주시면 되겠습니다.
저는 트위터 디벨로퍼로 등록을 했다는 전제하에 작업을 진행합니다.


필요한 라이브러리
셀레니움 : https://www.selenium.dev/downloads/

 

Downloads

Selenium automates browsers. That's it!

www.selenium.dev

트위터 API : https://twitter4j.org/ko/

 

Twitter4J - A Java library for the Twitter API

Twitter4J 는 Twitter API 의 Java Wraper 입니다. Twitter4J 를 사용하면 JSON 이나 HTTP에 자세하지 않아도 쉽게 Twitter와 상호 작용하는 응용 프로그램을 작성 할 수 있습니다. Twitter4J는 Twitter 비공식 라이브러

twitter4j.org

 


두개의 jar파일을 다운받아 프로젝트 라이브러리에 추가해주시면 됩니다.



제가 크롤링 해올 사이트는 다음과 같습니다.
http://muchamucha.today/mucha/

 

무시코인

 

muchamucha.today


제가 하는 크롤링에 대해서 저는 해당 사이트 운영자 분께 허락을 받은상태입니다.
어느 사이트이던간에 크롤링을 할때 저작권 문제가 없도록 잘 처신합시다.



1. Twitter Developer Portal 에 Create Apps 하기

Twitter Devloper Portal에 들어가줍니다.
https://developer.twitter.com/en/portal/dashboard

 

트위터에 로그인

닫기 이전 다음

twitter.com

 

위 사진처럼 Portal의 Create App 버튼을 눌러 App 생성을 진행해줍시다.
아마 App 생성을 완료하면 마지막 화면에 Consumer Keys가 보일 것입니다. 해당 정보를 저장해줍니다.





그 다음 생성한 App의 Setting에 들어가 App permissions를 Read and Write로 바꿔줍니다. 디폴트는 Read였던 것으로 기억합니다.
Read and Write를 해줘야 API로 트윗을 쓸 수 있게 됩니다.





2. 크롬 드라이버 다운받기

셀레니움을 이용한 크롤링을 하기 위해서는 크롬을 실행시킬 드라이버가 필요합니다.

https://chromedriver.chromium.org/downloads

 

ChromeDriver - WebDriver for Chrome - Downloads

Current Releases If you are using Chrome version 96, please download ChromeDriver 96.0.4664.35 If you are using Chrome version 95, please download ChromeDriver 95.0.4638.69 If you are using Chrome version 94, please download ChromeDriver 94.0.4606.113 For

chromedriver.chromium.org

 

버전은 컴퓨터에 깔린 크롬 버전과 동일한 버전의 드라이버를 다운합니다.

그리고 드라이버가 깔린 경로를 기억해주세요.

 

 

 

 

 

3. 트위터 계정 Access Token 가져오기

이제부터 본격적으로 코딩에 들어갑니다.

package main;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

import twitter4j.Twitter;
import twitter4j.TwitterException;
import twitter4j.TwitterFactory;
import twitter4j.auth.AccessToken;
import twitter4j.auth.RequestToken;

public class HttpSourceCall2 {
	
	static AccessToken accessToken=null;
	static String accessSecret="";
	static Twitter twitter;
	
	
	public static void main(String[] args) {
		
		RequestToken requestToken=null;
		
		twitter = TwitterFactory.getSingleton();
		twitter.setOAuthConsumer("consumer key입력", "consumer secret 입력");
		
		
		//토큰
		requestToken=null;
		try {
			requestToken = twitter.getOAuthRequestToken();
		}catch(TwitterException e) {
			e.printStackTrace();
		}
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		System.out.println(requestToken.getAuthorizationURL());
		
		System.out.println("Enter the PIN and hit enter after you granted access");
		String pin="";
		try {
			pin=br.readLine();
		} catch (IOException e1) {
			// TODO Auto-generated catch block
			e1.printStackTrace();
		}
		
		try {
			if(pin.length()>0) {
				accessToken = twitter.getOAuthAccessToken(requestToken,pin);
			}else {
				accessToken = twitter.getOAuthAccessToken(requestToken);
			}
			
			String key1 = accessToken.getToken();
			String key2 = accessToken.getTokenSecret();
			
			System.out.println("accessToken : "+accessToken);
			System.out.println("getToken : "+key1);
			System.out.println("getTokenSecret : "+key2);
			
		}catch(TwitterException te) {
			if(401==te.getStatusCode()) {
				System.out.println("unable to get the access token");
				System.out.println(te);
			}else {
				te.printStackTrace();
			}
		}
		
	}
}

 

위 코드는 트위터 계정의 권한을 가져오는 코드입니다.

클래스를 우클릭하여 Java Application으로 Run을 하면 콘솔 창에 뜨는 경로가 있을 것입니다.

 

해당 경로를 테스트 계정으로 사용하실 트위터 계정에 로그인 후, url창에 입력하여줍니다.

앱 인증을 진행하고, 나오는 PIN번호를 콘솔창에 입력 후 Enter를 눌러주면 해당 계정의 Access Token을 획득 가능합니다.

가져온 Access Token으로 해당 트위터 계정의 타임라인을 읽거나, 트윗을 하는게 가능하므로 저장해둡니다.

 

 

 

4. 트위터 계정 으로 자동트윗 진행하기

이제 본격적으로 셀레니움으로 웹 페이지를 크롤링하여 데이터를 읽어온 후, 자동트윗을 해보겠습니다.

package main;

import java.util.List;

import org.openqa.selenium.By;
import org.openqa.selenium.JavascriptExecutor;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.chrome.ChromeOptions;

import twitter4j.Status;
import twitter4j.Twitter;
import twitter4j.TwitterException;
import twitter4j.TwitterFactory;
import twitter4j.auth.AccessToken;

public class HttpSourceCall2 {
	
	public static final String WEB_DRIVER_ID = "webdriver.chrome.driver"; //드라이버 ID
	public static final String WEB_DRIVER_PATH = "드라이버 경로 입력"; //드라이버 경로
	
	static AccessToken accessToken=null;
	static String accessSecret="";
	static Twitter twitter;
	
	
	public static void main(String[] args) {
		
		//드라이버 설정
		try {
			System.setProperty(WEB_DRIVER_ID, WEB_DRIVER_PATH);
		} catch (Exception e) {
			e.printStackTrace();
		}
		
		ChromeOptions options = new ChromeOptions();
		options.addArguments("headless");	//코드를 이행하는 중, 홈페이지가 시각적으로 보일 것인가 여부
		
		WebDriver driver = new ChromeDriver(options);
		
		String url = "http://muchamucha.today/mucha/";
		
		driver.get(url);
		
		try {Thread.sleep(1500);} catch (InterruptedException e) {} //홈페이지에 들어가서 1.5초 기다림
		
		WebElement el1 = driver.findElement(By.id("클릭할 버튼의 아이디"));
		((JavascriptExecutor)driver).executeScript("window.scrollTo(x좌표,y좌표)"); //버튼이 있는 곳으로 스크롤을 이동
		el1.click(); //클릭
		
		//1초 대기
		try {Thread.sleep(600);} catch (InterruptedException e) {} //페이지 이동 후, 0.6초 기다림

		WebElement el2 = driver.findElement(By.tagName("html 태그 명"));
	
		List<WebElement> el3 = el2.findElements(By.className("가져올 정보가 있는 클래스 명"));
		
		String percent = el3.get(0).getText();
		int price = Integer.parseInt(el3.get(2).getText());
		if(!percent.contains("-")){
			percent = "+"+percent;
		}
		
		System.out.println(percent+"%"); //퍼센트
		System.out.println(price+"원"); //가격
		
		twitter = TwitterFactory.getSingleton();
		twitter.setOAuthConsumer("Consumer Key 입력", "Consumer Secret 입력");
		
		//자동트윗 START
		AccessToken accessToken = null;
		accessToken = new AccessToken("계정에서 가져온 Access Token 입력","계정에서 가져온 Access Token Secret 입력"); //내 계정
		twitter.setOAuthAccessToken(accessToken);
				
		try {
			Status status=twitter.updateStatus(percent+"% 👉 "+price+"원"); //트윗
			
		} catch (TwitterException e1) {
			System.out.println("e1 : "+e1);
			
		}
		//자동트윗 END
		
		
		try {
			//드라이버가 null이 아니라면
			if(driver != null) {
				//드라이버 연결 종료
				driver.close(); //드라이버 연결 해제
				
				//프로세스 종료
				driver.quit();
			}
		} catch (Exception e) {
			throw new RuntimeException(e.getMessage());
		}
	}
}

위 코드는 사이트를 크롤링하여 가져온 정보로 자동 트윗을 하는 코드입니다.

클래스를 우클릭하여 Java Application으로 Run을 하면 자동트윗이 됩니다.

한글로 쓰여진 부분들을 알맞는 변수명으로 변경하여 돌리시면 이전, Access Token을 얻어왔던 계정에 트윗이 되는 것을 확인하실 수 있습니다.

 

 

 

 

이상으로 원하는 홈페이지를 크롤링하여 자동트윗 하는 코드의 전문을 보여드렸습니다.

감사합니다.

반응형
Comments