1

Je suis en train de se connecter à un site Web en utilisant http.client en Python en utilisant le code suivant:Connectez-vous sur le site en utilisant http.client

import urllib.parse 
import http.client 
payload = urllib.parse.urlencode({"username": "USERNAME-HERE", 
           "password": "PASSWORD-HERE", 
           "redirect": "index.php", 
           "sid": "", 
           "login": "Login"}) 
conn = http.client.HTTPConnection("osu.ppy.sh:80") 
conn.request("POST", "/forum/ucp.php?mode=login", payload) 
response = conn.getresponse() 
data = response.read() 

# print the HTML after the request 
print(bytes(str(data), "utf-8").decode("unicode_escape")) 

Je sais qu'une suggestion commune est d'utiliser simplement la bibliothèque Demandes, et j'ai essayé ceci, mais je veux spécifiquement savoir comment faire ceci sans employer des demandes.

Le comportement Je cherche peut être reproduit avec le code suivant qui se connecte avec succès sur le site en utilisant les demandes:

import requests 
payload = {"username": "USERNAME-HERE", 
      "password": "PASSWORD-HERE", 
      "redirect": "index.php", 
      "sid": "", 
      "login": "Login"} 
p = requests.Session().post('https://osu.ppy.sh/forum/ucp.php?mode=login', payload) 

# print the HTML after the request 
print(p.text) 

Il me semble que le code http.client n'est pas « livrer » la charge utile, tandis que le code Requêtes est.

Des idées? Est-ce que je regarde quelque chose?


EDIT: Ajoutconn.set_debuglevel(1) donne le résultat suivant:

send: b'POST /forum/ucp.php?mode=login HTTP/1.1 
Host: osu.ppy.sh 
Accept-Encoding: identity 
Content-Length: 70' 


send: b'redirect=index.php&sid=&login=Login&username=USERNAME-HERE&password=PASSWORD-HERE' 
reply: 'HTTP/1.1 200 OK' 


header: Date 
header: Content-Type 
header: Transfer-Encoding 
header: Connection 
header: Set-Cookie 
header: Cache-Control 
header: Expires 
header: Pragma 
header: X-Frame-Options 
header: X-Content-Type-Options 
header: Server 
header: CF-RAY 
+0

course avec HTTPConnection.set_debuglevel (1) ... vous devrez également envoyer un en-tête 'application-type:'/json. –

+0

@CoreyGoldberg J'ai révisé la question, s'il vous plaît voir la modification. –

+1

Je n'ai pas remarqué que vous urlencoding la charge utile. donc l'en-tête doit être 'application/x-www-form-urlencoded'' –

Répondre

2

puisque vous urlencodage votre charge, vous devez envoyer l'en-tête: application/x-www-form-urlencoded