Java/실험실

Selenium을 이용한 API 비용 없이 AI 챗봇 사용하기

소금토스트 2024. 11. 14. 01:01
728x90
반응형
SMALL
SMALL

크롤링으로 뭘 해볼수 있을까 하고 고민하다가 요즘 자주 사용하는 AI 챗봇을 제어해보자 라는 아이디어가 떠올랐다.
AI챗봇은 여러가지가있는데 그중에서 사람들에게 알려지기 전부터 사용했던 뤼튼이라는 AI 챗봇을 사용해봣다

정상적으로 AI 챗봇을 제어하려면 API 비용이 든다. 편법으로 비용없이 AI 기능을 사용해보겠다.

세팅은 이전 글과 같이 세팅한다. 파이어폭스나 드라이버설치같은 설명이 있어서 보고오는것을 추천한다.

 

Selenium을 이용한 간단 크롤링 하기 (네이버 실행)

준비물WindowsESR firefox 78.8.0GeckoDriver 0.29.0java 17IntelliJ셀레니움으로 해커같이 웹브라우저를 자동으로 맘대로 조작할수있고, 필요한 자료가있으면 자동으로 추출해서 리스트화까지 가능한 크롤링

salttoastexcel.tistory.com

디렉토리구조는 다음과같다.

이전 세팅과 달라진점은 auto_input.txt 라는 텍스트 파일이 추가되었다.

이안에는 아래처럼 간단한 질문같은걸 넣어놧다.


코드는 다음과같다.

Wrtn_Crawler.java

package org.example;

import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.openqa.selenium.JavascriptExecutor;
import org.openqa.selenium.WebElement;
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;

public class Wrtn_Crawler {
    public static void main(String[] args) throws IOException, InterruptedException {
        // 1. GeckoDriver 경로 설정
        System.setProperty("webdriver.gecko.driver", "C:\\Users\\User\\Desktop\\Selenium-firefox-test\\geckodriver.exe");

        // 2. Firefox 드라이버 초기화
        WebDriver driver = new FirefoxDriver();

        try {
            // 3. 원하는 웹페이지로 이동
            driver.get("https://wrtn.ai/?utm_source=google.adwords&utm_medium=cpc&utm_campaign=UA_web_total_pmax&utm_content=pmax_0906&utm_term=&ad_group=pmax_0906&ad_creative=&gad_source=1&gclid=CjwKCAiAudG5BhAREiwAWMlSjDn-RmGysv7LpmOTMSGkoiSZ1TvBmD3Gnfs8dOFqfoDegHbMI9KzWRoC2UEQAvD_BwE");
            Thread.sleep(3000);

            // 4. 웹 페이지에서 웹 모달 삭제
            JavascriptExecutor js = (JavascriptExecutor) driver;
            js.executeScript("var element = document.getElementById('web-modal'); if (element) { element.remove(); }");
            System.out.println("웹 모달이 삭제되었습니다.");

            // 5. auto_input.txt 파일을 읽어들여 입력할 텍스트를 가져오기
            BufferedReader br = new BufferedReader(new FileReader("C:\\Users\\User\\Desktop\\Selenium-firefox-test\\auto_input.txt"));
            String line;
            String[] inputText = new String[3];  // 질문의 최대 개수는 3개로 설정, 추가 질문은 필요 시 배열 크기 조정

            int i = 0;
            while ((line = br.readLine()) != null && i < 3) {
                inputText[i] = line;  // 파일에서 읽은 질문을 배열에 저장
                i++;
            }
            br.close();

            // 6. 첫 번째 질문에 대해 기존 입력창과 버튼 사용
            WebElement textarea1 = driver.findElement(By.xpath("/html/body/div[1]/div[1]/div[2]/div/div/div/div[1]/div/div[2]/div/div[3]/div[3]/div[2]/div[1]/div/textarea"));
            WebElement button1 = driver.findElement(By.xpath("/html/body/div[1]/div[1]/div[2]/div/div/div/div[1]/div/div[2]/div/div[3]/div[3]/div[2]/div[2]/div/button"));

            // 7. 첫 번째 질문 입력 및 버튼 클릭
            textarea1.clear();
            textarea1.sendKeys(inputText[0]);  // 첫 번째 텍스트 입력
            System.out.println("첫 번째 입력된 텍스트: " + inputText[0]);
            button1.click();  // 첫 번째 버튼 클릭
            System.out.println("첫 번째 버튼이 클릭되었습니다.");
            Thread.sleep(5000);
            String xpath1 = "/html/body/div[1]/div[1]/div[2]/div[2]/div/div/div[1]/div/div/div/div/div[1]/div/div/div/div[3]/div/div[1]/div[1]/div[3]/div[2]/div/p";
            WebElement resultElement1 = driver.findElement(By.xpath(xpath1));
            String resultText1 = resultElement1.getText();
            System.out.println("출력된 값: " + resultText1);
            Thread.sleep(5000);  // 10초 대기

            // 8. 두 번째부터는 '//*[@id="rich-textarea"]' 입력창에 텍스트 입력
            WebElement textarea2 = driver.findElement(By.xpath("//*[@id=\"rich-textarea\"]"));
            WebElement button2 = driver.findElement(By.xpath("/html/body/div[1]/div[1]/div[2]/div[2]/div/div/div[1]/div/div/div/div/div[4]/div/div[1]/div[1]/div[2]"));

            // 9. 두 번째부터 텍스트 입력과 버튼 클릭 반복
            int ii=5;
            for (int j = 1; j < inputText.length; j++) {
                // 각 질문 입력 및 버튼 클릭
                textarea2.clear();
                textarea2.sendKeys(inputText[j]);  // 텍스트 입력
                System.out.println((j + 1) + " 번째 입력된 텍스트: " + inputText[j]);
                button2.click();  // 버튼 클릭
                System.out.println((j + 1) + " 번째 버튼이 클릭되었습니다.");
                Thread.sleep(5000);
                String xpath2 = "/html/body/div[1]/div[1]/div[2]/div[2]/div/div/div[1]/div/div/div/div/div[1]/div/div/div/div[" + ii + "]/div/div[1]/div[1]/div[3]/div[2]/div/p";
                WebElement resultElement2 = driver.findElement(By.xpath(xpath2));
                String resultText2 = resultElement2.getText();
                System.out.println("출력된 값: " + resultText2);
                ii=ii+2;
                Thread.sleep(5000);  // 10초 대기

            }

            // 11. 웹페이지 제목 가져오기
            String pageTitle = driver.getTitle();
            System.out.println("페이지 제목: " + pageTitle);

        } finally {
            // 12. 브라우저 종료
//            driver.quit(); // 브라우저 종료
        }
    }
}

