這個問題很可能是由於谷歌如何癱瘓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,除了你的方法將使用只是「開放」。
告訴我們你的代碼 – systempuntoout 2011-04-12 11:01:22
代碼或它沒有發生! – jathanism 2011-04-12 13:40:05
你爲什麼試圖通過App Engine應用程序自動登錄到gmail?您是否意識到這明顯違背了GMail的服務條款,並且幾乎可以肯定有更好的方法去做任何你想做的事情? – 2011-04-13 02:08:33