La historia de un estudiante hambriento con una mente inquisitiva
No sé ustedes, pero me encanta la pizza. Especialmente si se trata de palitos de pizza de ajo especiales de Papa John. Por lo tanto, quedé encantado cuando, después de pedir comida para llevar, recibí la siguiente carta de ellos:
Papa John's (c) Título de la carta de la encuesta
¡Comida gratis! Definitivamente necesitaba realizar esta encuesta ...
Entrevista
Página de cierre de
la encuesta de Papa John's (c) Completé la encuesta como una persona normal y recibí un código de validación para una pizza de ajo gratis.
Pero por curiosidad, volví a mirar el enlace. Parece que el parámetro GUID era un ID de cliente. ¿Adivina qué pasó cuando lo cambié a algo aleatorio? Apareció una nueva encuesta con nuevos palitos de pizza gratis.
¡Podría hacer esto para siempre! Pero este no es el uso más eficiente de mi tiempo, así que usemos un poco de magia de selenio.
El bot
Selenium Webdriver es un marco de automatización del navegador que se utiliza principalmente para realizar pruebas. Elegí Python como mi lenguaje de programación y decidí probar Selenium para crear un robot de sondeo.
Instalación
Primero, ejecute
pip install selenium
y pip install fake_useragent
. ¿Qué es user-agent? La documentación de MDN lo define de la siguiente manera:
El encabezado de solicitud de usuario-agente es una cadena que permite a los servidores y nodos de red identificar la aplicación, el sistema operativo, el proveedor y / o la versión del agente que envió la solicitud.
Parecía una buena idea aleatorizar este encabezado para evitar cualquier posible mecanismo de filtrado / bloqueo; ahí es donde entra en juego
fake_useragent
.
Además, tenía que descargar ChromeDriver para interactuar con el navegador Chrome.
El código
La configuración básica de Selenium se ve así (inicialización con agente de usuario aleatorio):
from fake_useragent import UserAgent
from selenium import webdriver
from random import randrange
import time
ua = UserAgent(verify_ssl=False)
user_agent = ua.random
print("USER AGENT: " + user_agent)
chrome_options = webdriver.ChromeOptions()
chrome_options.add_argument("user-agent=" + user_agent)
driver = webdriver.Chrome(chrome_options=chrome_options)
Después de aleatorizar el parámetro GUID, el bot abre una página web y comienza a hacer clic. Agregué un segundo retraso entre acciones para que la página tenga tiempo de cargarse y se vea como una persona real.
id = randrange(100000000000000)
url = "https://www.papajohnsfeedback.com/GBR?GUID=" + str(id)
print(url)
driver.get(url)
time.sleep(1)
driver.find_element_by_id('NextButton').click()
time.sleep(1)
driver.find_element_by_id('NextButton').click()
time.sleep(1)
driver.find_element_by_xpath("//div[contains(@class, 'Opt1')]/span").click()
time.sleep(1)
Parte del script del bot
XPath
XPath es un lenguaje de consulta para seleccionar nodos de un documento HTML o XML. Para cada una de las preguntas de la encuesta, utilicé una herramienta de prueba XPath en tiempo real para seleccionar los nodos correctos en los que hace clic el bot. Por supuesto, le di a Papa John's 5 estrellas en todos los aspectos.
Prueba XPath
¡De nada!
Finalmente, obtenemos el código de validación.
Papa John's (c) La página final de la encuesta
driver.find_element_by_id('NextButton').click()
time.sleep(1)
code = driver.find_element_by_class_name('ValCode').get_attribute("innerHTML").split(' ')[2]
Extrayendo el código de validación
Celebracion
Después de media hora de programación, el bot de Python estaba listo. Aquí hay una esencia con el código, y aquí está en acción:
Gracias Papa John's
Ingresé todos los códigos generados al calcular en el carrito de compras de Papa John. Y aquí está: un suministro potencialmente interminable de palitos de pizza de ajo.
Pizza gratis para mí y excelentes críticas para Papa John's Marketing. ¡Parece una situación en la que todos ganan! Para este bot, incluso tuve que aprender XPath y perfeccionar mis habilidades con Selenium.
Por supuesto, no ordené nada. Como persona honesta, le he notificado a Papa John's sobre la vulnerabilidad junto con pruebas de video. Al momento de escribir estas líneas, no han respondido. Pero la encuesta ya no funciona, así que creo que captaron el mensaje.
Por cierto, podría programar para pedir 1000 pizzas de ajo en todas las tiendas de Papa John's en todo el Reino Unido y, sin ayuda, llevar a la cadena de Papa John a la locura. ¿Puedes imaginar el caos que sería?
Puede que haya hecho esto en un universo paralelo.