使用硒来解决验证码 [英] Using selenium to solve captcha

查看:94
本文介绍了使用硒来解决验证码的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

下面的我的代码将继续解决其他验证码!请更正我的错误,因为我不知道是什么原因造成的!

My Code below is keep solving a different Captcha ! Please correct my mistake as i don't know what's causing that!

from selenium import webdriver
from python3_anticaptcha import ImageToTextTask, CallbackClient
import time
import requests

browser = webdriver.Firefox()

url = 'https://urlmased.com/'
browser.get(url)
time.sleep(10)
username = browser.find_element_by_id("masked")
username.send_keys("testuser")
password = browser.find_element_by_id("masked")
password.send_keys("testpass")

image_link = browser.find_element_by_xpath(
    '//*[@id="masked"]').get_attribute('src')
pic = requests.get(image_link)
if pic.status_code == 200:
    with open("image.png", 'wb') as f:
        f.write(pic.content)
ANTICAPTCHA_KEY = 'masked'
captcha_file = "image.png"
result = ImageToTextTask.ImageToTextTask(
    anticaptcha_key=ANTICAPTCHA_KEY).captcha_handler(captcha_file=captcha_file)

captcha = browser.find_element_by_id("masked")
captcha.send_keys(result['solution']['text'])
login = browser.find_element_by_id("yw2")

被告知该API已激活,因此您可以使用它直到找到解决方案.然后我将其更改.

Be Informed that the API is active so you can use it till you reach a solution. and then i will change it.

而且求解的准确度是100%

Also the accuracy of solving is 100%

推荐答案

此处的问题是页面源中的验证码URL不是 实际的图片网址.这是一个动态生成验证码的脚本 当您使用验证码求解器API时,您正在解决的图像 图片与浏览器加载的图片不同.为了解决这个问题,我们必须 保存浏览器加载的相同图像.我跟踪了图像请求 并发现它使用的是当 浏览器已加载页面.

The issue here is that the captcha URL in the page source is not an actual image URL. It's a script to dynamically generate captcha images there for when you use the captcha solver API you are solving a defferent image than the browser loaded. To solve this we have to save the same image the browser loaded. I traced the image request and found out, it's using unique cookies that was generated when the browser loaded the page.

使用硒:

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'])
    # print(image_cookies)
    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()

使用要求和精美汤: 以下是不确定是否可以正常工作的想法,您必须进行自我测试:

Using Requests and Beautiful soup: the following is the idea not sure if it's working you will have to test yourself:

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) # To get the itial cookies  
    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)

这篇关于使用硒来解决验证码的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