Clase 23: Use recursos para aprender a usar una plataforma de codificación para procesar códigos de verificación

En la lección anterior, presentamos una variedad de códigos de verificación, que incluyen texto gráfico, clics simulados y arrastrar y deslizar, pero en el análisis final, las personas deben emitir juicios sobre una situación determinada y luego devolver el resultado. Y somete. Si el resultado del código de verificación enviado en este momento es correcto y se pasan algunas pruebas de código de verificación, el código de verificación se puede romper con éxito.

Entonces, dado que el código de verificación es para que la gente lo reconozca, ¿qué pasa con la máquina? Si no conocemos ningún algoritmo, ¿cómo podemos resolver estos códigos de verificación? En este punto, si hay una herramienta o plataforma que nos ayude a identificar el código de verificación, sería genial, dejar que la herramienta o plataforma nos devuelva el resultado de la identificación del código de verificación, y enviamos el resultado con el resultado.

¿Existe tal herramienta o plataforma? Realmente existe una plataforma de codificación especial para ayudarnos a identificar varios códigos de verificación. El algoritmo y la mano de obra están integrados dentro de la plataforma, y ​​se pueden reconocer varios códigos de verificación 7x24 horas, incluyendo gráficos de identificación, puntos de coordenadas, huecos, etc. El código de verificación, que devuelve el resultado o las coordenadas correspondientes, puede resolver nuestro problema.

En esta lección, presentaremos el proceso de usar la plataforma de codificación para identificar el código de verificación.

objetivo de aprendizaje

En esta lección, usaremos un código de verificación como ejemplo para explicar el uso de la plataforma de codificación. El enlace para el código de verificación es: https://captcha3.scrape.cuiqingcai.com/ , este sitio web aparecerá cada vez que inicie sesión A continuación se muestra un código de verificación, su diagrama de efecto de código de verificación.
Inserte la descripción de la imagen aquí
Se muestran varios caracteres chinos en el código de verificación, y también se muestran varios caracteres chinos en la figura. Debemos hacer clic en las posiciones de los caracteres chinos en la figura en orden y hacer clic en Finalizar para confirmar el envío y completar la verificación.

Este tipo de código de verificación es difícil de identificar si no tenemos una base de algoritmo de reconocimiento de imágenes, por lo que aquí podemos usar la plataforma de codificación para ayudarnos a identificar la ubicación de los caracteres chinos.

Listo para trabajar

La biblioteca de Python que usamos es Selenium y el navegador que usamos es Chrome.

Antes de comenzar esta lección, asegúrese de que la biblioteca Selenium, el navegador Chrome y ChromeDriver se hayan instalado correctamente. Para el proceso relacionado, consulte la introducción de Selenium en esa lección.

Además, la plataforma de codificación utilizada en esta lección es Super Eagle, el enlace es: https://www.chaojiying.com/ , antes de usarlo, registre su propia cuenta y obtenga algunos puntos de prueba para probar, y también puede comprender lo que la plataforma puede reconocer. Tipo de código de verificación.

Plataforma de codificación

Los tipos de servicios que puede proporcionar la plataforma de codificación son generalmente muy amplios y existen muchos tipos de códigos de verificación identificables, incluidos los códigos de verificación de tap.

La plataforma Super Eagle también admite el reconocimiento de código de verificación gráfico simple. La plataforma Super Eagle ofrece los siguientes servicios.
Los tipos de servicios que puede proporcionar la plataforma de codificación son generalmente muy amplios y existen muchos tipos de códigos de verificación identificables, incluidos los códigos de verificación de tap.

