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

Не знаю как вы, а я обожаю пиццу, особенно вместе с чесночными палочками от «Папа Джонс». И когда мне пришло это сообщение после последнего заказа, я был на седьмом небе от счастья:

оставьте нам отзыв и получите бесплатные чесночные палочки
“Пройди наш опросник и получи бесплатные чесночные пицца-палочки или картофельные шарики на следующий онлайн заказ!” 

Бесплатная еда! Я должен пройти этот опрос…

Опрос

Я ответил на их вопросы, как и обычно, и, разумеется, получил промокод на бесплатные чесночные палочки.

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

Я мог делать так вечно! Но это не очень эффективно, поэтому добавим-ка немного магии Selenium.

Бот

Selenium Webdriver  —  это инструмент для автоматизации веб-браузера, который в первую очередь применяется для тестирования.

Установка

Я начал с команды pip install selenium и pip install fake_useragent. Агент пользователя (User-Agent)? Что это? MDN Web docs определяет его так:

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

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

Также нужно скачать Chrome Driverдля соединения с 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 бот открывает веб-страницу и начинает прощёлкивать её. Добавляем задержку в 1–2 секунды, чтобы страница успевала прогрузиться и бот казался обычным человеком.

// Часть скрипта для бота

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  —  это язык запросов к элементам HTML или XML документа. Для каждого вопроса из опросника я тестировал XPath в режиме реального времени, чтобы бот нажимал на правильный ответ. Разумеется, я поставил 5 звезд «Папа Джонс» за всё.

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

Пожалуйста!

И, наконец, мы получили код подтверждения:

«Папа Джонс» © Ответ на опрос
// Извлечение кода подтверждения

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 с кодом и как он работает:

Спасибо «Папа Джонс»!

Я ввёл все промокоды, и вот он  —  бесконечный запас чесночных пицц-палочек

Я получаю бесплатную чесночную пиццу, а маркетинговый отдел «Папа Джонс»  —  прекрасные отзывы, думаю беспроигрышный вариант для меня! Я даже выучил XPath и опробовал свои знания Selenium пока делал все это.

“Папа Джонс” © Оформление заказа

Но, конечно же, я не стал заказывать. Вместо этого, как порядочный человек, я сообщил «Папа Джонс» об этой лазейке и отправил видеодоказательство. На момент написания этой статьи они ещё не ответили, однако сама анкета больше не работает, поэтому полагаю, что они получили сообщение.

К слову, с прагматической точки зрения я мог бы заказать 1000 чесночных пицц в каждом филиале «Папа Джонс» по всей Британии и собственноручно взбесить их. Представьте какой хаос произошел бы.

Возможно, я сделал это в параллельной вселенной.

Читайте также:

Читайте нас в Telegram, VK и Яндекс.Дзен


Перевод статьи Sanjeet Chatterjee: How I Used Python and Selenium To Get a Lifetime Supply of Garlic Pizza Sticks

Предыдущая статьяGitHub Codespaces: быстрая разработка на ходу с Flutter
Следующая статьяОбновления в Android 11: Scoped Storage и другие улучшения конфиденциальности