2011-04-12 97 views
5

我已经使用机械化并在GAE上部署了一个应用程序,它工作正常。但是,对于我制作的应用程序,我试图通过机械化自动登录到Gmail。它在本地机器的开发环境中以及在appengine上部署之后都不起作用。机械化不工作在Google Appengine中自动化Gmail登录

我已经能够使用相同的脚本通过使用PSP的mod_python在我的服务器上运行它。

我在这里发现了很多解决方案,但他们都没有为我工作。这里是我的代码片段:

<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> 

当我看到的结果,我得到的是与AppEngine上使用时的登录页面。但在我自己的服务器上托管mod_python时,我会在用户收件箱中获取该页面。

+0

告诉我们你的代码 – systempuntoout 2011-04-12 11:01:22

+0

代码或它没有发生! – jathanism 2011-04-12 13:40:05

+0

你为什么试图通过App Engine应用程序自动登录到gmail?您是否意识到这明显违背了GMail的服务条款,并且几乎可以肯定有更好的方法去做任何你想做的事情? – 2011-04-13 02:08:33

回答

6

这个问题很可能是由于谷歌如何瘫痪GAE上的urllib2模块造成的。

现在它在内部使用urlfetch模块(这是Google编写的),它们已经完全删除了HTTPCookieProcessor()功能 - 这意味着,Cookie不会从请求请求中持久化,这是自动登录到网站时的关键部分编程。

有一种解决方法,但不使用机械化。你必须推出自己的Cookie处理器 - 这里是基本的方法我把(并不完美,但它能够完成任务):

import urllib, urllib2, Cookie 
from google.appengine.api import urlfetch 
from 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 is None: 
      method = urlfetch.GET 
     else: 
      method = urlfetch.POST 
     while url is 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 will be a get, so no need to send the data again. 
      method = urlfetch.GET 
      self.cookie.load(self.last_response.headers.get('set-cookie', '')) # Load the cookies from the 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 = "" 
     for 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) 

你可以使用它,就像您urllib2.urlopen,除了你的方法将使用只是“开放”。

+0

所以如果机械化被修补以手动持续请求cookies的请求,那么一切都应该好吗? – cerberos 2011-06-16 01:51:20