La plataforma Super Eagle también admite el reconocimiento de código de verificación gráfico simple. La plataforma Super Eagle ofrece los siguientes servicios.

  • Números en inglés: proporcionan una identificación mixta de hasta 20 números en inglés;
  • Caracteres chinos: permite reconocer hasta 7 caracteres chinos;
  • Inglés puro: proporciona una identificación en inglés de hasta 12 dígitos;
  • Números puros: proporcione hasta 11 dígitos para identificación;
  • Caracteres especiales arbitrarios: proporcionan el reconocimiento de caracteres como caracteres chinos de longitud variable, números en inglés, iniciales en pinyin, preguntas de cálculo, combinaciones de expresiones idiomáticas, números de contenedor y otros caracteres;
  • Reconocimiento de selección de coordenadas: como preguntas de cálculo complejas, preguntas de opción múltiple, elija una de cuatro, preguntas de ensayo, haga clic en la misma palabra, objeto, animal, etc. para devolver el reconocimiento de múltiples coordenadas.

Para cambios específicos, consulte el sitio web oficial: https://www.chaojiying.com/price.html .

Lo que hay que abordar aquí es el reconocimiento de coordenadas por selección múltiple. Primero enviamos la imagen del código de verificación a la plataforma, la plataforma devolverá la posición de las coordenadas del resultado del reconocimiento en la imagen, y luego analizaremos la coordenada para simular el clic.

A continuación usaremos el programa para lograrlo.

Obtener API

Descargue la API de Python correspondiente en el sitio web oficial, el enlace es: https://www.chaojiying.com/api-14.html. La API es de la versión Python 2 y se implementa mediante la biblioteca de solicitudes. Simplemente podemos cambiar algunos lugares para modificarlo a la versión de Python 3.

La API revisada es la siguiente:

import requests
from hashlib import md5
class Chaojiying(object):

   def __init__(self, username, password, soft_id):
       self.username = username
       self.password = md5(password.encode('utf-8')).hexdigest()
       self.soft_id = soft_id
       self.base_params = {
    
    
           'user': self.username,
           'pass2': self.password,
           'softid': self.soft_id,
       }
       self.headers = {
    
    
           'Connection': 'Keep-Alive',
           'User-Agent': 'Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0)',
       }

   def post_pic(self, im, codetype):
       """
       im: 图片字节
       codetype: 题目类型 参考 http://www.chaojiying.com/price.html
       """
       params = {
    
    
           'codetype': codetype,
       }
       params.update(self.base_params)
       files = {
    
    'userfile': ('ccc.jpg', im)}
       r = requests.post('http://upload.chaojiying.net/Upload/Processing.php', data=params, files=files,
                         headers=self.headers)
       return r.json()

   def report_error(self, im_id):
       """
       im_id:报错题目的图片ID
       """
       params = {
    
    
           'id': im_id,
       }
       params.update(self.base_params)
       r = requests.post('http://upload.chaojiying.net/Upload/ReportError.php', data=params, headers=self.headers)
       return r.json()

Aquí se define una clase Chaojiying, cuyo constructor recibe tres parámetros, a saber, el nombre de usuario, la contraseña y el ID de software de Super Eagle, que se guardan para su uso.

El método más importante se llama post_pic, que debe pasar el nombre de código del objeto de imagen y el tipo de código de verificación. Este método enviará el objeto de imagen y la información relacionada al backend de Super Eagle para su identificación, y luego devolverá el JSON identificado correctamente.

Otro método se llama report_error, que es una devolución de llamada cuando ocurre un error. Si el código de verificación se identifica incorrectamente, llamar a este método devolverá la puntuación correspondiente.

A continuación, tomamos https://captcha3.scrape.cuiqingcai.com/ como ejemplo para demostrar el proceso de identificación.

inicialización

Primero, introducimos algunos paquetes necesarios y luego inicializamos algunas variables, como WebDriver, objetos Chaojiying, etc. La implementación del código es la siguiente:

import time
from io import BytesIO
from PIL import Image
from selenium import webdriver
from selenium.webdriver import ActionChains
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from chaojiying import Chaojiying
USERNAME = 'admin'
PASSWORD = 'admin'
CHAOJIYING_USERNAME = ''
CHAOJIYING_PASSWORD = ''
CHAOJIYING_SOFT_ID = 893590
CHAOJIYING_KIND = 9102
if not CHAOJIYING_USERNAME or not CHAOJIYING_PASSWORD:
   print('请设置用户名和密码')
   exit(0)
