Simulación de Inicio de Sesión en el Sitio Web 12306

Simulación de Inicio de Sesión en el Sitio Web 12306

Contenido- Simulación de Inicio de Sesión en el Sitio Web 12306

  • Preparación
  • Análisis de Reuqisitos
  • Implementación del Código (este código es solo para fines educativos, no usar con fines ilegales)

Preparación

Sitio Objetivo: https://kyfw.12306.cn/otn/login/init
Instalar módulo PIL: pip3 install pillow o pip3 --default-timeout=100 install -U pillow (librería de procesamiento de imágenes para recortar y ubicar imágenes)
Preparar un controlador de navegador (no demasiado diferente en versión) chromedriver.exe  Descargar: https://npm.taobao.org/mirrors/chromedriver/
Servicio de reconocimiento de CAPTCHA (Super Eagle): http://www.chaojiying.com/ Requiere registro, para el método de uso consultar #CAPTCHA recognition en la página; https://www.cnblogs.com/guokaifeng/p/11536706.html


Análisis de Requisitos

Implementar el inicio de sesión simulado usando el módulo selenium
- Dificultad: El reconocimiento automático de CAPTCHA (el CAPTCHA debe obtenerse de una sola vez, si se recarga cambiará el CAPTCHA)
- Solución: Recortar la zona del CAPTCHA (usando el módulo Image de PIL), usar Super Eagle para obtener las coordenadas correctas del CAPTCHA, y luego usar selenium para realizar el inicio de sesión    


Implementación del Código (este código es solo para fines educativos, no usar con fines ilegales)

from PIL import Image #Importar Image para capturas de pantalla
from time import sleep
from selenium import webdriver
from CaptchaSolver import Chaojiying_Client # Importar el servicio de reconocimiento de CAPTCHA
from selenium.webdriver import ActionChains # Importar ActionChains para cadenas de acciones
navegador = webdriver.Chrome(executable_path='chromedriver.exe') # Especificar el controlador del navegador
navegador.get('https://kyfw.12306.cn/otn/login/init')
sleep(3) # Evitar fallos en la carga de imágenes por problemas de red

navegador.find_element_by_id('username').send_keys('123456') # Ingresar cuenta 12306
navegador.find_element_by_id('password').send_keys('67890000000') # Ingresar contraseña

navegador.save_screenshot('pantalla_principal.png') # Capturar pantalla completa

# Localizar la imagen del CAPTCHA en la página
elemento_capcha = navegador.find_element_by_xpath('//*[@id="loginForm"]/div/ul[2]/li[4]/div/div/div[3]/img') # Localizar la etiqueta de la imagen del CAPTCHA
ubicacion = elemento_capcha.location # Coordenadas de la imagen (esquina inferior izquierda, esquina superior derecha) {'x':274,'y':293}
dimensiones = elemento_capcha.size # Dimensiones de la imagen {'height':190,'width':293}
# Área de recorte (obtener la imagen del CAPTCHA)
rango = (int(ubicacion['x']),int(ubicacion['y']),int(ubicacion['x']+dimensiones['width']),int(ubicacion['y']+dimensiones['height']))

# Usar Image para recortar la imagen del CAPTCHA captcha.png
imagen = Image.open('./pantalla_principal.png')
recorte = imagen.crop(rango)
recorte.save('captcha.png')

# Usar Super Eagle para reconocer la imagen
def obtener_texto(rutaImagen,tipoImagen):
servicio_captcha = Chaojiying_Client('usuario', 'contraseña', 'id_software')# usuario, contraseña y ID de software de Super Eagle (requiere mínimo 1 yuan en la cuenta)
with open(rutaImagen, 'rb') as f:
imagen_bytes = f.read()
return servicio_captcha.PostPic(imagen_bytes, tipoImagen)['pic_str']

resultado = obtener_texto('./captcha.png',9004) # Proporcionar CAPTCHA y tipo de CAPTCHA, devuelve coordenadas como 55,70|267,133 (error si el usuario es incorrecto o no hay saldo)

# Convertir coordenadas de imagen 55,70|267,133 ==[[55,70],[267,133]]
todas_coordenadas = []
lista_coordenadas = resultado.split('|')   #['55,70', '267,133']
todas_coordenadas.append([int(x) for x in lista_coordenadas[0].split(',')])
todas_coordenadas.append([int(x) for x in lista_coordenadas[-1].split(',')])
# Usar cadena de acciones para hacer clic en las áreas del CAPTCHA
for coordenada in todas_coordenadas:
x = coordenada[0]
y = coordenada[1]
ActionChains(navegador).move_to_element_with_offset(elemento_capcha,x,y).click().perform()
sleep(1)


navegador.find_element_by_id('loginSub').click() # Hacer clic en iniciar sesión

sleep(5)
navegador.quit() # Salir


# Código para Super Eagle
import requests
from hashlib import md5

class Chaojiying_Client(object):

def __init__(self, usuario, contraseña, id_software):
self.usuario = usuario
contraseña_bytes =  contraseña.encode('utf8')
self.contraseña = md5(contraseña_bytes).hexdigest()
self.id_software = id_software
self.parametros_base = {
'user': self.usuario,
'pass2': self.contraseña,
'softid': self.id_software,
}
self.encabezados = {
'Connection': 'Keep-Alive',
'User-Agent': 'Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0)',
}

def PostPic(self, imagen_bytes, tipo_codigo):
"""
imagen_bytes: bytes de la imagen
tipo_codigo: tipo de CAPTCHA, referencia http://www.chaojiying.com/price.html
"""
parametros = {
'codetype': tipo_codigo,
}
parametros.update(self.parametros_base)
archivos = {'userfile': ('imagen_captcha.jpg', imagen_bytes)}
respuesta = requests.post('http://upload.chaojiying.net/Upload/Processing.php', data=parametros, files=archivos, headers=self.encabezados)
return respuesta.json()

def ReportError(self, id_imagen):
"""
id_imagen: ID de la imagen con error reportado
"""
parametros = {
'id': id_imagen,
}
parametros.update(self.parametros_base)
respuesta = requests.post('http://upload.chaojiying.net/Upload/ReportError.php', data=parametros, headers=self.encabezados)
return respuesta.json()

Etiquetas: Selenium Web Scraping captcha recognition PIL/Pillow automation

Publicado el 6-2 01:24