Auto Tinder Bot

🤖프사 자동 생성 사이트


current_window_handle : 웹 드라이버가 현재 포커스하고 있는 브라우저 창 또는 탭의 핸들을 반환

  • 로그인까지만 구현

  • 주로 사용한 메소드 find_element(By.XPATH, value: )

  • 무료로 Like 누를 수 있는 횟수만큼 for문


ElementClickInterceptedException

  • 코드가 웹 요소를 클릭하려고 할 때, 그 요소가 현재 보이지 않거나 다른 요소에 의해 가려져 있어서 실제 클릭이 실행되지 못할 때 발생
  • 예외 처리 방법
    1. 가려진 요소를 기다리기: 가려진 요소가 사라질 때까지 기다리거나, 사라지도록 조치
    2. JavaScript를 사용하여 클릭 실행: 가려진 요소에 대한 클릭을 시도하는 대신, JavaScript를 사용하여 클릭을 강제로 실행
    3. 스크롤하여 요소가 보이게 하기: 페이지를 스크롤하여 해당 요소가 화면에 보이게 한 후 클릭을 시도
    4. 다른 요소가 사라지기를 기다린 후 클릭 시도: WebDriverWait를 사용하여 가려진 요소가 사라질 때까지 기다린 후, 원하는 요소를 클릭


NoSuchElementException

  • 해당 요소가 현재 웹 페이지 DOM에 존재하지 않을 때 발생하는 예외
  • 이 오류가 발생하는 몇 가지 일반적인 시나리오
    1. 잘못된 셀렉터: 요소를 선택하기 위해 사용한 셀렉터(예: XPath, CSS 선택자 등)가 올바르지 않거나, 타이핑 오류가 있을 때
    2. 동적 웹 요소: 웹 페이지가 완전히 로드되기 전에 요소를 찾으려고 시도하거나, AJAX 호출을 통해 페이지의 일부가 동적으로 업데이트되고 해당 요소가 아직 생성되지 않았을 때
    3. 페이지 네비게이션 문제: 요소가 있는 페이지로 아직 이동하지 않았거나, 페이지가 변경되어 이전에 접근 가능했던 요소가 더 이상 존재하지 않을 때
  • 예외 처리 방법
    1. 올바른 셀렉터 확인: 셀렉터가 요소를 정확하게 지정하고 있는지 확인
      웹 개발자 도구를 사용하여 셀렉터가 유효한지 테스트할 수 있다
    2. 명시적 대기 (Explicit Wait): WebDriverWait와 같은 명시적 대기를 사용하여 특정 요소가 나타날 때까지 대기, 요소가 동적으로 로드될 때 유용함
    3. 페이지 로딩 대기: driver.get(url) 후 페이지의 로딩이 완료될 때까지 대기



Final Code(로그인까지만 아래는 참고)

from time import sleep
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.chrome.service import Service
from selenium.common.exceptions import NoSuchElementException, ElementClickInterceptedException, TimeoutException
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

# url of main page.
URL = "https://tinder.com/app/recs"
FB_EMAIL = ''  # Replace with your actual email used for login
FB_PASSWORD = ''  # Replace with your actual password

chrome_options = webdriver.ChromeOptions()
chrome_options.add_experimental_option("detach", True)

driver = webdriver.Chrome(options=chrome_options)
driver.get("http://www.tinder.com")

sleep(3)
login_button = driver.find_element(By.XPATH, '//*[@id="s-1837973528"]/div/div[1]/div/main/div[1]/div/div/div/div/header/div/div[2]/div[2]/a/div[2]/div[2]')
login_button.click()

sleep(3)
fb_login = driver.find_element(By.XPATH, '//*[@id="s728612692"]/main/div[1]/div/div[1]/div/div/div[2]/div[2]/span/div[2]/button/div[2]/div[2]/div/div')
fb_login.click()

sleep(2)
base_window = driver.window_handles[0]
fb_login_window = driver.window_handles[1]
driver.switch_to.window(fb_login_window)
print(driver.title)

email = driver.find_element(By.XPATH, '//*[@id="email"]')
password = driver.find_element(By.XPATH, '//*[@id="pass"]')

email.send_keys(FB_EMAIL)
password.send_keys(FB_PASSWORD)

sleep(3)
login_click = driver.find_element(By.NAME, 'login')
login_click.click()

############################

sleep(5)
allow_location_button = driver.find_element(By.XPATH, '//*[@id="modal-manager"]/div/div/div/div/div[3]/button[1]')
allow_location_button.click()
notifications_button = driver.find_element(By.XPATH, '//*[@id="modal-manager"]/div/div/div/div/div[3]/button[2]')
notifications_button.click()
cookies = driver.find_element(By.XPATH, '//*[@id="content"]/div/div[2]/div/div/div[1]/button')
cookies.click()

#Tinder free tier only allows 100 "Likes" per day. If you have a premium account, feel free to change to a while loop.
for n in range(100):

    #Add a 1 second delay between likes.
    sleep(1)

    try:
        print("called")
        like_button = driver.find_element(By.XPATH, '//*[@id="content"]/div/div[1]/div/main/div[1]/div/div/div[1]/div/div[2]/div[4]/button')
        like_button.click()

    #Catches the cases where there is a "Matched" pop-up in front of the "Like" button:
    except ElementClickInterceptedException:
        try:
            match_popup = driver.find_element(By.CSS_SELECTOR, ".itsAMatch a")
            match_popup.click()

        #Catches the cases where the "Like" button has not yet loaded, so wait 2 seconds before retrying.
        except NoSuchElementException:
            sleep(2)

driver.quit()