셀레니움 활용 3

JOOYEUN SEO·2024년 10월 7일

100 Days of Python

목록 보기
51/76
post-thumbnail

🗂️ Day51 프로젝트: 인터넷 속도 불만 X 봇

인터넷 속도가 최소 보장 속도보다 느릴 때 X에서 자동으로 인터넷 공급사에 불만을 제기하는 봇
(실제로 멘션을 보내는 대신 트윗을 작성하는 것으로 변경)

1. X 계정 생성

🔍 유의 사항

  • X 계정 생성
  • 인터넷 공급사에서 보장한 다운로드/업로드 속도 값을 상수로 추가

2. 클래스 생성

🔍 유의 사항

  • 클래스를 사용하여 코드 정리
    • 인터넷 속도를 구하는 메소드와 인터넷 공급사에게 트윗을 보내는 메소드 생성
    • 두 메소드를 순서대로 호출

3. 인터넷 속도 구하기

🔍 유의 사항

  • 속도 테스트 사이트 : https://www.speedtest.net/
  • 셀레니움이 자동으로 사이트에 들어가서 속도를 측정하도록 하기
  • 인터넷 속도에 따라 결과가 나올 때까지 1-3분 정도 대기 시간 필요

4. 봇으로 트윗 작성

🔍 유의 사항

  • 셀레니움으로 자동 로그인 후 측정된 속도값을 넣어서 트윗 작성
  • 반복적으로 로그인 시 로봇으로 의심받기 때문에 주의

⌨️ main.py

import time
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys

PROMISED_DOWN = 500
PROMISED_UP = 250
X_EMAIL = "이메일"
X_PASSWORD = "비밀번호"

class InternetSpeedXBot:
    def __init__(self):
        chrome_options = webdriver.ChromeOptions()
        chrome_options.add_experimental_option("detach", True)
        self.driver = webdriver.Chrome(options=chrome_options)
        self.down = 0
        self.up = 0

    def get_internet_speed(self):
        # 인터넷 속도 측정 사이트 접속
        self.driver.get("https://www.speedtest.net/")
        
        # 속도 측정 버튼 클릭
        time.sleep(3)
        go_button = self.driver.find_element(By.XPATH, '//*[@id="container"]/div[1]/div[3]/div/div/div/div[2]/div[3]/div[1]/a/span[4]')
        go_button.click()
        
        # 측정된 속도 저장
        time.sleep(80)
        self.down = self.driver.find_element(By.XPATH, '//*[@id="container"]/div[1]/div[3]/div/div/div/div[2]/div[3]/div[3]/div/div[3]/div/div/div[2]/div[1]/div[1]/div/div[2]/span')
        self.up = self.down.find_element(By.XPATH, '//*[@id="container"]/div[1]/div[3]/div/div/div/div[2]/div[3]/div[3]/div/div[3]/div/div/div[2]/div[1]/div[2]/div/div[2]/span')

    def tweet_at_provider(self):
        # X 로그인 페이지 접속
        self.driver.get("https://x.com/i/flow/login")
        
        # 이메일 입력 후 패스워드 입력
        time.sleep(2)
        email = self.driver.find_element(By.XPATH, '/html/body/div/div/div/div[1]/div[2]/div/div/div/div/div/div[2]/div[2]/div/div/div[2]/div[2]/div/div/div/div[4]/label/div/div[2]/div/input')
        email.send_keys(X_EMAIL)
        email.send_keys(Keys.ENTER)
        time.sleep(2)
        password = self.driver.find_element(By.XPATH, '//*[@id="layers"]/div[2]/div/div/div/div/div/div[2]/div[2]/div/div/div[2]/div[2]/div[1]/div/div/div[3]/div/label/div/div[2]/div[1]/input')
        password.send_keys(X_PASSWORD)
        password.send_keys(Keys.ENTER)
        
        # 메인 페이지에서 트윗 작성
        time.sleep(5)
        tweet = f"Hey Internet Provider, why is my internet speed {self.down}down/{self.up}up when I pay for {PROMISED_DOWN}down/{PROMISED_UP}up?"
        tweet_compose = self.driver.find_element(By.XPATH, '//*[@id="react-root"]/div/div/div[2]/main/div/div/div/div/div/div[3]/div/div[2]/div[1]/div/div/div/div[2]/div[1]/div/div/div/div/div/div/div/div/div/div/div/div[1]/div/div/div/div/div/div[2]/div/div/div/div')
        tweet_compose.send_keys(tweet)
        
        # 트윗 포스트
        post_button = self.driver.find_element(By.XPATH, '//*[@id="react-root"]/div/div/div[2]/main/div/div/div/div/div/div[3]/div/div[2]/div[1]/div/div/div/div[2]/div[2]/div[2]/div/div/div/button/div/span/span')
        post_button.click()


# bot 객체 생성 후 실행
bot = InternetSpeedXBot()
bot.get_internet_speed()
bot.tweet_at_provider()




▷ Angela Yu, [Python 부트캠프 : 100개의 프로젝트로 Python 개발 완전 정복], Udemy, https://www.udemy.com/course/best-100-days-python/?couponCode=ST3MT72524

0개의 댓글