Не знаю как вы, а я обожаю пиццу, особенно вместе с чесночными палочками от «Папа Джонс». И когда мне пришло это сообщение после последнего заказа, я был на седьмом небе от счастья:
Бесплатная еда! Я должен пройти этот опрос…
Опрос
Я ответил на их вопросы, как и обычно, и, разумеется, получил промокод на бесплатные чесночные палочки.
Но из-за своей любопытности я решил взглянуть на оригинальную ссылку. Казалось, что параметры 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 звезд «Папа Джонс» за всё.
Пожалуйста!
И, наконец, мы получили код подтверждения:
// Извлечение кода подтверждения
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 чесночных пицц в каждом филиале «Папа Джонс» по всей Британии и собственноручно взбесить их. Представьте какой хаос произошел бы.
Возможно, я сделал это в параллельной вселенной.
Читайте также:
- Не используйте оператор «+» для объединения строк в Python
- Считаете, что Python лучше всех? Просто вы не имели дело с Rust
- Как автоматизировать электронную почту с помощью Python
Читайте нас в Telegram, VK и Яндекс.Дзен
Перевод статьи Sanjeet Chatterjee: How I Used Python and Selenium To Get a Lifetime Supply of Garlic Pizza Sticks