סיסמה המכילה @ או # עלולה לשבש כתובת URL של פרוקסי שהורכבה ידנית, גם כשפרטי ההזדהות נכונים. לתווים האלה כבר יש משמעות ב־URL, ולכן הלקוח עשוי לפרש חלק מהסיסמה כשם מארח או כפרגמנט.

קודדו את שני שדות ההזדהות בנפרד

הדוגמה הזאת שומרת על מפרידי המבנה של ה־URL ומקודדת רק את שם המשתמש והסיסמה:

from urllib.parse import quote

username = "user@team"
password = "p:a/ss#?"
proxy_url = (
    "http://"
    + quote(username, safe="")
    + ":"
    + quote(password, safe="")
    + "@203.0.113.10:8080"
)

השתמשו בנקודת הקצה ובפרטי ההזדהות האמיתיים שלכם. הכתובת המוצגת היא דוגמה לתיעוד. הארגומנט safe הריק חשוב: quote בדרך כלל משאיר לוכסן ללא escape, אבל לוכסן בתוך שדה ההזדהות הזה חייב להיות מקודד.

אל תקודדו את כל כתובת ה־URL של הפרוקסי. קידוד מפרידי הסכמה וסימן @ שבין פרטי ההזדהות למארח הורס את המבנה שניסיתם לשמר. הימנעו גם מקידוד חוזר של סיסמה שכבר קודדה.

השתמשו בתוצאה עם Requests

import requests

response = requests.get(
    "https://example.com/",
    proxies={"http": proxy_url, "https": proxy_url},
    timeout=(5, 15),
)
response.raise_for_status()

אם הבקשה עדיין נכשלת, בדקו אם הפרוקסי דוחה את הכניסה או שהלקוח נכשל קודם בפענוח או בחיבור. אתגר הזדהות 407 וכתובת URL לא תקינה הם כשלים שונים.

HTTPX יכול להפריד את ההזדהות

אובייקט Proxy של HTTPX יכול לקבל את נקודת הקצה ופרטי ההזדהות כארגומנטים נפרדים:

import httpx

proxy = httpx.Proxy(
    "http://203.0.113.10:8080",
    auth=("user@team", "p:a/ss#?"),
)

with httpx.Client(proxy=proxy, trust_env=False, timeout=15) as client:
    response = client.get("https://example.com/")
    response.raise_for_status()

כך אינכם צריכים לבנות בעצמכם את חלק ה־userinfo. הדבר אינו מצפין את פרטי ההזדהות בנפרד מחיבור הפרוקסי ואינו בוחר שיטת הזדהות הנתמכת בכל שירות.

אם רשימה חינמית מספקת רק IP ופורט, הדוגמה הזאת אינה מספקת פרטי הזדהות כברירת מחדל. השתמשו בהזדהות רק כשהמפעיל אכן מספק חשבון. אל תכניסו כתובות URL עם פרטי הזדהות ליומנים משותפים או לקובצי מקור.

מאמרים קשורים