302s e perda de cookies com urllib2

Estou usando a liburl2 com o CookieJar / HTTPCookieProcessor na tentativa de simular um logon em uma página para automatizar o uploa

Vi algumas perguntas e respostas sobre isso, mas nada que resolve o meu problema. Estou perdendo meu cookie ao simular o login que termina com um redirecionamento 302. A resposta 302 é onde o cookie é definido pelo servidor, mas o urllib2 HTTPCookieProcessor parece não salvar o cookie durante um redirecionamento. Tentei criar uma classe HTTPRedirectHandler para ignorar o redirecionamento, mas isso não pareceu funcionar. Tentei fazer referência global ao CookieJar para manipular os cookies do HTTPRedirectHandler, mas 1. Isso não funcionou (porque eu estava manipulando o cabeçalho do redirecionador e a função CookieJar que eu estava usando, extract_cookies, precisava de uma solicitação completa) e 2. É uma maneira feia de lidar com iss

Eu provavelmente preciso de alguma orientação sobre isso, pois sou bastante verde com o Python. Acho que estou latindo principalmente para a árvore certa aqui, mas talvez esteja focando no ramo errad

cj = cookielib.CookieJar()
cookieprocessor = urllib2.HTTPCookieProcessor(cj)


class MyHTTPRedirectHandler(urllib2.HTTPRedirectHandler):
  def http_error_302(self, req, fp, code, msg, headers):
    global cj
    cookie = headers.get("set-cookie")
    if cookie:
      # Doesn't work, but you get the idea
      cj.extract_cookies(headers, req)

    return urllib2.HTTPRedirectHandler.http_error_302(self, req, fp, code, msg, headers)

  http_error_301 = http_error_303 = http_error_307 = http_error_302

cookieprocessor = urllib2.HTTPCookieProcessor(cj)

# Oh yeah.  I'm using a proxy too, to follow traffic.
proxy = urllib2.ProxyHandler({'http': '127.0.0.1:8888'})
opener = urllib2.build_opener(MyHTTPRedirectHandler, cookieprocessor, proxy)

Adição: eu tinha tentado usar mecanizar também, sem sucesso. Essa provavelmente é uma pergunta nova, mas vou colocá-la aqui, pois é o mesmo objetivo final:

Este código simples usando mecanizar, quando usado com um URL 302 emissor (http://fxfeeds.mozilla.com/firefox/headlines.xml) - observe que o mesmo comportamento ocorre quando não se usa set_handle_robots (False). Eu só queria garantir que não era:

import urllib2, mechanize

browser = mechanize.Browser()
browser.set_handle_robots(False)
opener = mechanize.build_opener(*(browser.handlers))
r = opener.open("http://fxfeeds.mozilla.com/firefox/headlines.xml")

Saída

Traceback (most recent call last):
  File "redirecttester.py", line 6, in <module>
    r = opener.open("http://fxfeeds.mozilla.com/firefox/headlines.xml")
  File "build/bdist.macosx-10.6-universal/egg/mechanize/_opener.py", line 204, in open
  File "build/bdist.macosx-10.6-universal/egg/mechanize/_urllib2_fork.py", line 457, in http_response
  File "build/bdist.macosx-10.6-universal/egg/mechanize/_opener.py", line 221, in error
  File "build/bdist.macosx-10.6-universal/egg/mechanize/_urllib2_fork.py", line 332, in _call_chain
  File "build/bdist.macosx-10.6-universal/egg/mechanize/_urllib2_fork.py", line 571, in http_error_302
  File "build/bdist.macosx-10.6-universal/egg/mechanize/_opener.py", line 188, in open
  File "build/bdist.macosx-10.6-universal/egg/mechanize/_mechanize.py", line 71, in http_request
AttributeError: OpenerDirector instance has no attribute '_add_referer_header'

Alguma ideia

questionAnswers(4)

yourAnswerToTheQuestion