class CrackCaptcha():
   def __init__(self):
       self.url = 'https://captcha3.scrape.cuiqingcai.com/'
       self.browser = webdriver.Chrome()
       self.wait = WebDriverWait(self.browser, 20)
       self.username = USERNAME
       self.password = PASSWORD
       self.chaojiying = Chaojiying(CHAOJIYING_USERNAME, CHAOJIYING_PASSWORD, CHAOJIYING_SOFT_ID)

El NOMBRE DE USUARIO y la CONTRASEÑA aquí son el nombre de usuario y la contraseña del sitio web de muestra, y se pueden configurar como administrador. Además, CHAOJIYING_USERNAME y CHAOJIYING_PASSWORD son el nombre de usuario y la contraseña de la plataforma de codificación Super Eagle, que se puede configurar como usted mismo.

Además, aquí se define una clase CrackCaptcha, que inicializa el objeto del navegador y el objeto de operación de la plataforma de codificación.

A continuación, usamos Selenium para simular la llamada del código de verificación para iniciar la verificación.

obtener el código de verificación

El siguiente paso es completar el formulario correspondiente y simular el código de verificación de clic para llamar. La implementación del código es la siguiente:

def open(self):
   """
   打开网页输入用户名密码
   :return: None
   """
   self.browser.get(self.url)
   # 填入用户名密码
   username = self.wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, 'input[type="text"]')))
   password = self.wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, 'input[type="password"]')))
   username.send_keys(self.username)
   password.send_keys(self.password)
def get_captcha_button(self):
   """
   获取初始验证按钮
   :return:
   """
   button = self.wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, 'button[type="button"]')))
   return button

Aquí llamamos al método open para completar el formulario. El método get_captcha_button obtiene el botón captcha y luego dispara un clic. En este momento, se puede ver que la página ha presentado el captcha.

Con la imagen del código de verificación, el siguiente paso que debemos hacer es obtener el contenido específico del código de verificación y enviarlo a la plataforma de codificación para su identificación.

¿Cómo obtener la imagen del código de verificación? Primero podemos obtener la ubicación y el tamaño de la imagen del código de verificación, y luego tomar la imagen del código de verificación correspondiente de la captura de pantalla de la página web. La implementación del código es la siguiente:

def get_captcha_element(self):
   """
   获取验证图片对象
   :return: 图片对象
   """
   # 验证码图片加载出来
   self.wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, 'img.geetest_item_img')))
   # 验证码完整节点
   element = self.wait.until(EC.presence_of_element_located((By.CLASS_NAME, 'geetest_panel_box')))
   print('成功获取验证码节点')
   return element
def get_captcha_position(self):
   """
   获取验证码位置
   :return: 验证码位置元组
   """
   element = self.get_captcha_element()
   time.sleep(2)
   location = element.location
   size = element.size
   top, bottom, left, right = location['y'], location['y'] + size['height'], location['x'], location['x'] + size[
       'width']
   return (top, bottom, left, right)
def get_screenshot(self):
   """
   获取网页截图
   :return: 截图对象
   """
   screenshot = self.browser.get_screenshot_as_png()
   screenshot = Image.open(BytesIO(screenshot))
   screenshot.save('screenshot.png')
   return screenshot
def get_captcha_image(self, name='captcha.png'):
   """
   获取验证码图片
   :return: 图片对象
   """
   top, bottom, left, right = self.get_captcha_position()
   print('验证码位置', top, bottom, left, right)
   screenshot = self.get_screenshot()
   captcha = screenshot.crop((left, top, right, bottom))
   captcha.save(name)
   return captcha

Aquí, el método get_captcha_image es interceptar la imagen captcha correspondiente de la captura de pantalla de la página web, y el método get_captcha_position devuelve las coordenadas de posición relativa de la imagen captcha. Por lo tanto, el código de verificación se obtuvo tomando una captura de pantalla y luego cortando.

