Seite 1 von 1

Webseiten Login mit urllib/urllib2

Verfasst: Mittwoch 15. Oktober 2008, 10:58
von da.dom
Hallo Zusammen,

ich habe mal wieder ein kleines Problem.

Ich versuche einen Login von Python aus, auf folgende Webseite durch zu führen:

http://dadom.beanstalkapp.com/sessions/new

um nach dem einloggen eine bestimmte Datei runter zu laden. Aber irgendwie scheitere ich schon am Login, hab mal ein Beispiel zum Debuggen der HTML Request kopiert und eingefügt:

Code: Alles auswählen

import logging, urllib2, sys,urllib

values = {'password' : 'XXX','login' : 'XXX'}
data=urllib.urlencode(values)

hh = urllib2.HTTPHandler()
hsh = urllib2.HTTPSHandler()
hh.set_http_debuglevel(1)
hsh.set_http_debuglevel(1)
opener = urllib2.build_opener(hh, hsh, urllib2.HTTPCookieProcessor())
logger = logging.getLogger("cookielib")
logger.addHandler(logging.StreamHandler(sys.stdout ))
logger.setLevel(logging.DEBUG)


response = opener.open("http://dadom.beanstalkapp.com/sessions/new/sessions" ,data)

for line in response:
    print line
Als Response bekomme ich die LoginMaske wieder (die htmlSeite), die LogMeldungen:

connect: (proxy.XXXXX.XX, 8080)
send: 'POST http://dadom.beanstalkapp.com/sessions/new/sessions HTTP/1.1\r\nAccept-Encoding: identity\r\nContent-Length: 22\r\nHost: dadom.beanstalkapp.com\r\nContent-Type: application/x-www-form-urlencoded\r\nConnection: close\r\nUser-Agent: Python-urllib/2.5\r\n\r\n'
send: 'login=XXX&password=XXX'
reply: 'HTTP/1.0 200 OK\r\n'
header: Server: nginx/0.6.26
header: Date: Wed, 15 Oct 2008 09:54:04 GMT
header: Content-Type: text/html; charset=utf-8
header: Set-Cookie: _beanstalk_session_id=c6033147c6bfac0d38ffd826cd3b8bd2; path=/
header: Status: 200 OK
header: X-Runtime: 0.04000
header: ETag: "22baca4beb0e69d28a8d4cab328b8277"
header: Cache-Control: private, max-age=0, must-revalidate
header: Content-Length: 2997
header: X-Cache: MISS from proxy.XXXX.XXX
header: Proxy-Connection: close


Danke schon mal für eure Mühen

Verfasst: Mittwoch 15. Oktober 2008, 13:16
von HWK
mechanize sollte helfen. Siehe auch hier!
MfG
HWK

Verfasst: Mittwoch 15. Oktober 2008, 13:48
von Leonidas
Steht übrigens auch in den [wiki]FAQ[/wiki].

Verfasst: Mittwoch 15. Oktober 2008, 14:03
von da.dom
Unglaublich, geniale Bibliothek, bin begeistert..einloggen und meine ArchivDatei runter geladen. Vielen Dank für den Link und ja die FAQ hab ich scheinbar überlesen :) sorry.

Danke für die Hilfe
D

PS: so sieht es dann übrigents aus:

Code: Alles auswählen

import mechanize 
import ClientForm 
from ClientForm import ParseResponse 
import os

#Cookie holen
request  = mechanize.Request("http://dadom.beanstalkapp.com/sessions/new/sessions") 

#HTML Forms auslesen
response = mechanize.urlopen("http://dadom.beanstalkapp.com/sessions/new/sessions") 

forms = ParseResponse(response, backwards_compat=False) 
form  = forms[0] 

#Login Daten einsetzen
form.set_value("XXX", name="login") 
form.set_value("XXX", name="password") 

#Absetzen des Formulars
request  = form.click() 
response = mechanize.urlopen(request)

#Dateidownload
response=mechanize.urlopen("http://dadom.beanstalkapp.com/repositories/dcoding/export");

#Dateispeicherung
file=open("c:/dcoding_19337_rev54.tar.gz","wb")
file.write(response.read());
file.close()

Verfasst: Mittwoch 15. Oktober 2008, 14:18
von snafu
Ungetestet:

Code: Alles auswählen

import mechanize

