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
course avec HTTPConnection.set_debuglevel (1) ... vous devrez également envoyer un en-tête 'application-type:'/json. –
@CoreyGoldberg J'ai révisé la question, s'il vous plaît voir la modification. –
Je n'ai pas remarqué que vous urlencoding la charge utile. donc l'en-tête doit être 'application/x-www-form-urlencoded'' –