Пароль із @ або # може зіпсувати вручну складений URL проксі, навіть якщо облікові дані правильні. Ці символи вже мають значення в 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 зазвичай лишає скісну риску неекранованою, але в цьому полі її потрібно кодувати.

Не кодуйте весь 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 з обліковими даними до спільних журналів і вихідних файлів.

Схожі статті