簡體   English   中英

向 Discord 提交 hcaptcha 驗證碼令牌以使用 selenium 創建帳戶

[英]Submitting hcaptcha captcha token to Discord to create account using selenium

我正在使用 python selenium 創建一個 Discord 帳戶 ( https://discord.com/register ),但它受 hcaptcha 保護。 我有一個驗證碼 API (2captcha/capmonster) 來返回驗證碼令牌並將其放入 g-captcha-response 文本區域。 通常有一個提交按鈕,之后您可以單擊該按鈕,然后您可以訪問該站點(如果驗證碼標記正確),但是一旦您手動完成驗證碼,Discord 會自動重定向您。 我假設 Discord 正在使用 hcaptcha 回調函數。 但是我沒有找到回調函數,所以我可以在輸入驗證碼令牌后調用它。

這是我到目前為止的代碼:

import random
import requests
import time
from webdriver_manager.chrome import ChromeDriverManager
from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
from selenium.webdriver.common.action_chains import ActionChains
from selenium.webdriver.common.keys import Keys


email = "example@gmail.com"
username = "exampleusername"
password = "examplepassword"

driver = webdriver.Chrome(ChromeDriverManager().install())
driver.get('https://discord.com/register')
WebDriverWait(driver, 1).until(EC.presence_of_element_located((By.XPATH, "//input[@type='email']")))
driver.find_element_by_xpath("//input[@type='email']").send_keys(email) # email
driver.find_element_by_xpath("//input[@type='text']").send_keys(username) # username
driver.find_element_by_xpath("//input[@type='password']").send_keys(password) # password
driver.find_element_by_xpath('//*[@id="app-mount"]/div[2]/div/div[2]/div/form/div/div[2]/div[4]/div[1]/div[1]/div/div/div/div/div[2]/div').click()

actions = ActionChains(driver)
actions.send_keys(str(random.randint(1, 12))) # Month
actions.send_keys(Keys.ENTER)
actions.send_keys(str(random.randint(1, 28))) # Day
actions.send_keys(Keys.ENTER)
actions.send_keys(str(random.randint(1989, 2000))) # Year
actions.perform()

try:
    driver.find_element_by_class_name('inputDefault-3JxKJ2').click()  # Agree to terms and conditions
except:
    pass
driver.find_element_by_class_name('button-3k0cO7').click()  # Submit button


# get captcha key
site_key = 'f5561ba9-8f1e-40ca-9b5b-a0b3f719ef34'
url = "https://discordapp.com/register"
API_KEY = "CAPMONSTER API KEY"
s = requests.Session()
data_post = {
    "clientKey": API_KEY,
    "task":
        {
            "type": "HCaptchaTaskProxyless",
            "websiteURL": url,
            "websiteKey": site_key
        }
}
captcha_id = s.post("https://api.capmonster.cloud/createTask", json=data_post).json()
data_get = {
    "clientKey": API_KEY,
    "taskId": captcha_id['taskId']
}
captcha_answer = s.get("https://api.capmonster.cloud/getTaskResult", json=data_get).json()
while captcha_answer['status'] == "processing":
    time.sleep(5)
    captcha_answer = s.get("https://api.capmonster.cloud/getTaskResult", json=data_get).json()
captcha_token = captcha_answer["solution"]["gRecaptchaResponse"]
driver.execute_script(f'document.getElementsByName("g-recaptcha-response")[0].innerText="{captcha_token}";') # put captcha token into g-recaptcha-response textarea
driver.execute_script(f'document.getElementsByName("h-captcha-response")[0].innerText="{captcha_token}";')

# code to submit captcha token

您應該嘗試手動解決驗證碼,看看有什么區別,注意元素的任何變化?

將驗證碼標記注入 h-captcha-response 和 g-recaptcha-response 元素總是會引發錯誤。

我給你舉個例子,有時在解決 hCaptcha 后會生成一個新的隱藏元素,所以你可以做的是創建完全相同的元素

js_script = f"""
          let captchaElement = document.getElementById('captcha')
          let inputElement = document.createElement('input');
          inputElement.setAttribute('type', 'hidden');
          inputElement.setAttribute('name', 'response_token');
          inputElement.setAttribute('value', "{captcha_token}");
          captchaElement.appendChild(inputElement)
"""
self.driver.execute_script(js_script)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM