개발/자동화

티스토리 좋아요 자동화(랜덤 이용) 코드 #3

kimchangmin02 2025. 7. 25. 21:54

import time
import random # 랜덤 기능을 위해 random 모듈을 가져옵니다.
from selenium import webdriver
from seleniuhttp://m.webdriver.common.by import By
from seleniuhttp://m.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from seleniuhttp://m.webdriver.chrome.service import Service
from webdriver_manager.chrome import ChromeDriverManager

# --- 설정 ---

# 1. [자동 생성] 방문할 URL 리스트를 for문을 이용해 자동으로 생성합니다.
BASE_URL = "https://kimchangmin02.tistory.com"
TARGET_URLS = [] # 비어있는 리스트를 먼저 만듭니다.
for i in range(1, 55): # 1부터 54까지의 숫자를 생성합니다.
    # f-string을 사용해 숫자(i)를 URL 주소에 포함시켜 완전한 URL을 만듭니다.
    url = f"{BASE_URL}/{i}"
    TARGET_URLS.append(url) # 완성된 URL을 리스트에 추가합니다.

# 리스트가 잘 만들어졌는지 확인하고 싶다면 아래 주석을 해제하세요.
# print(TARGET_URLS)

WAIT_TIMEOUT = 10 # 타임아웃 대기 시간

print("사람처럼 행동하는 자동 '좋아요' 로봇을 시작합니다.")
print(f"총 {len(TARGET_URLS)}개의 게시물을 대상으로 작업을 반복합니다.")
print("프로그램을 종료하려면 이 창에서 Ctrl + C 를 누르세요.")

# --- 무한 루프 시작 ---
while True:
    driver = None
    try:
        # 2. (반복) 생성된 URL 목록에서 방문할 페이지를 무작위로 선택합니다.
        target_page = random.choice(TARGET_URLS)

        print("\n--- 새로운 시도를 시작합니다 ---")
        chrome_options = webdriver.ChromeOptions()
        driver = webdriver.Chrome(service=Service(ChromeDriverManager().install()), options=chrome_options)
        wait = WebDriverWait(driver, WAIT_TIMEOUT)

        # 3. 선택된 URL로 이동합니다.
        driver.get(target_page)
        print(f"'{target_page}' 페이지로 이동했습니다.")

        # 4. 페이지 로드 후, 사람처럼 랜덤하게 대기합니다. (글 읽는 척)
        thinking_time = random.uniform(1.5, 4.5) # 1.5초 ~ 4.5초 사이의 랜덤한 시간
        print(f"사람처럼 행동하기 위해 {thinking_time:.2f}초 동안 페이지를 둘러봅니다...")
        time.sleep(thinking_time)

        # 5. 모든 게시물에 적용 가능한 유연한 선택자로 '좋아요' 버튼을 찾습니다.
        like_button_selector = "div[id^='reaction-'] button.btn_post"
        print(f"CSS 선택자: '{like_button_selector}' 를 사용하여 '좋아요' 버튼을 찾습니다...")
        like_button = wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, like_button_selector)))
        
        # 6. '좋아요' 버튼을 클릭합니다.
        print("성공: '좋아요' 버튼을 찾았습니다.")
        like_button.click()
        print("성공: '좋아요' 버튼을 클릭했습니다.")

        # 7. 클릭 후, 바로 떠나지 않고 잠시 더 머뭅니다.
        viewing_time = random.uniform(2, 5) # 2초 ~ 5초 사이
        print(f"작업 완료! {viewing_time:.2f}초 더 머문 뒤 브라우저를 닫습니다.")
        time.sleep(viewing_time)

    except Exception as e:
        print(f"실패: 작업 중 오류가 발생했습니다 - {e}")
        error_sleep_time = random.uniform(5, 10)
        print(f"오류 발생으로 인해 {error_sleep_time:.2f}초 대기합니다.")
        time.sleep(error_sleep_time)

    finally:
        # 8. 한 사이클이 끝나면 브라우저를 종료하여 리소스를 정리합니다.
        if driver:
            print("브라우저를 종료합니다.")
            driver.quit()

    # 9. 다음 시도를 위해 긴 랜덤 휴식 시간을 가집니다.
    break_time = random.uniform(10, 25) # 10초 ~ 25초 사이
    print(f"\n다음 시도를 위해 {break_time:.2f}초간 충분히 휴식합니다...")
    time.sleep(break_time)