Hilfe bei cURL in Python

Ich muss eine Anfrage an einen Server senden. In der API-Dokumentation der Website gibt es dieses Beispiel, das cURL in PHP verwendet:

$ch = curl_init(); curl_setopt($ch, CURLOPT_URL, 'http://api.website.com'); curl_setopt($ch, CURLOPT_POST, 1); curl_setopt($ch, CURLOPT_POSTFIELDS, "request=$wrapper"); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); ; $data = curl_exec($ch); curl_close($ch); 

Aber meine App ist mit Python fertig, also habe ich versucht, so etwas zu schreiben, aber dieser Code funktioniert nicht:

 req = urllib2.Request(url, formatted) response = urllib2.urlopen(req) html = response.read() print html+"\n\n" 

Kannst du mir helfen, eine funktionierende Umwandlung eines PHP CURL Programms in Python zu schreiben?

Vielen Dank!!

4 Solutions collect form web for “Hilfe bei cURL in Python”

Curl ist auch für Python: http://pycurl.sourceforge.net/

Das Beispiel könnte in Python und pycurl wie folgt übersetzt werden:

 import pycurl c = pycurl.Curl() c.setopt(pycurl.URL, "http://api.website.com") c.setopt(pycurl.POST, 1) c.setopt(pycurl.POSTFIELDS, "request=%s" % wrapper) import StringIO b = StringIO.StringIO() c.setopt(pycurl.WRITEFUNCTION, b.write) c.perform() c.close() data = b.getvalue() 

Ihr Python-Code mit urllib2 sieht ok aus, es sollte funktionieren. Wahrscheinlich gibt es einen Irrtum in etwas anderem, das du nicht erwähnt hast. Können Sie bitte mehr spezifisch sein?

Wenn du deinen Code nimmst, sollte das eigentlich funktionieren.

  import urllib import urllib2 url = 'http://api.website.com/' values = {'some_key':'some_value'} data = urllib.urlencode(values) req = urllib2.Request(url, data) response = urllib2.urlopen(req) page = response.read() print page + '\n\n' 

Was ist der Fehler, den du bekommst?

Verwenden Sie einen Paket-Sniffer, um herauszufinden, ob cURL User-Agent-Informationen sendet. Wenn dies der Fall ist und der Service diese Informationen erwartet, verwenden Sie die add_header () – Methode auf Ihrer Anfrage (von urllib2 Dokumentation, unten auf Seite):

 import urllib2 req = urllib2.Request('http://api.website.com/') # Your parameter encoding here req.add_header('User-agent', 'Mozilla/5.0') r = urllib2.urlopen(req) # Process the response 

Es ist ziemlich peinlich, aber … das einzige Problem mit meinem Code, der urllib verwendet und urllib2 ist … dass dieser Code ein GET und kein POST !!!

Hier ist mein Scan mit Wireshark:

1- mit urllib und urllib2

 Hypertext Transfer Protocol GET / HTTP/1.1\r\n [Expert Info (Chat/Sequence): GET / HTTP/1.1\r\n] [Message: GET / HTTP/1.1\r\n] [Severity level: Chat] [Group: Sequence] Request Method: GET Request URI: / Request Version: HTTP/1.1 Accept-Encoding: identity\r\n Host: api.apptrackr.org\r\n Connection: close\r\n User-Agent: Python-urllib/2.6\r\n \r\n 

2- mit PyCurl

 Hypertext Transfer Protocol POST / HTTP/1.1\r\n [Expert Info (Chat/Sequence): POST / HTTP/1.1\r\n] [Message: POST / HTTP/1.1\r\n] [Severity level: Chat] [Group: Sequence] Request Method: POST Request URI: / Request Version: HTTP/1.1 User-Agent: PycURL/7.19.5\r\n Host: api.website.com\r\n Accept: */*\r\n Content-Length: 365\r\n [Content length: 365] Content-Type: application/x-www-form-urlencoded\r\n \r\n Line-based text data: application/x-www-form-urlencoded [truncated] request=%7B%22enc_key%22%3A%22o37vOsNetKgprRE0VsBYefYViP4%2ByB3pjxfkfCYtpgiQ%2ByxONgkhhsxtqAwaXwCrrgx%2BPDuDtMRZNI1ez//4Zw%3D%3D%22%2C%22format%22%3A%22RSA_RC4_Sealed%22%2C%22profile%22%3A%22Ldn%22%2C%22request%22%3A%22bQ%2BHm/ 

So dass der Code funktioniert, aber es ist nicht richtig für mich, weil ich einen POST brauche, aber ich werde es vorziehen, NICHT PyCurl zu verwenden. Irgendeine Idee?

Vielen Dank!!

  • Versuche, Multipart-Formulardaten in Python zu posten, wird nicht posten
  • Selen: Versuche, sich mit Cookies anzumelden - "Kann nur Cookies für aktuelle Domain setzen"
  • Beitrag zum Tornado Server
  • Http anfragen: von urllib2 auf anfragen python 2.7
  • Streaming POST eine große Datei zu CherryPy von Python Client
  • Python-POST-Binärdaten
  • Machen Sie eine http-POST-Anfrage zum Hochladen einer Datei mit python urllib / urllib2
  • Wie extrahiere ich HTTP-Nachrichtentext in BaseHTTPRequestHandler.do_POST ()?
  • In einem Python3-CGI-Skript, wie kann ich die Rohformdaten in einem POST lesen?
  • Django - Werte aus POST-Anfrage
  • HTTP-POST-Binärdateien mit Python: prägnante Non-Pycurl-Beispiele?
  • Python ist die beste Programmiersprache der Welt.