So umgehen Sie Hcaptcha mit Python Selen
Posted: 14 Jul 2025, 15:36
Ich versuche, einen Prozess auf einer Website zu automatisieren, auf der HCAPTCHA verwendet wird, indem die Captcha über eine externe API (Solvecaptcha) gelöst und das Token mit Seleniumbase in die Seite injiziert. Die API gibt erfolgreich ein Token und ein Benutzeragent zurück, aber das Einstellen des Tokens in der HTML scheint die Captcha nicht als gelöst zu markieren, und die Formulierung der Form ist fehl. Ich habe versucht, das Token in den Feldern H-Captcha-Response und G-Recaptcha-Response sowie des Data-Hcaptcha-Response -attributs des HCaptcha-Iframe festzulegen, aber es funktioniert immer noch nicht. Solvecaptcha API, um das Token zu bekommen. Ich habe auch die relevante HTML für den HCaptcha Iframe aufgenommen.
Was ich ausprobiert habe
Einstellen des Tokens: Ich setze das Token in H-Captcha-Response und G-Recaptcha-Response Fields mit sb.execute_script
Code: Select all
import time
import json
import requests
from bs4 import BeautifulSoup
from seleniumbase import SB
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
API_KEY = "KEY"
PAGE_URL = "https://accounts.hcaptcha.com/demo"
def solve_hcaptcha(sitekey):
api_get_url = "https://api.solvecaptcha.com/res.php"
api_post_url = "https://api.solvecaptcha.com/in.php"
payload = {
'key': API_KEY,
'method': 'hcaptcha',
'sitekey': sitekey,
'pageurl': PAGE_URL,
'json': 1
}
res = requests.post(api_post_url, data=payload)
result: dict = res.json()
if result.get("status") != 1:
raise RuntimeError(f"Error sending request: {result.get('request')}")
captcha_id = result.get("request")
print("Received captcha_id:", captcha_id)
while True:
params = {
'key': API_KEY,
'action': 'get',
'id': captcha_id,
'json': 1
}
res = requests.get(api_get_url, params=params)
data: dict = res.json()
if data.get("status") == 1:
print("Captcha solved successfully!")
return data
elif data.get("request") == "CAPCHA_NOT_READY":
print("Captcha not ready yet, waiting 5 seconds...")
time.sleep(5)
else:
raise RuntimeError(f"Error retrieving solution: {data.get('request')}")
def set_captcha_token(sb, token: str):
sb.execute_script(
"document.querySelector(" + "'" + '[name="h-captcha-response"]' + "'" + ").innerHTML = " + "'" + token + "'")
sb.execute_script(
"document.querySelector(" + "'" + '[name="g-recaptcha-response"]' + "'" + ").innerHTML = " + "'" + token + "'")
iframe = sb.find_element(By.CSS_SELECTOR, 'iframe[title="Widget containing checkbox for hCaptcha security challenge"]')
sb.execute_script("arguments[0].setAttribute('data-hcaptcha-response', arguments[1])", iframe, token)
def query_target_name(sb, first_name: str, middle_name: str, last_name: str):
sb.type("//input[@id='id1']", 'aaron', By.XPATH)
sb.type("//input[@id='ide']", 'marks', By.XPATH)
sb.type("//input[@id='idf']", 'daniel', By.XPATH)
sb.click("//input[@id='id3']", By.XPATH)
wait = WebDriverWait(sb.driver, 10)
wait.until(lambda driver: driver.current_url != PAGE_URL)
def main():
with SB(uc=True) as sb:
sb.uc_open_with_reconnect(PAGE_URL, 10)
try:
sitekey = sb.get_attribute("div.h-captcha", "data-sitekey")
print(f"Extracted sitekey: {sitekey}")
except Exception as e:
print(f"Failed to find element with data-sitekey: {e}")
return
try:
solution = solve_hcaptcha(sitekey)
token = solution.get("request")
user_agent = solution.get("useragent")
print("Token:", str(token))
print("User-Agent:", user_agent)
set_captcha_token(sb, str(token))
print("Token successfully inserted into the form fields.")
html = sb.get_page_source()
with open("myhtml.html", 'w', encoding="utf-8") as file:
file.write(html)
query_target_name(sb, "Aaron", "Daniel", "Marks")
print("Submitted target name to input box and pressed search")
res = scrap_data_from_source(sb.get_page_source())
print(res)
time.sleep(10)
except Exception as e:
print(f"Failed to solve the captcha: {e}")
return
if __name__ == "__main__":
main()
< /code>
Relevantes HTML
Wenn ich das HCaptcha manuell löste, sehe ich das Token im Data-Hcaptcha-Response-Attribut des IFrame: < /p>
Einstellen des Tokens: Ich setze das Token in H-Captcha-Response und G-Recaptcha-Response Fields mit sb.execute_script