问题在于页面源代码中的验证码URL不是实际的图像URL。它是用来动态生成验证码图像的脚本,因此当您使用验证码解算器API时,您正在解决与浏览器加载的图片不同的另一张图片。要解决这个问题,我们需要保存浏览器加载的相同图像。我追踪了图片请求并发现它使用了在浏览器加载页面时生成的唯一cookie。
使用Selenium:
from selenium import webdriver
from python3_anticaptcha import ImageToTextTask, CallbackClient
from time import sleep
import requests
def GetImageCookies():
print('Extracting Browser Cookies')
image_cookies = ''
for cookie in browser.get_cookies():
if cookie['name'] == 'ssc':
image_cookies += 'ssc={};'.format(cookie['value'])
elif cookie['name'] == 'ghsdfkjlksssalk35bbr':
image_cookies += 'ghsdfkjlksssalk35bbr={};'.format(cookie['value'])
return image_cookies
def SaveImage(captcha_file = "master.jpg"):
print('Saving the captcha image')
header = {
'Accept': 'image/webp,image/apng,image/*,*/*;q=0.8',
'Accept-Encoding': 'gzip, deflate, br',
'Accept-Language': 'en,en-US;q=0.9,ar;q=0.8',
'Cookie': GetImageCookies(),
'Host': 'masked',
'Referer': 'masked',
'Sec-Fetch-Mode': 'no-cors',
'Sec-Fetch-Site': 'same-origin',
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:70.0) Gecko/20100101 Firefox/70.0'}
pic = requests.get('https://masked/site/captcha/v/',verify=False,headers = header)
if pic.status_code == 200:
with open(captcha_file, 'wb') as f:
f.write(pic.content)
def SolveCapcha(captcha_file = "master.jpg"):
print('Solving the captcha image')
ANTICAPTCHA_KEY = 'masked'
result = ImageToTextTask.ImageToTextTask(
anticaptcha_key=ANTICAPTCHA_KEY).captcha_handler(captcha_file=captcha_file)
captcha_text = result['solution']['text']
print('Captcha text is :',captcha_text)
return captcha_text
browser = webdriver.Firefox()
url = 'https://masked/'
browser.get(url)
def Login():
SaveImage()
sleep(5)
username = browser.find_element_by_id("masked_username")
username.clear()
username.send_keys("testuser")
password = browser.find_element_by_id("masked")
password.clear()
password.send_keys("testpass")
captcha = browser.find_element_by_id("masked")
captcha.clear()
captcha_text = SolveCapcha()
captcha.send_keys(captcha_text)
login = browser.find_element_by_id("masked").click()
sleep(5)
err_message = browser.find_elements_by_id('masked')
if err_message :
if err_message[0].text == 'The verification code is incorrect.':
print(err_message[0].text)
return False
return True
"""The logic here is that the image gets downloaded using the cookies but sometimes
the letters are hard to be solved so each time we download the same image with the
same cookies the content of the image will be the same but how it's written is different
So we keep trying till we get it right """
while Login() == False:
Login()
使用Requests和Beautiful Soup:
以下是思路,不确定是否可行,需要自行测试:
from bs4 import BeautifulSoup
def SaveImage(captcha_file = "master.jpg"):
print('Saving the captcha image')
header = {
'Accept': 'image/webp,image/apng,image/*,*/*;q=0.8',
'Accept-Encoding': 'gzip, deflate, br',
'Accept-Language': 'en,en-US;q=0.9,ar;q=0.8',
'Host': 'masked',
'Referer': 'https://masked/',
'Sec-Fetch-Mode': 'no-cors',
'Sec-Fetch-Site': 'same-origin',
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:70.0) Gecko/20100101 Firefox/70.0'}
pic = session.get('https://masked/site/captcha/v/',verify=False,headers = header)
if pic.status_code == 200:
with open(captcha_file, 'wb') as f:
f.write(pic.content)
with requests.Session() as session:
source = session.get(url = 'https://masked/',verify=False)
soup = BeautifulSoup(source.text, 'html.parser')
token = soup.find('input', {'name': 'masked'}).get('value')
SaveImage()
captcha_text = SolveCapcha()
post_data={"masked": token,
'masked[username]': 'testuser',
'masked[password]': 'testpass',
'masked[captcha]': captcha_text,
'masked':''}
session.post('https://masked/', data=post_data,verify=False)