如何单击 buster 按钮以使用 Python 和 selenium 解决 reCaptcha?

How to click the buster button to solve reCaptcha with Python and selenium?

我想使流程自动化,但需要通过验证码,为此,我决定使用名为“Buster:人类验证码求解器”的扩展程序 link to the extension.

但是我遇到但没有找到答案的问题是,当验证码出现时我无法点击实际的破坏按钮。

为了达到这一点,我将使用代码 -->

WebDriverWait(self.driver, 10).until(EC.frame_to_be_available_and_switch_to_it((By.CSS_SELECTOR,"iframe[name^='a-'][src^='https://www.google.com/recaptcha/api2/anchor?']")))
WebDriverWait(self.driver, 10).until(EC.element_to_be_clickable((By.XPATH, "//span[@id='recaptcha-anchor']"))).click()

但是我好像不能点击buster图标,HTML代码如下(不好意思是图片格式)

我所做的研究是它在#shadow-root(关闭)中,这就是我无法点击或访问它的原因。然后我尝试研究,但从我发现的结果来看,没有任何效果。

(有人问过这个话题,但没有得到答案,是吗,是你!想成为第一个回答这个问题的人(至少从我所看到的)?你还在等什么?)

我的首要问题是:

也许有更好的方法(免费)绕过 reCaptcha,最好也绕过 hCaptcha? 如何单击带有硒或任何其他 python3 包的元素?

现在让我告诉你一些事情

  • way1 非常基础但不是动态的;

您可以使用 python 模块来完成;此模块名称是 pyautogui

import pyautogui

pyautogui.click(x=X coordinate of the button you want to press, y=#Y coordinate of the button you want to press)

你可以问一下如何知道按钮的坐标,你可以使用pyautogui.position(),找到坐标后在上面使用它们

注意:不要忘记当在后台时你不能点击你的按钮(这里是为什么不是动态的)


  • way2 可能很难:)

我不认为这个(shadow-root) 是你不能按下按钮的原因。至于我的猜测;

据我所知,您要查找的按钮位于 iframe 内,因此您必须进入 iframe 才能单击。由于我不知道你要找的按钮的id而且我现在也没有太多时间,所以让我向你展示一下音频按钮是如何按下的(逻辑可能与你要找的按钮相同) 。您所要做的就是填写正确的id。

class Captcha:
    def __init__(self):
        self.option = webdriver.ChromeOptions()
        self.option.add_argument('--disable-notifications')
        self.option.add_argument('--mute-audio')
        self.option.add_argument("user-agent=Mozilla/5.0 (iPhone; CPU iPhone OS 10_3 like Mac OS X) AppleWebKit/602.1.50 (KHTML, like Gecko) CriOS/56.0.2924.75 Mobile/14E5239e Safari/602.1")

        self.driver = webdriver.Chrome(options = self.option)

    def start_to_bypasscaptcha(self):
        self.driver.get(#URL of site)

        time.sleep(5)
        googleClass = self.driver.find_elements_by_class_name('g-recaptcha')[0]
        outeriframe = googleClass.find_element_by_tag_name('iframe')
        outeriframe.click()

        allIframesLen = self.driver.find_elements_by_tag_name('iframe')
        audioBtnFound = None
        audioBtnIndex = -1

        for index in range(len(allIframesLen)):
            self.driver.switch_to.default_content()
            iframe = self.driver.find_elements_by_tag_name('iframe')[index]
            self.driver.switch_to.frame(iframe)
            try:
                print(self.driver.find_element_by_id("audio-instructions").text)
                time.sleep(1)
                audioBtn = self.driver.find_element_by_id('recaptcha-audio-button') or self.driver.find_element_by_id('recaptcha-anchor')
                audioBtn.click()
                audioBtnFound = True
                audioBtnIndex = index
                break
            except Exception as error:
                pass

        time.sleep(3)
        if audioBtnFound:
            #do what do you want
        else:
            print('Button not found.')

如果你把这段代码正确地应用到你想要的按钮上但它不起作用,你是对的,shadow-root 可能是这个问题的原因。


我的代码说明;

  • 使用 selenium
  • 打开 chrome
  • 前往URL
  • 等待几秒钟后找到验证码
  • 查找验证码框架内的所有 iframe
  • 每次进入找到的 iframe 并尝试单击按钮
  • 当您找到可点击的按钮时,结束循环并分配一个该按钮所属的 iframe 变量

非常认真的笔记;需要说明一下,写第二种方式并不是为了给出答案,主要是为了展示逻辑。