使用2captcha服务和Python Selenium/Scrapy通过回调函数求解Recaptcha V2

j9per5c4  于 2023-01-26  发布在  Python
关注(0)|答案(1)|浏览(337)

我想抓取一个website,要访问搜索结果,必须先用回调函数解决Recaptcha V2(见下面的截图)
Recaptcha V2 with a callback function
我正在使用名为2captcha的专用验证码解决程序。该服务为我提供了一个令牌,然后我将其插入回调函数以绕过验证码。我使用此GitHub Gist中的代码找到了回调函数,并且能够在Chrome开发工具控制台中成功调用该函数
可以通过键入以下两个命令中的任意一个来调用该函数

window[___grecaptcha_cfg.clients[0].o.o.callback]('captcha_token')
    • 或**
verifyAkReCaptcha('captcha_token')

然而,当我在Python Selenium中使用driver.execute_script()方法调用这些函数时,我得到了一个错误。我还尝试用这个方法执行其他标准的Javascript函数(例如,向下滚动页面),我一直得到错误。这可能是因为我试图抓取的域阻止我用自动化工具执行任何Javascript。
所以,我的问题是,在我从2captcha服务获得令牌后,我如何调用回调函数?我将感谢所有我能得到的帮助。提前感谢hero(in),他/她知道如何绕过这个困难的captcha。干杯!!
一些额外的信息,以帮助我的问题:
1.* * 使用了自动化框架**--〉Python Seleniumscrappy。我觉得两种都可以
1.* * 错误消息**--〉Error message 1Error message 2
1.* * 代码**

from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from twocaptcha import TwoCaptcha
from dotenv import load_dotenv
import os

# Load environment variables
load_dotenv()

# Instantiate a solver object
solver = TwoCaptcha(os.getenv("CAPTCHA_API_KEY"))
sitekey = "6Lfwdy4UAAAAAGDE3YfNHIT98j8R1BW1yIn7j8Ka"
url = "https://suchen.mobile.de/fahrzeuge/search.html?dam=0&isSearchRequest=true&ms=8600%3B51%3B%3B&ref=quickSearch&sb=rel&vc=Car"

# Set chrome options
chrome_options = Options()
chrome_options.add_argument('start-maximized') # Required for a maximized Viewport
chrome_options.add_experimental_option('excludeSwitches', ['enable-logging', 'enable-automation'])
chrome_options.add_experimental_option("detach", True)
chrome_options.add_experimental_option('prefs', {'intl.accept_languages': 'en,en_US'})

# Instantiate a browser object and navigate to the URL
driver = webdriver.Chrome(chrome_options=chrome_options)

driver.get(url)

driver.maximize_window()

def solve(sitekey, url):
    try:
        result = solver.recaptcha(sitekey=sitekey, url=url)
    except Exception as e:
        exit(e)

    return result.get('code')

captcha_key = solve(sitekey=sitekey, url=url)
print(captcha_key)

# driver.execute_script(f"window[___grecaptcha_cfg.clients[0].o.o.callback]('{captcha_key}')") # This step fails in Python but runs successfully in the console
# driver.execute_script(f"verifyAkReCaptcha('{captcha_key}')") # This step fails in Python but runs successfully in the console
piv4azn7

piv4azn71#

要解决captcha问题,我们可以使用pyautogui。要安装软件包,请运行pip install pyautogui。使用它,我们可以与屏幕上显示的内容进行交互。这意味着浏览器窗口必须在python脚本执行期间可见。这是相对于其他方法的一大缺点,但另一方面,它非常可靠。
在我们的例子中,我们需要点击这个框

来解决验证码,所以我们将告诉pyautogui在屏幕上找到这个框,然后点击它。
因此,将图像保存在计算机上,并将其命名为box.png,然后运行此代码(用缺少的代码替换...)。

import pyautogui
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

...

driver.get(url)
driver.maximize_window()

# html of the captcha is inside an iframe, selenium cannot see it if we first don't switch to the iframe
WebDriverWait(driver, 9).until(EC.frame_to_be_available_and_switch_to_it((By.ID, "sec-cpt-if")))

# wait until the captcha is visible on the screen
WebDriverWait(driver, 9).until(EC.visibility_of_element_located((By.CSS_SELECTOR, '#g-recaptcha')))

# find captcha on page
checkbox = pyautogui.locateOnScreen('box.png')
if checkbox:
    # compute the coordinates (x,y) of the center
    center_coords = pyautogui.center(checkbox)
    pyautogui.click(center_coords)
else:
    print('Captcha not found on screen')

相关问题