2011-04-12 98 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