รหัสผ่านที่มี @ หรือ # อาจทำให้ URL พร็อกซีที่ประกอบเองเสีย แม้ข้อมูลรับรองจะถูกต้อง อักขระเหล่านี้มีความหมายอยู่แล้วใน URL ไคลเอนต์จึงอาจแปลส่วนหนึ่งของรหัสผ่านเป็นชื่อโฮสต์หรือ fragment

เข้ารหัส 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

อย่าเข้ารหัส 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 ที่มีข้อมูลรับรองในล็อกร่วมและไฟล์ซอร์ส

บทความที่เกี่ยวข้อง