Python과 ChatGPT API를 활용한 자동화 로봇 개발

7_Python과 ChatGPT API를 이용한 블로그 자동화 프로그램 개발

atomicdev 2024. 8. 15. 16:16
728x90

강의 7: 티스토리 글에 ChatGPT 댓글 크롤링으로 작성하기

목표:

이 강의에서는 크롤링을 활용하여 티스토리 블로그의 특정 글에 자동으로 댓글을 작성하는 방법을 학습합니다. 수강자는 웹 페이지 구조를 이해하고, ChatGPT API와 크롤링을 결합하여 자동으로 댓글을 생성하고 게시할 수 있게 됩니다.

1. 티스토리 페이지 구조 이해하기

우선 티스토리 블로그의 댓글 작성 폼과 필요한 요소들(예: 입력 필드, 제출 버튼 등)의 HTML 구조를 파악해야 합니다. 크롬 개발자 도구(또는 다른 브라우저의 개발자 도구)를 사용하여 페이지의 HTML을 분석할 수 있습니다.

주요 요소:

  • 댓글 작성 폼: 댓글을 작성하는 텍스트 영역(textarea)의 name 또는 id 속성을 확인합니다.
  • 제출 버튼: 댓글을 제출하는 버튼의 name, id, 또는 class 속성을 확인합니다.
  • CSRF 토큰: 많은 웹사이트에서는 보안을 위해 CSRF 토큰을 사용합니다. 이 토큰은 댓글을 제출할 때 필수적인 파라미터입니다. HTML에서 이 토큰을 추출하는 방법을 알아야 합니다.

2. ChatGPT API를 사용해 댓글 내용 생성

티스토리 글에 달 댓글 내용을 ChatGPT API를 통해 생성합니다. 이 과정은 이전 API 통합과 유사하게 진행됩니다.

먼저 ReplyDemo.ipynb 라는 새 노트를 만들어서 작업 진행합니다.

재사용 가능하도한 generate_comment_content 함수를 생성합니다.
import openai 
# OpenAI API 키 설정 
openai.api_key = '발급받은 API Key' 
# ChatGPT를 사용해 댓글 내용 생성 
def generate_comment_content(prompt): 
    response = openai.ChatCompletion.create(
        model="gpt-3.5-turbo",  # 또는 gpt-4
        messages=[{"role": "user", "content": prompt}],
        max_tokens=200,
        n=1,
        stop=None,
        temperature=0.7
    ) 
    return response['choices'][0]['message']['content'].strip()

3. 크롤링을 사용해 댓글 작성

generate_comment_content 함수 아래 Cell 을 추가해서 작업을 진행합니다.

 

크롬 드라이버를 이용해서 웹브라우져를 생성합니다. 모든 Cell의 코드를 작성한 후 실행(Ctrl+Enter) 시켜줍니다.

from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from webdriver_manager.chrome import ChromeDriverManager

# 크롬 드라이버 경로 설정 (또는 WebDriverManager를 사용하여 자동 설치)
service = Service(ChromeDriverManager().install())
driver = webdriver.Chrome(service=service)

# 페이지 열기
url = "https://atomicdev.tistory.com"
driver.get(url)

# 필요한 동작을 수행한 후 브라우저 닫기
# driver.quit()  # 자동으로 브라우저를 닫으려면 이 주석을 해제하세요.
댓글을 작성할 페이지로 이동합니다.
# 페이지 열기
url = "https://atomicdev.tistory.com/29"
driver.get(url)
 
해당 페이지가 열리면 댓글 작성을 위해 수동으로 로그인을 진행해 줍니다. 로그인 해야 댓글 작성이 가능합니다.
 
페이지로 이동했으면 먼저 자동 공감(좋아요) 클릭이 진행되도록 합니다.
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

# 페이지 로드와 공감(좋아요) 버튼이 나타날 때까지 대기
try:
    # 공감(좋아요) 버튼을 포함하는 div 요소가 나타날 때까지 대기 (최대 10초)
    like_button_container = WebDriverWait(driver, 10).until(
        EC.presence_of_element_located((By.CSS_SELECTOR, "div.postbtn_like"))
    )
    
    # 공감(좋아요) 버튼의 상태 확인 (like_on 클래스가 있는지 확인)
    like_button = like_button_container.find_element(By.CSS_SELECTOR, "div.uoc-icon")
    if "like_on" not in like_button.get_attribute("class"):
        # 버튼이 이미 클릭되지 않은 경우 클릭
        like_button.click()
        print("공감(좋아요) 버튼을 클릭했습니다.")
    else:
        print("공감(좋아요) 버튼이 이미 클릭된 상태입니다.")