br = mechanize.Browser()
br.open('http://dadom.beanstalkapp.com/sessions/new/sessions')
br.select_form(nr=0)
br['login'] = 'xxx'
br['password'] = 'xxx'
br.submit()
download = br.open('http://dadom.beanstalkapp.com/repositories/dcoding/export')
content = download.read() # das dann in die Datei schreiben

Verfasst: Mittwoch 15. Oktober 2008, 14:55
von da.dom
So neues Problemchen :)

Will die Datei die ich runter geladen habe, bei einem FileHoster hochladen (rapidshare), jetzt zwickt der HTML Standard mich aber scheinbar, weil der Upload über ein Datei Dialog gehandelt wird und ich dessen Value Attribut aus Sicherheitsgründen nicht setzen darf?

form.set_value("c:/dcoding_19337_rev54.tar.gz", name="filecontent")
>>
AttributeError: value attribute is readonly
>>

oder bin ich da auf dem Holzweg?

Danke (mal wieder)
Dom


>> lesen mein Junge ;) add_file bei der Form...Rapidshare will zwar gerade nicht Uploaden, aber werd mal weiter mit rumprobieren

Verfasst: Mittwoch 15. Oktober 2008, 16:05
von da.dom
Oki, habs mit ein bisschen rum probieren hinbekommen.

Code: Alles auswählen

#Rapidshare Upload
# Call html document and store cookie  
response = mechanize.urlopen("http://www.rapidshare.de") 
# Read the form here form[
forms = ParseResponse(response, backwards_compat=False) 
form  = forms[0] 
# Set File to Upload
file=open(fileName,"rb");
form.add_file(file,"application/gzip", fileName)
request= form.click() 
file.close();
Wichtig die Datei im binären Lesemodus zu öffnen, und bei add_file den MIME Type explizit mit an zu geben, sonst hat es bei mir nicht funktioniert :)

Bin begeistertm trotz meiner Mühe, hätte ich nicht gedacht dass das mit Python so einfach geht *freu*

Danke an alle
D

Verfasst: Mittwoch 15. Oktober 2008, 18:03
von Leonidas
``file`` zu überschreiben ist, ähm, unvorteilhaft (und ich seh schon dass numerix gleich vorbeikommt und mich schimpft, warum nich nicht eine halbe Bildschirmseite für die Gründe warum das so ist schreibe) und in Python braucht man keine Strichpunkte am Ende der Anweisungen.

Verfasst: Freitag 17. Oktober 2008, 07:24
von da.dom
Leonidas hat geschrieben:``file`` zu überschreiben ist, ähm, unvorteilhaft
Was traust du mir zu :D ? Das war in dem Moment jediglich eine schnelle (zugegebenermaßen schlechte) Wahl meiner Variablen Benamsung :)
Leonidas hat geschrieben: in Python braucht man keine Strichpunkte am Ende der Anweisungen.
Ein Fluch :) Hab leider nie wirklich lange Zeit mich mit Python zu beschäftigen und dann kommt PHP und Java dazwischen ^^ :)

Verfasst: Freitag 17. Oktober 2008, 14:05
von da.dom
Leonidas hat geschrieben: in Python braucht man keine Strichpunkte am Ende der Anweisungen.
Kurze Frage die mir dazu noch einfällt: Warum stört er sich an dem Semikolon eigentlich nicht? Weder beim Programmlauf noch in meinem Editor wird ein Fehlerangezeigt...

Verfasst: Freitag 17. Oktober 2008, 14:24
von Hyperion
da.dom hat geschrieben: Kurze Frage die mir dazu noch einfällt: Warum stört er sich an dem Semikolon eigentlich nicht? Weder beim Programmlauf noch in meinem Editor wird ein Fehlerangezeigt...
In der Doku wird das Semikolon als Delimiter aufgeführt, also als Trenner. Da Leonidas schrieb, dass man sie nicht braucht, interpretiere ich aus beidem, dass man sie theoretisch setzen könnte. Aber wozu etwas tun, was unnötig ist?

Verfasst: Freitag 17. Oktober 2008, 14:54
von Leonidas
da.dom hat geschrieben:Warum stört er sich an dem Semikolon eigentlich nicht? Weder beim Programmlauf noch in meinem Editor wird ein Fehlerangezeigt...
Ich habe ja auch geschrieben "braucht". Wie Hyperion meinte sind sie Delimiter und eigentlich nur nützlich, wenn man mehrere "Befehle" in eine Zeile setzen will. Habe ich aber bisher nie genutzt und sehe auch da auch keinen Nutzen.