PythonとSeleniumを使用して生涯にわたってガーリックピザを入手した方法

探究心を持った空腹の学生の物語



あなたのことはわかりませんが、ピザは大好きです。特にそれがパパジョンの特別なニンニクピザスティックなら。そのため、持ち帰り用の食品を注文した後、次のような手紙を受け取ったときは嬉しかったです。





パパ・ジョンの(c)調査書の見出し



無料の食品!私は間違いなくこの調査を受ける必要がありました...



インタビュー





パパ・ジョンの(c)調査終了ページ



私は普通の人として調査を完了し、無料のガーリックピザの検証コードを受け取りました。



しかし、好奇心から、私はリンクをもう一度見ました。GUIDパラメータがクライアントIDだったようです。私がそれをランダムなものに変更したときに何が起こったと思いますか?新しい無料のピザスティックで真新しい投票がポップアップしました。



私はこれを永遠に行うことができました!しかし、これは私の時間の最も効率的な使用法ではないので、いくつかのセレニウム魔法を使用しましょう。



ボット



Selenium Webdriver は、主にテストに使用されるブラウザー自動化フレームワークです。プログラミング言語としてPythonを選択し、Seleniumを試してポーリングボットを作成することにしました。



インストール



まず、実行pip install seleniumしてpip install fake_useragentユーザーエージェントとは何ですか?MDNドキュメントでは、次のように定義されています。



User-Agentリクエストヘッダーは、サーバーとネットワークノードがアプリケーション、オペレーティングシステム、ベンダー、および/またはリクエストを送信したエージェントのバージョンを識別できるようにする文字列です。


このヘッダーをランダム化して、考えられるフィルタリング/ブロックメカニズムをバイパスすることは良い考えのように思われました-それが出てくるところfake_useragentです。



さらに、Chromeブラウザと対話するにはChromeDriverダウンロードする必要がありました



コード



Seleniumの基本的なセットアップは次のようになります(ランダムなユーザーエージェントによる初期化)。



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パラメータをランダム化した後、ボットはWebページを開き、クリックを開始します。ページを読み込んで実際の人のように見えるように、アクション間に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



XPathは、HTMLまたはXMLドキュメントからノードを選択するためのクエリ言語です。調査の質問ごとに、リアルタイムのXPathテストツール使用して、ボットがクリックする正しいノードを選択しました。もちろん、私はパパジョンの5つ星をすべての点で与えました。





XPathテスト



どういたしまして!



最後に、検証コードを取得します。





パパジョンの(c)調査の最終ページ



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

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


検証コードの抽出



お祝い



30分のプログラミングの後、pythonボットの準備が整いました。これがコードの要点であり、実際の動作は次のとおりです。





ありがとう、パパジョンの



Papa Johnのショッピングカートで計算するときに、生成されたすべてのコードを入力しました。そして、ここにあります-ニンニクピザスティックの潜在的に無限の供給。



私のための無料のピザとパパジョンのマーケティングのための素晴らしいレビュー。ウィンウィンの状況のようです!このボットでは、XPathを学び、Seleniumのスキルを磨く必要がありました。







もちろん、私は何も注文しませんでした。正直な人として、私はパパジョンにビデオの証拠とともに脆弱性を通知しました。この記事の執筆時点では、彼らは応答していません。しかし、投票はもう機能しないので、彼らはメッセージを受け取ったと思います。



ちなみに、私は英国中のすべてのパパジョンの店から1000個のガーリックピザを注文し、パパジョンのチェーンを片手で狂気に追い込むようにプログラムすることができました。混沌がどのようなものになるか想像できますか?



私はこれを並行宇宙で行ったかもしれません。



All Articles