Как я получил пожизненный запас чесночной пиццы с помощью Python и Selenium

Моя цель - предложение широкого ассортимента товаров и услуг на постоянно высоком качестве обслуживания по самым выгодным ценам.

История голодного студента с пытливым умом


Не знаю, как вы, а я обожаю пиццу. Особенно если это особые чесночные пицца-палочки Papa John’s. Поэтому я был в восторге, когда после заказа еды навынос получил от них следующее письмо:


Papa John’s (с) Заголовок письма с опросом

Бесплатная еда! Мне определённо нужно было пройти этот опрос…

Опрос



Papa John’s (с) Завершающая страница опроса

Я завершил опрос как нормальный человек и получил код валидации для бесплатной чесночной пиццы.

Но из любопытства я ещё раз взглянул на ссылку. Похоже, параметр GUID был идентификатором клиента. Угадайте, что произошло, когда я изменил его на что-то случайное? Выскочил совершенно новый опрос с новыми халявными пицца-палочками.

Я мог делать это вечно! Но это не самое эффективное использование моего времени, так что давайте применим немного магии Selenium.

Бот


Selenium Webdriver — это фреймворк автоматизации действий в браузере, который в основном используется для тестирования. Я выбрал Python как язык программирования и решил попробовать Selenium для создания опросного бота.

Установка


Для начала запускаем pip install selenium и pip install fake_useragent. Что такое user-agent? Документация MDN определяют его следующим образом:

Заголовок запроса User-Agent — это строка, позволяющая серверам и сетевым узлам идентифицировать приложение, операционную систему, поставщика и/или версию агента, который отправил запрос.

Мне показалось хорошей идеей рандомизировать этот заголовок, чтобы обойти любой возможный механизм фильтрации/блокировки — вот где появляется fake_useragent.

Кроме того, нужно было скачать ChromeDriver, чтобы взаимодействовать с браузером Chrome.

Код


Базовая настройка Selenium выглядит следующим образом (инициализация с помощью случайного user-agent):

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)

После рандомизации параметра GUID бот открывает веб-страницу и начинает щёлкать мышью. Я добавил секундную задержку между действиями, чтобы страница успевала загружаться и чтобы выглядеть примерно как реальный человек.

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)

Часть скрипта бота

XPath


XPath — это язык запросов для выбора узлов из документа HTML или XML. Для каждого из вопросов опроса я использовал инструмент тестирования XPath реального времени для выбора правильных узлов, на которые нажимает бот. Конечно, я ставил Papa John’s оценки 5 звёзд по всем пунктам.


Тестирование XPath

Всегда пожалуйста!


И, наконец, получаем код валидации.


Papa John's (с) Завершающая страница опроса

driver.find_element_by_id('NextButton').click()
time.sleep(1)

code = driver.find_element_by_class_name('ValCode').get_attribute("innerHTML").split(' ')[2]

Извлечение кода валидации

Празднование


Через полчаса программирования python-бот был готов. Вот gist с кодом, а вот он в действии:


Спасибо, Papa John’s


Я ввёл все сгенерированные коды при расчёте в корзине Papa John's. И вот он — потенциально бесконечный запас чесночных пицца-палочек.

Бесплатная пицца для меня и отличные отзывы для отдела маркетинга Papa John's. Кажется, беспроигрышная ситуация! Для этого бота мне даже пришлось изучить XPath и отточить свои навыки Selenium.



Конечно, я ничего не заказал. Как честный человек, я уведомил Papa John's об уязвимости вместе с видеодоказательством. На момент написания статьи они не ответили. Но опрос больше не работает, так что я думаю, что они получили сообщение.

Кстати, я мог бы запрограммировать заказ 1000 чесночных пицц из каждого магазина Papa John's по всей Великобритании и в одиночку повергнуть сеть Papa John's в безумие. Можете себе представить, какой возник бы хаос?

Возможно, я сделал это в параллельной вселенной.
Источник: https://habr.com/ru/post/524346/


Интересные статьи

Интересные статьи

Начнем сначала В этой статье будет сказ о том, как на Clean Architecture написать API с функциями CR(U)D, где в качестве БД взят Mysql, фреймворк – Echo, ORMapper – GORM. Что делаем ...
Еще в апреле 2020 года Citizenlab сообщил о довольно слабом шифровании Zoom и заявил, что Zoom использует аудиокодек SILK. К сожалению, статья не содержала исходных данных, чтобы эт...
С помощью этого руководства мы с помощью Keras, TensorFlow и глубокого обучения научимся на собранном вручную датасете из рентгеновских снимков автоматически определять COVID-19. Как и многи...
В Python 3.8 предлагается добавить альтернативу виртуальным окружениям — локальную директорию с пакетами PEP 582 Python local packages directory. Данный PEP предлагает добавить в Python механиз...
Одной из «киллер-фич» 12й версии Битрикса была объявлена возможность отдавать статические файлы из CDN, тем самым увеличивая скорость работы сайта. Попробуем оценить практический выигрыш от использова...