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

Popular posts from this blog

php - What is the difference between $_SERVER['PATH_INFO'] and $_SERVER['ORIG_PATH_INFO']? -

fortran - Function return type mismatch -

queue - mq_receive: message too long -