Richiesta get / post semplice bloccata in Python 3 ma non in Python 2


19

Sto lavorando a un semplice raschietto web in Python 3 ma quando invio una richiesta get o post, la risposta è 403. In Python 2 funziona bene comunque. Sto usando la stessa versione delle librerie di richieste in entrambe le versioni. Ho anche provato con, Verify=False/Truema la differenza in entrambe le versioni rimane.

richieste = 2.22.0

certifi = 2019.9.11

from requests import get
url = 'https://www.gamestop.com/'
header = {
    'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
    'Accept-Encoding': 'gzip, deflate, br',
    'Accept-Language': 'en-US,en;q=0.5',
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64; rv:56.0) Gecko/20100101 Firefox/56.0',
    'DNT': '1',
    'Upgrade-Insecure-Requests': '1',
    'Connection': 'keep-alive',
    'Host': 'www.gamestop.com'
}
res = get(url, headers=header, verify=False).status_code
print(res)
# 403 when using python 3.7.4
# 200 when using python 2.7.16

Modifica di @blhsing:

L'elenco seguente tiene traccia di quali specifiche versioni di Python funzionano e quali versioni non funzionano in base ai commenti. Finora successi e fallimenti sono stati coerenti per ogni specifica versione di Python su piattaforme.

Sentiti libero di modificare questa sezione della domanda con i tuoi risultati insieme alle specifiche versioni di Python utilizzate per produrre i risultati.

2.7.14 works (blhsing)
2.7.16 works (repl.it)
3.6.5 works (blhsing)
3.6.8 fails (Reinderien and blhsing)
3.7.3 works (wim and blhsing)
3.7.4 fails (repl.it and blhsing)
3.8.0 fails (OP)

Demo su repl.it: Python 2.7.16 e Python 3.7.4


Va notato che questo funziona in Python 3.6 ma non in 3.7.
blhsing

Ottengo "Accesso negato" anche in Firefox - dopo alcune esecuzioni del codice in Python 3.7. Non ho provato a Firefox prima di eseguire Python - forse sono bloccato dopo aver usato il codice Python o forse si blocca per altri motivi - IP errato, paese sbagliato, problema sul server.
furas,

1
@blhsing sì, è strano, immagino che andrò con 3.6 poi, grazie per la nota
EDM

2
È strano. Usa Wireshark e confronta le richieste inviate da Python 3.6 e 3.7. Dev'esserci qualche differenza sul server che sta rilevando.
GordonAitchJay

1
Quindi è probabilmente dovuto a diversi openssl ( ssl.OPENSSL_VERSION). Non hai bisogno di tutte quelle intestazioni per riprogrammare, solo un semplice get (url) lo farà.
mercoledì

Risposte:


9

Questa è l'eccezione generata da urlib3:

/home/runner/.local/share/virtualenvs/python3/lib/python3.7/site-packages/urllib3/connectionpool.py:1004: InsecureRequestWarning: richiesta HTTPS non verificata in corso. Si consiglia vivamente di aggiungere la verifica del certificato. Vedi: https://urllib3.readthedocs.io/en/latest/advanced-usage.html#ssl-warnings InsecureRequestWarning,

Secondo le ultime note di rilascio, sezione 1.25.5 (2019-09-19) :

Aggiungi mitigazione per BPO-37428 che interessano Python <3.7.4 e OpenSSL 1.1.1+ che hanno attivato la verifica del certificato quando si utilizza cert_reqs = CERT_NONE. (Numero 1682 )

Puoi seguire il problema su Github , è stato chiuso.

TLDR

L'utente @sethmlarson su Github ha riscontrato questo errore su urllib3 :

create_urllib3_context ():

    # Enable post-handshake authentication for TLS 1.3, see GH #1634. PHA is
    # necessary for conditional client cert authentication with TLS 1.3.
    # The attribute is None for OpenSSL <= 1.1.0 or does not exist in older
    # versions of Python.
    if getattr(context, "post_handshake_auth", None) is not None:
        context.post_handshake_auth = True

l'impostazione di questo valore su Trueabiliterà la verifica dei certificati del server, anziché essere disabilitata.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.