نویسههای ویژه در گذرواژههای پراکسی
نام کاربری و گذرواژهٔ پراکسی را جداگانه کدگذاری کنید تا @، دونقطه، ممیز و # ساختار URL را خراب نکنند.
گذرواژهای شامل @ یا # میتواند URL پراکسی ساختهشده با دست را خراب کند، حتی اگر اطلاعات ورود درست باشد. این نویسهها در URL معنای خاص دارند؛ بنابراین کلاینت ممکن است بخشی از گذرواژه را نام میزبان یا قطعهٔ fragment تفسیر کند.
دو فیلد اطلاعات ورود را جداگانه کدگذاری کنید
این مثال جداکنندههای ساختاری 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های دارای اطلاعات ورود را در گزارشهای مشترک و فایلهای منبع قرار ندهید.