Dev/Python

[Python] 파이썬 웹 크롤링 - Selenium 이용한 트위터 자동 로그인 매크로 봇 만들기(2) - 다중 계정 로그인

KeyDi 2022. 12. 23. 04:23
728x90

Selenium 기초와 자세한 설명은 이전 게시글 참고해 주세요.

 

[Python] 파이썬 웹 크롤링 - Selenium 이용한 트위터 자동 로그인 매크로 봇 만들기

파이썬 크롤링 추후 포트폴리오를 만들 때 웹 크롤링과 Ai를 활용한 웹서비스 프로젝트를 하고 싶다는 막연한 생각 중에 종강 후 여유가 있을 때 하나씩 공부해보면 좋을 것 같아 우선 크롤링부

keydi.tistory.com


지난 게시글에서 만든 트위터 자동 로그인에서 여러 계정을 한 번에 로그인할 수 있도록 간단하게 만들 봤다.

 

소스코드

패키지

# import necessary libraries
import pyperclip  # Copy + paste, 클립보드를 사용하기 위한 라이브러리 (웹 크롤링 봇 탐지 우회용)
from selenium import webdriver
from selenium.webdriver.common.keys import Keys  # 키 입력을 위한 라이브러리
from webdriver_manager.chrome import ChromeDriverManager
from selenium.webdriver.common.by import By  # 태그 값을 추출하기 위한 라이브러리 (By.XPATH 사용)
import time

 

url, XPATH

url = "https://twitter.com/login"
ID_XPATH = '//*[@id="layers"]/div/div/div/div/div/div/div[2]/div[2]/div/div/div[2]/div[2]/div/div/div/div[5]/label/div/div[2]/div/input'
NAME_XPATH = '//*[@id="layers"]/div/div/div/div/div/div/div[2]/div[2]/div/div/div[2]/div[2]/div[1]/div/div[2]/label/div/div[2]/div/input'
PW_XPATH = '//*[@id="layers"]/div/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'
ID_NEXT_BUTTON_XPATH = '//*[@id="layers"]/div/div/div/div/div/div/div[2]/div[2]/div/div/div[2]/div[2]/div/div/div/div[6]/div'
NAME_NEXT_BUTTON_XPATH = '//*[@id="layers"]/div/div/div/div/div/div/div[2]/div[2]/div/div/div[2]/div[2]/div[2]/div/div/div/div/div/span/span'
LOGIN_BUTTON_XPATH = '//*[@id="layers"]/div/div/div/div/div/div/div[2]/div[2]/div/div/div[2]/div[2]/div[2]/div/div[1]/div/div/div/div/span/span'

 

getID, getPW, getName

def getID():  # data 폴더 내 id 파일 읽고 배열 리턴
    idFile = open("./data/id.txt", "r")
    IDs = idFile.read().split()
    idFile.close()
    return IDs


def getPW():  # data 폴더 내 pw 파일 읽고 배열 리턴
    pwFile = open("./data/pw.txt", "r")
    PWs = pwFile.read().split()
    pwFile.close()
    return PWs


def getName():  # data 폴더 내 닉네임/휴대폰 파일 배열 리턴
    nameFile = open("./data/name.txt", "r")
    names = nameFile.read().split()
    nameFile.close()
    return names

- 계정 정보 파일을 읽어 list에 저장하여 리턴한다.

__getWebDriver

def __getWebDriver():  # 크롬 웹 드라이버 인스턴스를 생성하여 리턴 (private)
    # instantiate the Chrome class web driver and pass the Chrome Driver Manager
    return webdriver.Chrome(ChromeDriverManager().install())

- 크롬 웹 드라이버 인스턴스를 생성하여 리턴한다.

twitterAutoLogin

def twitterAutoLogin():
    IDs = getID()
    PWs = getPW()
    names = getName()
    drivers = []

    for i in range(len(IDs)):  # id 개수만큼 인스턴스 생성
        drivers.append(__getWebDriver())

    for i in drivers:
        # i.maximize_window() #크롬 창 최대화
        i.get(url)  # 트위터 로그인 홈페이지로 이동
        time.sleep(1)  # 화면 켜지기 까지 대기 필요

    for i in range(len(IDs)):
        # 아이디 입력 처리
        id = IDs[i]
        pyperclip.copy(id)  # 복사
        drivers[i].find_element(By.XPATH, ID_XPATH).send_keys(Keys.CONTROL + 'v')  # 붙여넣기
        drivers[i].find_element(By.XPATH, ID_NEXT_BUTTON_XPATH).click()  # 다음 버튼 클릭
        time.sleep(1)
        try:
            # 비밀번호 입력 처리
            pw = PWs[i]
            pyperclip.copy(pw)
            drivers[i].find_element(By.XPATH, PW_XPATH).send_keys(Keys.CONTROL + 'v')  # 붙여넣기
            drivers[i].find_element(By.XPATH, LOGIN_BUTTON_XPATH).click()  # 최종 로그인 버튼 클릭

        except:
            # 비정상적인 로그인 아이디 입력
            name = names[i]
            pyperclip.copy(name)
            drivers[i].find_element(By.XPATH, NAME_XPATH).send_keys(Keys.CONTROL + 'v')  # 붙여넣기
            drivers[i].find_element(By.XPATH, NAME_NEXT_BUTTON_XPATH).click()  # 다음 버튼 클릭
            time.sleep(1)

            # 비밀번호 입력 처리
            pw = PWs[i]
            pyperclip.copy(pw)
            drivers[i].find_element(By.XPATH, PW_XPATH).send_keys(Keys.CONTROL + 'v')  # 붙여넣기
            drivers[i].find_element(By.XPATH, LOGIN_BUTTON_XPATH).click()  # 최종 로그인 버튼 클릭

    while True:  # 자동으로 브라우저가 꺼지지 않도록 무한루프 추가 -> 프로그램 종료시 브라우저 꺼짐
        print("x 입력 시 프로그램 및 브라우저가 종료됩니다.")
        i = input()
        if i == 'x' or i == 'X':
            break
        pass

ID, PW, 닉네임을 각각 데이터 폴더의 txt파일에 띄어쓰기로 나누어 저장해 두면,

저장된 계정 개수만큼 크롬 웹 드라이버의 instance를 생성하여 각각 로그인하는 방식으로 구현했다.

main

if __name__ == "__main__":
    twitterAutoLogin()

 

실행 결과

id.txt, pw.txt, name.txt에 각각 2개의 계정 정보를 담아 실행했다.

정상적으로 두 개 계정으로 트위터에 로그인이 잘 된 것을 볼 수 있다!

728x90
반응형