قد تفسد كلمة مرور تحتوي @ أو # عنوان URL لوكيل جُمّع يدويًا حتى إن كانت بيانات الاعتماد صحيحة. لهذه المحارف معانٍ في URL أصلًا، لذلك قد يفسر العميل جزءًا من كلمة المرور بوصفه اسم مضيف أو جزءًا fragment.

رمّز حقلي بيانات الاعتماد كلًا على حدة

يحافظ هذا المثال على الفواصل البنيوية للعنوان ويرمّز اسم المستخدم وكلمة المرور فقط:

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 الشرطة المائلة عادةً دون تهريب، لكن الشرطة المائلة داخل حقل الاعتماد هذا تحتاج إلى ترميز.

لا ترمّز عنوان 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 المحتوية على بيانات اعتماد خارج السجلات المشتركة وملفات المصدر.

مقالات ذات صلة