作為一個小練習專案,我正在嘗試撰寫一個 Python 腳本,以從本質上暴力破解網站上隨機餐廳的優惠券代碼輸入。代碼采用兩個大寫字母后跟 6 個整數的形式。例如:XZ957483。作為一個起點,我撰寫了一個腳本,它以正確的形式生成無限數量的組合。看起來像這樣:
import random
import string
i = 1
while i>=1:
number = random.randint(100000,999999)
print(random.choice(string.ascii_uppercase) random.choice(string.ascii_uppercase) str(number))
i = i 1
我如何實際建立連接以在網頁上運行這段代碼并使其繼續運行,直到找到正確的組合?而且我還在想,運行腳本并在網頁輸入上生成所有組合更好,還是應該將組合寫入文本檔案并將其用作在網頁上運行的字典?任何幫助深表感謝!
uj5u.com熱心網友回復:
一個真實的例子很難(而且不道德)做,因為網站會在嘗試過多后阻止請求,或者使用驗證碼來阻止機器人,等等。
/cupons/{cupon_id}但是我們可以撰寫一個簡單的網路服務器來實作一個簡單的場景,其中對端點的請求可能會以200 OK如果找到或404 NOT FOUND其他方式回應。
為此,我們需要一些額外的庫,您可以使用 pip 安裝它們:
pip install fastapi requests uvicorn
from fastapi import FastAPI, HTTPException, status
VALID_CUPON = "XZ12345"
app = FastAPI()
@app.get("/cupons/{cupon_id}")
def get(cupon_id: str):
if cupon_id == VALID_CUPON:
return {"msg": f"{cupon_id} is a valid cupon!"}
else:
raise HTTPException(status_code=status.HTTP_404_NOT_FOUND, detail=f"{cupon_id} is NOT a valid cupon!")
現在我們可以使用 uvicorn 服務器運行這個 FastAPI 應用程式。我呼叫了它webserver.py,并且應用程式保存在變數app中,因此 uvicorn 的引數將是webserver:app:
python3 -m uvicorn webserver:app --reload
服務器將在控制臺中運行,我們可以向它發送請求。例如,您可以在瀏覽器中嘗試,網址為 http://localhost:8000/cupons/XZ12345。
現在我們可以撰寫一個腳本來向它發送請求并在不同的控制臺中運行它:
import random
import string
import requests
i = 1
while i>=1:
number = random.randint(100000,999999)
random_cupon = random.choice(string.ascii_uppercase) random.choice(string.ascii_uppercase) str(number)
response = requests.get(f"http://127.0.0.1:8000/cupons/{random_cupon}")
if response.status_code == 404:
print(f"Failed attempt with {random_cupon}")
if response.status_code == 200:
print(f"Succesful attempt with cupon {random_cupon}!!!")
break
i = i 1
此腳本將向您的本地服務器發送許多請求并列印一條訊息,宣布失敗或成功。如果成功,它也會從回圈中中斷并停止。
我們可以做一些改進:
i并不是真的需要,因為我們希望它永遠運行:我們可以使用True- 在您的代碼中,數字從 100000 開始,因此永遠不會找到 cupon“AX000001”。我們可以包含所有可能的數字,然后做一些字串格式化技巧來添加前導 0。
import random
import string
import requests
while True:
letter1 = random.choice(string.ascii_uppercase)
letter2 = random.choice(string.ascii_uppercase)
number = random.randint(0,999999)
random_cupon = f"{letter1}{letter2}{number:06}"
response = requests.get(f"http://127.0.0.1:8000/cupons/{random_cupon}")
if response.status_code == 404:
print(f"Failed attempt with {random_cupon}")
if response.status_code == 200:
print(f"Succesful attempt with cupon {random_cupon}!!!")
break
請記住,這將花費您很長時間才能完成。使用 2 個字母和 6 個數字,我們得到26*26*1000000組合,即 6700 萬 - 如果對本地服務器的每個請求需要 1 毫秒,那么平均需要 676,000 秒才能完成!對遠程網路服務器的請求可能需要更長的時間,例如至少 50 毫秒,甚至更多。
因此,最好從較小的值開始,例如 2 個字母和 1 個數字。為此,您需要更改:
- 服務器中的有效杯
- 隨機發生器
- 添加前導零的字串格式
uj5u.com熱心網友回復:
您可以嘗試檢查它們是否是一個 API,您可以在其中每次使用不同的優惠券代碼進行郵寄呼叫。但是我不確定這是否合乎道德,我懷疑它會起作用。
這是因為您正在嘗試生成具有大約十億種可能性的優惠券代碼。沒有服務器會允許您嘗試強制執行此操作,如果他們允許這樣做,它很可能會在獲得結果之前崩潰。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/494785.html
上一篇:下拉選單不使用引導程式打開