except Exception as e:
    print("공감(좋아요) 버튼을 클릭하지 못했습니다.")
    print(e)

# 페이지 로드와 공감(좋아요) 클릭이 완료될 때까지 대기
time.sleep(2)
 
현재 글의 본문을 분석해서 댓글 작성을 진행해야 하므로 본문 데이터를 수집합니다.
# 본문 내용 추출
try:
    content = driver.find_element(By.CSS_SELECTOR, "div.tt_article_useless_p_margin").text
    print("본문 내용을 성공적으로 추출했습니다.")
    print(content)
except Exception as e:
    print("본문 내용을 추출하지 못했습니다.")
    print(e)
    driver.quit()
    exit()
 
본문 내용을 바탕으로 chatgpt api를 이용해 댓글을 자동 생성 합니다. 작성자의 상태를 설명하는 "초급 개발자 입장" 문구는 본인 입장으로 변경해 줍니다.
# 본문 내용을 기반으로 질문 또는 의견 생성
prompt = f"파이썬 고급 개발자 입장에서 다음 글에 대한 평가를 100자 내외로 간결하게 작성해줘: {content}"
comment = generate_comment_content(prompt)
print(f"Generated Comment: {comment}")
 
 
생성된 comment를 자동으로 댓글 등록이 되도록 실행합니다.
try:
    # 댓글 입력 필드 찾기 및 텍스트 입력
    comment_input = WebDriverWait(driver, 10).until(
        EC.presence_of_element_located((By.CSS_SELECTOR, "div[contenteditable='true'].tt-cmt"))
    )
    
    # 댓글을 입력하여 실제 사용자 입력을 시뮬레이션
    driver.execute_script("arguments[0].innerText = arguments[1]; arguments[0].dispatchEvent(new Event('input', { bubbles: true }));", comment_input, comment)
    
    # 등록 버튼이 활성화될 때까지 대기
    submit_button = WebDriverWait(driver, 10).until(
        EC.element_to_be_clickable((By.CSS_SELECTOR, "button.tt-btn_register"))
    )

    # 댓글 제출 버튼 클릭
    submit_button.click()

    print("댓글이 성공적으로 등록되었습니다.")
except Exception as e:
    print("댓글을 등록하는 데 실패했습니다.")
    print(e)
finally:
    time.sleep(3)
    #driver.quit()
 
브라우져에 자동으로 등록된 댓글이 노출되는 것을 확인할 수 있습니다.
 

4. 크롤링 과정 설명

  1. HTML 분석:
    • 티스토리 글의 HTML을 분석하여 댓글 작성에 필요한 데이터를 추출합니다. 여기에는 CSRF 토큰, blogId, postId 등의 필수 파라미터가 포함됩니다.
  2. 세션 유지:
    • requests.Session을 사용하여 로그인된 세션을 유지하거나 쿠키를 관리합니다. 로그인된 상태에서 댓글을 작성해야 할 경우, 세션을 통해 로그인 상태를 유지할 수 있습니다.
  3. POST 요청:
    • 추출한 데이터와 댓글 내용을 포함하여 댓글 작성 요청을 보냅니다. 이때 필요한 모든 파라미터가 올바르게 포함되었는지 확인합니다.
  4. 응답 처리:
    • 댓글이 성공적으로 작성되었는지 확인하기 위해 서버의 응답을 처리합니다. 성공 여부에 따라 적절한 메시지를 출력합니다.

5. 실습: 특정 글에 ChatGPT를 활용해 자동으로 댓글 작성하기

위의 코드를 실습하면서, 티스토리 글에 ChatGPT가 생성한 댓글을 자동으로 작성하는 방법을 구현해봅니다. 크롤링을 통해 댓글을 작성하는 과정에서 발생할 수 있는 문제(예: CSRF 토큰 오류, 로그인 필요 등)를 해결하는 방법도 배우게 됩니다.

결론

이 강의를 통해 수강자는 ChatGPT API와 크롤링을 결합하여 티스토리 블로그에 자동으로 댓글을 작성하는 시스템을 구축하는 방법을 이해하게 됩니다. 다음 강의에서는 이 기능들을 종합하여 더 복잡한 자동화 프로그램을 설계하고 구현하는 방법을 학습해보겠습니다.

728x90