Ένας κωδικός με @ ή # μπορεί να καταστρέψει ένα χειροποίητο URL proxy ακόμη κι αν τα διαπιστευτήρια είναι σωστά. Αυτοί οι χαρακτήρες έχουν ήδη σημασία σε URL, οπότε ο πελάτης μπορεί να ερμηνεύσει μέρος του κωδικού ως όνομα κεντρικού υπολογιστή ή τμήμα fragment.

Κωδικοποιήστε τα δύο πεδία διαπιστευτηρίων χωριστά

Το παράδειγμα διατηρεί τους δομικούς διαχωριστές του 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 proxy. Η κωδικοποίηση των διαχωριστών σχήματος και του @ ανάμεσα στα διαπιστευτήρια και τον κεντρικό υπολογιστή καταστρέφει τη δομή που θέλατε να διατηρήσετε. Μην κωδικοποιείτε δεύτερη φορά ήδη κωδικοποιημένο κωδικό.

Χρησιμοποιήστε το αποτέλεσμα με το Requests

import requests

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

Αν το αίτημα αποτυγχάνει ακόμη, εξετάστε αν το proxy απορρίπτει τη σύνδεση χρήστη ή αν ο πελάτης απέτυχε νωρίτερα στην ανάλυση ή τη σύνδεση δικτύου. Μια πρόκληση ελέγχου ταυτότητας 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. Δεν κρυπτογραφεί τα διαπιστευτήρια ανεξάρτητα από τη σύνδεση proxy ούτε επιλέγει μέθοδο ελέγχου ταυτότητας που υποστηρίζουν όλες οι υπηρεσίες.

Αν μια δωρεάν λίστα δίνει μόνο IP και θύρα, το παράδειγμα δεν παρέχει προεπιλεγμένα διαπιστευτήρια. Χρησιμοποιήστε έλεγχο ταυτότητας μόνο όταν ο διαχειριστής δίνει πραγματικά λογαριασμό. Μην τοποθετείτε URL με διαπιστευτήρια σε κοινόχρηστα αρχεία καταγραφής και αρχεία πηγαίου κώδικα.

Σχετικά άρθρα