Обратный вызов Recaptcha v2 – борьба с решением 2CaptchaPython

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 Обратный вызов Recaptcha v2 – борьба с решением 2Captcha

Сообщение Anonymous »

Я пытаюсь решить рекапчу v2 с обратным вызовом, рекапча — это решение картинок. Я не совсем уверен, в чем моя проблема, потому что рекапча попадает ко мне только тогда, когда я нахожусь в безголовом режиме.
Я успешно извлекаю обратный вызов и отправляю решение. Когда это произойдет, веб-страница перейдет на следующую страницу. Но окно капчи все еще открыто. Я изо всех сил пытаюсь нажать кнопку «Проверить». Я пробую различные методы для переключения на iframe, но кнопка «Проверить» не найдена. Использую ли я XPath, CSS и т. д.
Могут ли кто-нибудь поможет понять, где я ошибаюсь?
def solve_recaptcha(api_key, site_key, url):
print(f"Sending sitekey to 2Captcha: {site_key}")
# Send the sitekey to 2Captcha for solving
response = requests.post(
'http://2captcha.com/in.php',
data={
'key': api_key,
'method': 'userrecaptcha',
'googlekey': site_key,
'pageurl': url
}
)
print(f"2Captcha response: {response.text}")
if response.text.startswith('OK|'):
captcha_id = response.text.split('|')[1]
else:
raise Exception(f"Error from 2Captcha: {response.text}")

# Retrieve the CAPTCHA solution
while True:
time.sleep(5)
result = requests.get(f'http://2captcha.com/res.php?key={api_ke ... captcha_id}')
if result.text == 'CAPCHA_NOT_READY':
continue
if result.text.startswith('OK|'):
captcha_solution = result.text.split('|')[1]
break
else:
raise Exception(f"Error from 2Captcha: {result.text}")

print(f"CAPTCHA Solution: {captcha_solution}")
return captcha_solution

try:

# JavaScript function to find reCAPTCHA clients
find_recaptcha_clients_js = """
function findRecaptchaClients() {
if (typeof (___grecaptcha_cfg) !== 'undefined') {
return Object.entries(___grecaptcha_cfg.clients).map(([cid, client]) => {
const data = { id: cid, version: cid >= 10000 ? 'V3' : 'V2' };
const objects = Object.entries(client).filter(([_, value]) => value && typeof value === 'object');

objects.forEach(([toplevelKey, toplevel]) => {
const found = Object.entries(toplevel).find(([_, value]) => (
value && typeof value === 'object' && 'sitekey' in value && 'size' in value
));

if (typeof toplevel === 'object' && toplevel instanceof HTMLElement && toplevel['tagName'] === 'DIV'){
data.pageurl = toplevel.baseURI;
}

if (found) {
const [sublevelKey, sublevel] = found;

data.sitekey = sublevel.sitekey;
const callbackKey = data.version === 'V2' ? 'callback' : 'promise-callback';
const callback = sublevel[callbackKey];
if (!callback) {
data.callback = null;
data.function = null;
} else {
data.function = callback;
const keys = [cid, toplevelKey, sublevelKey, callbackKey].map((key) => `['${key}']`).join('');
data.callback = `___grecaptcha_cfg.clients${keys}`;
}
}
});
return data;
});
}
return [];
}
return findRecaptchaClients();
"""

# Execute the JavaScript function to get reCAPTCHA clients data
recaptcha_data = driver.execute_script(find_recaptcha_clients_js)
print(f"reCAPTCHA Data: {recaptcha_data}")

if recaptcha_data:
# Assuming the first reCAPTCHA client found is the target
recaptcha_info = recaptcha_data[0]
site_key = recaptcha_info['sitekey']
callback_function = recaptcha_info.get('callback')

# Solve the reCAPTCHA
captcha_solution = solve_recaptcha(api_key, site_key, url)

# Inject the solved token into the page
driver.execute_script(f"document.getElementById('g-recaptcha-response').innerHTML='{captcha_solution}';")

# Execute the callback function if it exists
if callback_function:
driver.execute_script(f"var callback = {callback_function}; callback('{captcha_solution}');")

print("CAPTCHA solved and token submitted successfully.")
else:
print("No reCAPTCHA found on the page.")

except Exception as e:
print(f"Error: {e}")


Я прилагаю несколько фотографий, чтобы показать, как страница продвигается после отправки решения [введите описание изображения здесь] (https://i.sstatic.net/TpprM7PJ.png)
Как видите, страница продвигается после отправки решения, но iframe, содержащий капчу, все еще присутствует.
Переключение на iframe с помощью
driver.switch_to.frame(0)
wait = WebDriverWait(driver, 10)
button = wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, "[id*='verify']")))

# Click the button
button.click()
print("Button clicked successfully!")


Подробнее здесь: https://stackoverflow.com/questions/785 ... tcha-solve
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Python»