Sto provando a scrivere una funzione per postare i dati del modulo e salvare le informazioni sui cookie restituiti in un file in modo che la prossima volta che la pagina venga visitata, le informazioni sui cookie siano inviato al server (cioè normale comportamento del browser).Python forma il POST usando urllib2 (anche la domanda sul salvataggio/utilizzo dei cookie)
Ho scritto questo relativamente facilmente in C++ usando curlib, ma ho passato quasi un giorno intero a scrivere questo in Python, usando urllib2 - e ancora senza successo.
Questo è quello che ho finora:
import urllib, urllib2
import logging
# the path and filename to save your cookies in
COOKIEFILE = 'cookies.lwp'
cj = None
ClientCookie = None
cookielib = None
logger = logging.getLogger(__name__)
# Let's see if cookielib is available
try:
import cookielib
except ImportError:
logger.debug('importing cookielib failed. Trying ClientCookie')
try:
import ClientCookie
except ImportError:
logger.debug('ClientCookie isn\'t available either')
urlopen = urllib2.urlopen
Request = urllib2.Request
else:
logger.debug('imported ClientCookie succesfully')
urlopen = ClientCookie.urlopen
Request = ClientCookie.Request
cj = ClientCookie.LWPCookieJar()
else:
logger.debug('Successfully imported cookielib')
urlopen = urllib2.urlopen
Request = urllib2.Request
# This is a subclass of FileCookieJar
# that has useful load and save methods
cj = cookielib.LWPCookieJar()
login_params = {'name': 'anon', 'password': 'pass' }
def login(theurl, login_params):
init_cookies();
data = urllib.urlencode(login_params)
txheaders = {'User-agent' : 'Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)'}
try:
# create a request object
req = Request(theurl, data, txheaders)
# and open it to return a handle on the url
handle = urlopen(req)
except IOError, e:
log.debug('Failed to open "%s".' % theurl)
if hasattr(e, 'code'):
log.debug('Failed with error code - %s.' % e.code)
elif hasattr(e, 'reason'):
log.debug("The error object has the following 'reason' attribute :"+e.reason)
sys.exit()
else:
if cj is None:
log.debug('We don\'t have a cookie library available - sorry.')
else:
print 'These are the cookies we have received so far :'
for index, cookie in enumerate(cj):
print index, ' : ', cookie
# save the cookies again
cj.save(COOKIEFILE)
#return the data
return handle.read()
# FIXME: I need to fix this so that it takes into account any cookie data we may have stored
def get_page(*args, **query):
if len(args) != 1:
raise ValueError(
"post_page() takes exactly 1 argument (%d given)" % len(args)
)
url = args[0]
query = urllib.urlencode(list(query.iteritems()))
if not url.endswith('/') and query:
url += '/'
if query:
url += "?" + query
resource = urllib.urlopen(url)
logger.debug('GET url "%s" => "%s", code %d' % (url,
resource.url,
resource.code))
return resource.read()
Quando si tenta di accedere, passo il nome utente corretto e pwd ,. tuttavia l'accesso non riesce e nessun dato sui cookie viene salvato.
Le mie due domande sono:
- qualcuno può vedere cosa è sbagliato con la funzione di login(), e come posso risolvere il problema?
- come posso modificare la funzione get_page() per utilizzare qualsiasi informazione sui cookie che ho salvato?
+1 per lo snippet di codice. Il tuo codice è molto più ordinato e pulito del mio (beh, sto solo iniziando a imparare a essere un Pitonista!). Ho letto una rilettura del tuo post - ci sono due cose che non mi sono chiare. 1). Non capisco perché devi chiamare loginToFacebook() due volte. Sembra che il cookie verrà impostato ogni volta che viene richiamato l'id del metodo loginToFacebook(). Potresti per favore chiarire ?. 2). puoi dare delle linee guida su come verificare se esiste un cookie ACTIVE? – morpheous
Con i login basati su cookie, il server ti assegna prima un cookie, * quindi * accedi. Se tenti di rimuovere uno degli accessi, scoprirai di non aver effettuato l'accesso - FB ha controllato la tua risposta, vista che non hai un cookie e reindirizzato alla pagina di accesso.Un modo più chiaro sarebbe quello di sostituire la prima chiamata con una per ottenere la prima pagina dell'FB come 'def getFBCookie (self): self.opener.open ('https://www.facebook.com/')' che sarebbe fare la stessa cosa E sì, è un bel codice. Questo richiede un po 'più tempo in anticipo, ma ripaga quando è necessario leggerlo in seguito, o riutilizzarlo :) –