뭔가 복잡한거같긴한데 설명 하겠습니다.

3번까지는 주석 그대로 이고

4. 웹 페이지에서 웹 모달 삭제는 뤼튼에 접속하면 이런 창이나오는데 방해되니까 삭제하는 코드입니다.

 5. auto_input.txt 파일을 읽어들여 입력할 텍스트를 가져오기는 말그대로 텍스트파일을 불러오는 코드입니다.

 6. 첫 번째 질문에 대해 기존 입력창과 버튼 사용은 뤼튼에 팝업을 삭제하고나면 아래처럼 나옵니다.

이상태에서 ctrl + Shift + c를 동시에 누르고 마우스 포인터를 마운트하면아래처럼 각 객체들의 요소를 확인할수있습니다. 

그리고 요소를 우클릭하면 아래처럼 나오는데

Copy - XPath 를 클릭하면 //*[@id="rich-textarea"] 이런식으로 객체의 id값이 나옵니다.
바로 이 ID값을 자바에서 컨트롤 하는것입니다.
입력창, 버튼도 마찬가지로 저렇게 xPath의 좌표값으로 컨트롤 할수있습니다.

중간중간에 Thread.sleep(5000); 를 넣어둔 이유는 질문을 입력하고 검색버튼을 클릭하고나서 
AI가 생각하는시간, 작성하는시간을 생각을해서 5초의 시간을 지연시키는 것입니다. 

9번부분에 결과값 좌표에는 규칙이있습니다.

/html/body/div[1]/div[1]/div[2]/div[2]/div/div/div[1]/div/div/div/div/div[1]/div/div/div/div[3]/div/div[1]/div[1]/div[3]/div[2]/div/p
/html/body/div[1]/div[1]/div[2]/div[2]/div/div/div[1]/div/div/div/div/div[1]/div/div/div/div[5]/div/div[1]/div[1]/div[3]/div[2]/div/p
/html/body/div[1]/div[1]/div[2]/div[2]/div/div/div[1]/div/div/div/div/div[1]/div/div/div/div[7]/div/div[1]/div[1]/div[3]/div[2]/div/p

이렇게 있는데, 3,5,7 이렇게 늘어나는 규칙을 확인해서 코드를 작성했습니다.

이런식으로 웹페이지로 나오는 웬만한것을 컨트롤 할수있습니다.
데이터를 추출해서 리스트화한다던지, 로그인을 자동으로해서 뭔가를 한다던지  
일반인이 보기에 컴퓨터 잘해보일수있습니다.

 

코드를 실행해보면 

 

 

이런식으로 결과값을 도출해 낼수있다.

실전으로 테스트 해보겠습니다.

제법 질문같은 질문으로 작성했습니다. 한줄로 작성해달라고 안하면
고민하는시간, 작성하는시간이 길어서 설정한 5초를 초과할것같습니다.

 

 

 

 


어쩌면 질문 몇개를 작성해서 텍스트파일에 넣어두고
gpt 를 사용해서 결과를 도출하고
그결과값으로 블로그도 자동으로 작성할수 도 있을것만 같다.

텍스트파일의 질문도 gpt로 100개정도 리스트 뽑아내서 넣기도 가능할것만 같다.

나중에 시간이되면 자동화해보고싶다.

 

 

 

 

728x90
반응형
LIST

'Java > 실험실' 카테고리의 다른 글

Selenium을 이용한 간단 크롤링 하기 (네이버 실행)  (2) 2024.11.13