Die Geschichte eines hungrigen Studenten mit einem forschenden Geist
Ich weiß nichts über dich, aber ich liebe Pizza. Besonders wenn es Papa Johns spezielle Knoblauchpizzasticks sind. Daher freute ich mich sehr, als ich nach der Bestellung von Essen zum Mitnehmen den folgenden Brief von ihnen erhielt:
Papa Johns (c) Überschrift des Umfragebriefs
Kostenloses Essen! Ich musste unbedingt an dieser Umfrage teilnehmen ...
Interview
Papa Johns (c) Abschlussseite
der Umfrage Ich habe die Umfrage als normale Person abgeschlossen und einen Validierungscode für eine kostenlose Knoblauchpizza erhalten.
Aber aus Neugier habe ich mir den Link noch einmal angesehen. Der GUID-Parameter war anscheinend eine Client-ID. Ratet mal, was passiert ist, als ich es in etwas Zufälliges geändert habe? Eine brandneue Umfrage mit neuen kostenlosen Pizzasticks erschien.
Ich könnte das für immer tun! Aber dies ist nicht die effizienteste Nutzung meiner Zeit, also lasst uns etwas Selenmagie verwenden.
Der Bot
Selenium Webdriver ist ein Browser-Automatisierungsframework, das hauptsächlich zum Testen verwendet wird. Ich wählte Python als meine Programmiersprache und beschloss, Selenium auszuprobieren, um einen Polling-Bot zu erstellen.
Installation
Zuerst laufen
pip install seleniumund pip install fake_useragent. Was ist User-Agent? Die MDN-Dokumentation definiert es wie folgt:
Der User-Agent-Anforderungsheader ist eine Zeichenfolge, mit der Server und Netzwerkknoten die Anwendung, das Betriebssystem, den Hersteller und / oder die Version des Agenten identifizieren können, der die Anforderung gesendet hat.
Es schien eine gute Idee zu sein, diesen Header zufällig zu sortieren, um mögliche Filter- / Blockierungsmechanismen zu umgehen - hier kommt er ins Spiel
fake_useragent.
Außerdem mussten Sie den ChromeDriver herunterladen, um mit dem Chrome-Browser zu interagieren.
Der Code
Das grundlegende Selenium-Setup sieht folgendermaßen aus (Initialisierung mit einem zufälligen Benutzeragenten):
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)
Nach dem Randomisieren des GUID-Parameters öffnet der Bot eine Webseite und beginnt mit dem Klicken. Ich habe eine zweite Verzögerung zwischen den Aktionen hinzugefügt, damit die Seite Zeit zum Laden hat und wie eine echte Person aussieht.
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)
Teil des Bot-Skripts
XPath
XPath ist eine Abfragesprache zum Auswählen von Knoten aus einem HTML- oder XML-Dokument. Für jede der Umfragefragen habe ich ein Echtzeit-XPath-Testtool verwendet , um die richtigen Knoten auszuwählen, auf die der Bot klickt. Natürlich habe ich Papa Johns 5 Sterne in jeder Hinsicht gegeben.
XPath-Tests
Immer gerne!
Schließlich erhalten wir den Validierungscode.
Papa Johns (c) Die letzte Seite der Umfrage
driver.find_element_by_id('NextButton').click()
time.sleep(1)
code = driver.find_element_by_class_name('ValCode').get_attribute("innerHTML").split(' ')[2]
Extrahieren des Validierungscodes
Feier
Nach einer halben Stunde Programmierung war der Python-Bot fertig. Hier ist ein Kern mit Code, und hier ist es in Aktion:
Danke, Papa John
Ich habe alle generierten Codes bei der Berechnung in Papa Johns Warenkorb eingegeben. Und hier ist es - ein potenziell endloser Vorrat an Knoblauch-Pizzasticks.
Kostenlose Pizza für mich und tolle Bewertungen für Papa Johns Marketing. Scheint eine Win-Win-Situation zu sein! Für diesen Bot musste ich sogar XPath lernen und meine Selenium-Fähigkeiten verbessern.
Natürlich habe ich nichts bestellt. Als ehrliche Person habe ich Papa John's zusammen mit Videobeweisen über die Sicherheitslücke informiert. Zum jetzigen Zeitpunkt haben sie nicht geantwortet. Aber die Umfrage funktioniert nicht mehr, also denke ich, dass sie die Nachricht verstanden haben.
Übrigens könnte ich programmieren, 1000 Knoblauchpizzas in jedem Geschäft von Papa John in ganz Großbritannien zu bestellen und Papa Johns Kette im Alleingang in den Wahnsinn zu treiben. Können Sie sich vorstellen, wie das Chaos aussehen würde?
Ich könnte dies in einem Paralleluniversum getan haben.