Nota: Si su pantalla es una pantalla de alta definición, como la pantalla Retina de una Mac, es posible que deba ajustar la resolución de la pantalla de manera adecuada o realizar varios cálculos de compensación para la posición del código de verificación obtenido.

Finalmente, el código de verificación que obtenemos es el objeto Imagen, y el resultado se muestra en la figura.
Inserte la descripción de la imagen aquí

Código de verificación de identificación

Ahora que tenemos el mapa del código de verificación, el siguiente paso es enviar el mapa a la plataforma de codificación.

Llamamos al método post_pic del objeto Chaojiying para enviar la imagen al backend de Super Eagle. La imagen enviada aquí está en formato de flujo de bytes. La implementación del código es la siguiente:

image = self.get_touclick_image()
bytes_array = BytesIO()
image.save(bytes_array, format='PNG')
# 识别验证码
result = self.chaojiying.post_pic(bytes_array.getvalue(), CHAOJIYING_KIND)
print(result)

Después de ejecutar, la variable de resultado es el resultado de reconocimiento del fondo de Super Eagle. Puede que tarde unos segundos en ejecutarse y devolverá una cadena en formato JSON.

Si el reconocimiento es exitoso, el resultado de devolución típico es el siguiente:

{
    
    'err_no': 0, 'err_str': 'OK', 'pic_id': '6002001380949200001', 'pic_str': '132,127|56,77', 'md5': '1f8e1d4bef8b11484cb1f1f34299865b'}

Entre ellos, pic_str es la coordenada del texto reconocido, que se devuelve como una cadena, y cada coordenada está separada por |. A continuación, solo necesitamos analizarlo y luego simular el clic, la implementación del código es la siguiente:

def get_points(self, captcha_result):
   """
   解析识别结果
   :param captcha_result: 识别结果
   :return: 转化后的结果
   """
   groups = captcha_result.get('pic_str').split('|')
   locations = [[int(number) for number in group.split(',')] for group in groups]
   return locations
def touch_click_words(self, locations):
   """
   点击验证图片
   :param locations: 点击位置
   :return: None
   """
   for location in locations:
       ActionChains(self.browser).move_to_element_with_offset(self.get_captcha_element(), location[0], location[1]).click().perform()
       time.sleep(1)

Aquí, el método get_points se utiliza para convertir el resultado del reconocimiento en una lista. El método touch_click_words pasa las coordenadas analizadas a su vez llamando al método move_to_element_with_offset, y luego haga clic en.

De esta forma, hemos simulado el clic de las coordenadas, y el efecto de ejecución se muestra a continuación.
Inserte la descripción de la imagen aquí
Por último, simule hacer clic en el botón enviar verificación y, una vez superada la verificación, se iniciará sesión automáticamente. La implementación posterior no se repetirá aquí.

¿Cómo juzgar si el inicio de sesión se realizó correctamente? También puede utilizar las condiciones de evaluación de Selenium. Por ejemplo, si un texto determinado aparece en la página de evaluación, significa que el inicio de sesión se realizó correctamente. El código es el siguiente:

# 判定是否成功
success = self.wait.until(EC.text_to_be_present_in_element((By.TAG_NAME, 'h2'), '登录成功'))

Por ejemplo, aquí hemos determinado si la página saltará a la página que indica el éxito haciendo clic en el botón Confirmar. La página correcta contiene un nodo h2 con las palabras "inicio de sesión exitoso", lo que significa que el inicio de sesión es exitoso.

De esta forma, hemos completado la identificación del código de verificación táctil con la ayuda de la plataforma de códigos de verificación en línea. Este método es un método general, y también podemos usar este método para identificar varios códigos de verificación, como gráficos, números y aritmética.

Conclusión

En esta lección, ayudamos a completar la identificación del código de verificación a través de la plataforma de codificación en línea. Este método de identificación es muy poderoso y se puede identificar casi cualquier código de verificación. Si encuentra un problema, usar una plataforma de codificación es sin duda una excelente opción.

Supongo que te gusta

Origin blog.csdn.net/weixin_38819889/article/details/107907234
Recomendado
Clasificación