อักขระพิเศษในรหัสผ่านพร็อกซี
เข้ารหัส URL ให้ชื่อผู้ใช้และรหัสผ่านแยกกัน เพื่อไม่ให้ @ โคลอน สแลช และ # ทำลาย URL
รหัสผ่านที่มี @ หรือ # อาจทำให้ 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 ที่มีข้อมูลรับรองในล็อกร่วมและไฟล์ซอร์ส