Daten per Post an Website senden

Sockets, TCP/IP, (XML-)RPC und ähnliche Themen gehören in dieses Forum
Antworten
pythonist
User
Beiträge: 40
Registriert: Sonntag 14. Mai 2006, 17:28

Ich bin gerade dabei ein Scipt zu basteln das ein Html-Formular sendet.
Um es zu testen habe ich einen Server laufen lassen der mir die Gesendeten Daten ausgibt.
Wenn ich es per Opera abschicke sieht es folgendermasen aus:
POST / HTTP/1.1
User-Agent: Opera/8.52 (X11; Linux i686; U; de)
Host: localhost:5002
Accept: text/html, application/xml;q=0.9, application/xhtml+xml, image/png, image/jpeg, image/gif, image/x-xbitmap, */*;q=0.1
Accept-Language: de,en;q=0.9
Accept-Charset: iso-8859-1, utf-8, utf-16, *;q=0.1
Accept-Encoding: deflate, gzip, x-gzip, identity, *;q=0
Connection: Keep-Alive
Content-Type: application/x-www-form-urlencoded
Content-Length: 81

parent_pid=&poster=mein+name&paste=Send&language=python&code=mehrzeilig%0D%0Arulz
Mit folgendem Script:

Code: Alles auswählen

#!/usr/bin/env python
import httplib, urllib

post = urllib.urlencode({"poster":"mein name","paste":"Send","language":"python","code":"mehrzeilig\nrulz"})
headers = {"Content-type": "application/x-www-form-urlencoded", "Accept": "text/plain"}
conn = httplib.HTTPConnection("localhost:5002")
conn.request("POST", "/", post, headers)
response = conn.getresponse()
data = response.read()
conn.close()
kommt folgendes beim server an:
POST / HTTP/1.1
Host: localhost:5002
Accept-Encoding: identity
Content-Length: 66
Content-type: application/x-www-form-urlencoded
Accept: text/plain
Folgende Fehlermeldung wird ausgegeben:
python /tmp/stind1.py
Traceback (most recent call last):
File "/tmp/stind1.py", line 7, in ?
response = conn.getresponse()
File "/usr/lib/python2.4/httplib.py", line 863, in getresponse
response.begin()
File "/usr/lib/python2.4/httplib.py", line 333, in begin
version, status, reason = self._read_status()
File "/usr/lib/python2.4/httplib.py", line 297, in _read_status
raise BadStatusLine(line)
httplib.BadStatusLine
Weis jemand wie ich das Scipt anpassen muss um die Daten zum Server zu bekommen?

Danke schon mal

pythonist
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

urllib.urlopen() unterstützt einen Parameter data, in diesen packst du ein Dict mit den Werten die per POST an den Server gehen sollen.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
pythonist
User
Beiträge: 40
Registriert: Sonntag 14. Mai 2006, 17:28

Erst mal danke fuer die Hilfe.
Ich habe jetzt das Script geschrieben aber es funktioniert nicht. es bleibt bei urlopen stehen, und statt
POST / HTTP/1.1
User-Agent: Opera/8.52 (X11; Linux i686; U; de)
Host: localhost:5002
Accept: text/html, application/xml;q=0.9, application/xhtml+xml, image/png, image/jpeg, image/gif, image/x-xbitmap, */*;q=0.1
Accept-Language: de,en;q=0.9
Accept-Charset: iso-8859-1, utf-8, utf-16, *;q=0.1
Accept-Encoding: deflate, gzip, x-gzip, identity, *;q=0
Connection: Keep-Alive
Content-Type: application/x-www-form-urlencoded
Content-Length: 58

parent_pid=&poster=saFD&paste=Send&language=none&code=ADGF
kommt nur
POST / HTTP/1.0
Content-type: application/x-www-form-urlencoded
Content-length: 106
Host: localhost:5002
User-agent: Python-urllib/1.16



Hier das Script:

Code: Alles auswählen

#!/usr/bin/env python
# -*- coding: iso-8859-15 -*-
import urllib
import sys
from optparse import OptionParser
#Liste mit Verfuegbaren Sprachen:
langlist = """none 
actionscript
ada
apache
asm
asp
bash
c
c_mac
caddcl
cadlisp
cpp
csharp
css
d
delphi
diff
div
eiffel
gml
html4strict
java
javascript
lisp
lua
matlab
mpasm
mpasm
objc
oobas
oracle8
pascal
perl
php
php-brief
python
qbasic
smarty
sql
vb
vbnet
vhdl
visualfoxpro
xml"""
#Parameter parsen
oparser = OptionParser()
oparser.add_option("-n", "--name", dest="name", default="PyPaste", help="Benutzername")
oparser.add_option("-s", "--sprache", dest="language", default="none", help="Sprache des Texts")
oparser.add_option("-l", "--list", dest="list", default=False, action="store_true", help="Alle Sprachen listen")
oparser.add_option("-t", "--text", dest="otext", default="", help="optionalen Text")
(options, args) = oparser.parse_args()

if options.list:
    print langlist

#Text verarbeiten
textinput = sys.stdin.read()
text = str(textinput+options.otext)


sendtext = str(text+"\n\n---------\n\nGepastet mit Pypaste")
#Daten http konform coden und per Post senden.

post = urllib.urlencode({"parent_pid":"", "poster":options.name, "paste":"Send", "language":options.language, "code":sendtext})
urllib.urlopen("http://localhost:5002",post)
Guten Abend

pythonist
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Bei mir geht das wunderbar:

Code: Alles auswählen

#!/usr/bin/env python
# -*- encoding: latin-1 -*- 

import urllib

post = urllib.urlencode({
        "parent_pid" : "", 
        "poster" : 'me', 
        "paste" : "Send",
        "language": 'python',
        "code": 'code hier'
    })

site = urllib.urlopen("http://www.nerdlabs.org/tools/request_headers.php", post)
content = site.read()
site.close()
print content
Die Remote-Seite zeigt auch die richtige Content-Länge an, also sollte der Request geklappt haben.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

Hi!

Ich habe es auch soeben ausprobiert:

Code: Alles auswählen

#!/usr/bin/env python
# -*- coding: iso-8859-1 -*-

import urllib

data = urllib.urlencode({"vorname": "Gerold", "nachname": "Penz"})

response = urllib.urlopen(
    "http://localhost:8888/cgi-bin/vorname_und_nachname_formular.py",
    data
)
print response.read()
Funktioniert wie gewünscht.

mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
pythonist
User
Beiträge: 40
Registriert: Sonntag 14. Mai 2006, 17:28

Lag an dem Socket mit dem ich die Daten empfangen habe.
Danke
Antworten