这个问题很可能是由于谷歌如何瘫痪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