Проблема, скорее всего, связана с тем, как Google повредил модуль urllib2 в GAE.
Внутренне он теперь использует модуль urlfetch (что-то, что написал Google), и они полностью удалили функциональность HTTPCookieProcessor () - это означает, что куки не сохраняются от запроса к запросу, что является критической частью при автоматическом входе на сайты программно ,
Есть способ обойти это, но без использования механизации. Вы должны свернуть свой собственный процессор 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, за исключением того, что вы будете использовать метод "open".