如何解决Selenium上的隐形验证码

问题描述 投票:0回答:2

嗨,我正在尝试使用 Selenium 为 UEFA.com 编写一个注册机器人,因为我发现对我来说尝试起来太困难了,所以我只是致力于自动化注册过程,即使它慢了很多。

我能够进入最后阶段,单击“创建帐户”,但面临只有在单击“创建帐户”后才会出现的验证码。解决验证码后,没有“提交”按钮,但它会自动为您提交详细信息。

我能够获取从2captcha解决服务返回的验证码令牌,并使用javascript将其输入到g-response-token字段的innerHTML中。但是我不知道如何提交验证码和表格。

import requests
import time
from selenium.webdriver.support.ui import WebDriverWait
from webdriver_manager.chrome import ChromeDriverManager
from selenium.webdriver.common.by import By
from seleniumwire import webdriver
import pyautogui
from twocaptcha import TwoCaptcha
import random
import os
from random import randint
import sys

firstnames = []
lastnames = []

API_Key = '6LehfZUbAAAAAJhue_6BVqqxLulLiXLP0rEgpdRH'

# Open Names File
with open('firstnames.txt', 'r') as f:
    for name in f:
        name = name.strip()
        firstnames.append(name)

with open('lastnames.txt', 'r') as e:
    for name in e:
        name = name.strip()
        lastnames.append(name)

with open('proxies.txt') as f:
    proxy = f.readlines()

proxy_rand = randint(1, 35)
s_proxy = str(proxy[proxy_rand])
p_strip = s_proxy.rstrip()

# Proxy Input and Format
bare_proxy = p_strip.split(':')
username = bare_proxy[2]
password = bare_proxy[3]
ip = bare_proxy[0]
port = bare_proxy[1]

options = {
    'proxy': {
        'http': f'http://{username}:{password}@{ip}:{port}',
        'https': f'https://{username}:{password}@{ip}:{port}',
        'no_proxy': 'localhost,127.0.0.1'
    }
}

os.environ['PATH'] += 'C:/SeleniumDrivers'
homepage_URL = 'https://www.uefa.com/tickets/'

driver = webdriver.Chrome(seleniumwire_options=options)
driver.get(homepage_URL)

# Accessing Register Page
reject_cookies = driver.find_element(By.ID, 'onetrust-reject-all-handler')
reject_cookies.click()
time.sleep(1)

login_button = driver.find_element(By.CSS_SELECTOR, "a[class='btn btn-secondary tickets__btn js-tracking-card']")
login_button.click()
time.sleep(10)

create_account = driver.find_element(By.XPATH, '/html/body/div[2]/div[2]/div[2]/div/form/div[4]/a')
create_account.click()
time.sleep(10)

# Inputting SignUp Details

letters = 'abcdefghijklmnopqrstuvwxyz'
a = random.choice(letters)
b = random.choice(letters)
c = random.choice(letters)
d = random.choice(letters)

email = driver.find_element(By.XPATH, '/html/body/div[2]/div[2]/div[2]/div/form/div[1]/div[6]/input')
email.send_keys(f'{a}{b}{c}{d}@nottingham.pro')

time.sleep(2)

password = driver.find_element(By.XPATH, '/html/body/div[2]/div[2]/div[2]/div/form/div[1]/div[7]/input')
password.send_keys('19741002Rw!')

time.sleep(2)
first_name = driver.find_element(By.XPATH, '//*[@id="gigya-textbox-130722358975432270"]')
first_range = len(firstnames) - 1
random_first = randint(1, first_range)
f_name = firstnames[random_first]
first_name.send_keys(f'{f_name}')

time.sleep(2)
last_name = driver.find_element(By.XPATH, '/html/body/div[2]/div[2]/div[2]/div/form/div[1]/div[9]/input')
last_range = len(lastnames) - 1
random_last = randint(1, first_range)
l_name = lastnames[random_last]
last_name.send_keys(f'{l_name}')

time.sleep(2)
day_of_birth = driver.find_element(By.XPATH, '/html/body/div[2]/div[2]/div[2]/div/form/div[1]/div[10]/div[1]/input')
day = randint(1, 28)
day_of_birth.send_keys(f'{day}')

time.sleep(2)
month_of_birth = driver.find_element(By.XPATH, '/html/body/div[2]/div[2]/div[2]/div/form/div[1]/div[10]/div[2]/input')
month = randint(1, 12)
month_of_birth.send_keys(f'{month}')

time.sleep(2)
year_of_birth = driver.find_element(By.XPATH, '/html/body/div[2]/div[2]/div[2]/div/form/div[1]/div[10]/div[3]/input')
year = randint(1940, 2000)
year_of_birth.send_keys(f'{year}')

driver.execute_script("window.scrollTo(0, 500)")
time.sleep(2)

pyautogui.moveTo(353, 619)
time.sleep(2)
pyautogui.click()

time.sleep(5)

current_url = driver.current_url
print(current_url)

g_key = '6LehfZUbAAAAAJhue_6BVqqxLulLiXLP0rEgpdRH'


def SolveCaptcha():
    sys.path.append(os.path.dirname(os.path.dirname(os.path.realpath(__file__))))

    api_key = os.getenv(g_key, 'a733edea49a8327795d56edc9f06d391')

    solver = TwoCaptcha(api_key)

    try:
        result = solver.recaptcha(
            sitekey=g_key,
            url=current_url)

    except Exception as e:
        print(e)

    else:
        return result


result = SolveCaptcha()
code = result['code']
print(code)

token = f'document.getElementById("g-recaptcha-response").innerHTML="{code}";'
driver.execute_script(token)

time.sleep(10000)

正如您在代码末尾看到的那样,我已成功输入验证码令牌,但不确定如何提交,因为没有提交按钮

我尝试寻找回调函数,但当我检查页面时似乎找不到它。

python selenium captcha invisible
2个回答
0
投票

提交页面上的第一个表格:

driver.execute_script('document.forms[0].submit()')

0
投票

我只是像你一样解决问题。 在这个问题中,找到一个回调函数非常重要。 当你正确找到并运行它时,验证码就会被解决。

例如,我在我的例子中运行了一个回调函数。 我的网站网址是 link

driver.execute_script("grecaptcha.execute();")

也希望你能解决你的问题

© www.soinside.com 2019 - 2024. All rights reserved.