[英]How do I click captcha box using requests and selenium?
我正在嘗試使用 requests.post 從網頁獲取帳號
在大約 5 個帖子查詢后,該網站正在請求驗證碼(post answer = {"captcha_needed": true, "error": "captcha-check-failed"})
我如何簡單地點擊驗證碼框? 我嘗試使用 fake_useragent 來避免驗證碼,我還嘗試使用 selenium 和 chrome web 驅動程序,但沒有幫助。 這是我的代碼:
class Account(commands.Cog):
def __init__(self, bot):
self.bot = bot
self.servers = {'red': 1, 'green': 2, 'blue': 3, 'lime': 4}
self.config = configparser.ConfigParser()
self.config.read('config.ini')
@commands.command()
async def account(self, ctx, nickname):
for allowed in eval(self.config['account']['access']):
if ctx.message.author.id != allowed:
flag = False
else:
flag = True
break
if flag:
serverName = 'red'
server = str(serverName).lower()
server_id = self.servers[server]
lenght = len(nickname) + 61
ua = UserAgent()
userAgent = ua.random
headers = {
'Accept': '*/*',
'Accept-Encoding': 'gzip, deflate, br',
'Accept-Language': 'ru-RU,ru;q=0.9,en-US;q=0.8,en;q=0.7',
'Connection': 'keep-alive',
'Content-Length': str(lenght),
'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8',
'Cookie': '_ym_uid=155880155795497451; _ga=GA1.2.1836303506.1558801557; arp_ab=ff4d30d27222533a8a483bd63b1d7e; _ym_d=1589195755; csrftoken=QVHCsDlmUM2NSm18Xiw3QHexjMYrbbDMFITFBd4eV5hJJQJUzBjoiVQQIOEf9STZ; _gid=GA1.2.525781881.1591250700; _ym_isad=1; _ym_visorc_8171623=w; sessionid=n8b07bhdedsqt3m0swcap60avntvn6qi',
'Host': 'www.advance-rp.ru',
'Origin': 'https://www.advance-rp.ru',
'Referer': 'https://www.advance-rp.ru/donate/',
'Sec-Fetch-Dest': 'empty',
'Sec-Fetch-Mode': 'cors',
'Sec-Fetch-Site': 'same-origin',
'User-Agent': userAgent,
'X-Requested-With': 'XMLHttpRequest'
}
payload = {
'g-recaptcha-response': '',
'sum': str(random.randint(1, 1000)),
'account': nickname,
'service': 'unitpay',
'server': str(server_id)
}
ans = requests.post('https://www.advance-rp.ru/donate/request/do/', data = payload, headers = headers)
print(ans.text)
if ans.text == '{"captcha_needed": true, "error": "captcha-check-failed"}':
options = webdriver.ChromeOptions()
options.add_argument("start-maximized")
options.add_experimental_option("excludeSwitches", ["enable-automation"])
options.add_experimental_option('useAutomationExtension', False)
driver = webdriver.Chrome(options=options, executable_path=r'C:\WebDrivers\chromedriver.exe')
driver.get('https://www.advance-rp.ru/donate/')
WebDriverWait(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(driver, 10).until(EC.element_to_be_clickable((By.XPATH, "//span[@id='recaptcha-anchor']"))).click()
ans = requests.post('https://www.advance-rp.ru/donate/request/do/', data = payload, headers = headers)
result = ans.text.split(',')
result.reverse()
account_id_field = result[0]
account_id_field = '{' + account_id_field
account_id = eval(account_id_field)
我正在創建一個 Discord 機器人,所以忽略與其相關的所有代碼。 主要問題是,即使我使用 chrome web 驅動程序解決了問題,我也不確定它是否適用於托管服務(例如 heroku)。 當我嘗試手動獲取此頁面時,我可以簡單地單擊驗證碼框並通過它,但是當我嘗試 chrome web 驅動程序時,它需要額外的圖片選擇。 我想使用其他東西可以解決問題。 這是驗證碼框的屏幕截圖。
我希望有人以前遇到過類似的問題並且可以幫助我。
由於 iframe 位於不同的域中,因此您還必須使用“--disable-web-security”啟動 chrome:
opts = Options()
opts.add_argument("--disable-web-security")
driver = webdriver.Chrome(options=opts)
然后切換到iframe點擊:
iframe = driver.find_element_by_css_selector('iframe[src*="api2"]')
driver.switch_to.frame(iframe)
driver.execute_script("""
document.querySelector('.rc-anchor-checkbox').click()
""")
您可能需要調整 css。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.