python - Mechanize not working for automating gmail login in Google Appengine -
i have used mechanize , deployed app on gae , works fine. but, app making, trying automate login gmail through mechanize. doesn't work in development environment on local machine after deploying on appengine.
i have been able use same script run on server through mod_python using psp.
i found lot of solutions here, none of them seem work me. here snippet of code:
<snip> br = mechanize.browser() response = br.open("http://www.gmail.com") loginform = br.forms().next() loginform["email"] = self.request.get('user') loginform["passwd"] = self.request.get('password') response = br.open(loginform.click()) response2 = br.open("http://mail.google.com/mail/h/") result = response2.read() <snip> when @ result, login page when used appengine. mod_python hosted on own server, page user's inbox.
the problem due how google crippled urllib2 module on gae.
internally uses urlfetch module (which google wrote) , have removed httpcookieprocessor() functionality - meaning, cookies not persisted request request critical piece when automatically logging sites programmatically.
there way around this, not using mechanize. have roll own cookie processor - here basic approach took (not perfect, gets job done):
import urllib, urllib2, cookie google.appengine.api import urlfetch urlparse import urljoin import logging class gaeopener(object): def __init__(self): self.cookie = cookie.simplecookie() self.last_response = none def open(self, url, data = none): base_url = url if data none: method = urlfetch.get else: method = urlfetch.post while url not none: self.last_response = urlfetch.fetch(url = url, payload = data, method = method, headers = self._get_headers(self.cookie), allow_truncated = false, follow_redirects = false, deadline = 10 ) data = none # next request get, no need send data again. method = urlfetch.get self.cookie.load(self.last_response.headers.get('set-cookie', '')) # load cookies response url = urljoin(base_url, self.last_response.headers.get('location')) if url == base_url: url = none return self.last_response def _get_headers(self, cookie): headers = { 'host' : '<enter host name here>', 'user-agent' : 'mozilla/5.0 (windows; u; windows nt 6.1; en-us; rv:1.9.1.2) gecko/20090729 firefox/3.5.2 (.net clr 3.5.30729)', 'cookie' : self._make_cookie_header(cookie) } return headers def _make_cookie_header(self, cookie): cookie_header = "" value in cookie.values(): cookie_header += "%s=%s; " % (value.key, value.value) return cookie_header def get_cookie_header(self): return self._make_cookie_header(self.cookie) you can use urllib2.urlopen, except method use "open".
Comments
Post a Comment