Heslo obsahující @ nebo # může poškodit ručně sestavené URL proxy, i když jsou přihlašovací údaje správné. Tyto znaky už mají v URL význam, takže klient může část hesla vyhodnotit jako název hostitele nebo fragment.

Kódujte obě pole přihlašovacích údajů zvlášť

Tento příklad zachovává strukturální oddělovače URL a kóduje pouze uživatelské jméno a heslo:

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"
)

Použijte skutečný endpoint a přihlašovací údaje. Uvedená adresa je dokumentační příklad. Prázdný argument safe je důležitý: quote běžně ponechává lomítko bez escapování, ale uvnitř tohoto pole se musí zakódovat.

Nekódujte celé URL proxy. Kódování oddělovačů schématu a znaku @ mezi údaji a hostitelem zničí strukturu, kterou chcete zachovat. Vyhněte se také opětovnému kódování již zakódovaného hesla.

Použijte výsledek s Requests

import requests

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

Pokud požadavek stále selhává, zjistěte, zda proxy odmítá přihlášení, nebo klient selhal dříve při parsování či připojování. Autentizační výzva 407 a neplatné URL jsou různé chyby.

HTTPX může ponechat autentizaci oddělenou

Objekt Proxy v HTTPX může přijmout endpoint a přihlašovací údaje jako samostatné argumenty:

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()

Nemusíte tak sami sestavovat část userinfo. Nešifruje to údaje nezávisle na spojení s proxy ani nevybírá autentizační metodu podporovanou každou službou.

Pokud bezplatný seznam nabízí pouze IP a port, tento příklad neposkytuje výchozí přihlašovací údaje. Autentizaci používejte jen tehdy, když provozovatel skutečně poskytuje účet. URL s přihlašovacími údaji nepatří do sdílených logů ani zdrojových souborů.

Související články