Pregunta

Estoy tratando de probar la funcionalidad de una aplicación web mediante la secuencia de comandos de una secuencia de inicio de sesión en Python, pero tengo algunos problemas.

Esto es lo que necesito hacer:

  1. Hacer una POST con algunos parámetros y encabezados.
  2. Seguir una redirección
  3. Recuperar el cuerpo HTML.

Ahora, soy relativamente nuevo en Python, pero las dos cosas que he probado hasta ahora no han funcionado. Primero usé httplib, con putrequest () (pasando los parámetros dentro de la URL) y putheader (). Esto no parece seguir las redirecciones.

Luego probé urllib y urllib2, pasando los encabezados y los parámetros como dicts. Esto parece devolver la página de inicio de sesión, en lugar de la página en la que estoy intentando iniciar sesión, supongo que es por falta de cookies o algo así.

¿Me estoy perdiendo algo simple?

Gracias.

¿Fue útil?

Solución

Céntrese en urllib2 para esto, funciona bastante bien. No te metas con httplib , no es la API de nivel superior.

Lo que estás notando es que urllib2 no sigue la redirección.

Debe plegar una instancia de HTTPRedirectHandler que capturará y seguirá las redirecciones.

Además, es posible que desee subclasificar el HTTPRedirectHandler predeterminado para capturar información que luego verificará como parte de la prueba de su unidad.

cookie_handler= urllib2.HTTPCookieProcessor( self.cookies )
redirect_handler= HTTPRedirectHandler()
opener = urllib2.build_opener(redirect_handler,cookie_handler)

Luego puede usar este objeto abridor para PUBLICAR y OBTENER, manejando correctamente las redirecciones y las cookies.

Es posible que desee agregar su propia subclase de HTTPHandler para capturar y registrar varios códigos de error, también.

Otros consejos

Aquí está mi opinión sobre este tema.

#!/usr/bin/env python

import urllib
import urllib2


class HttpBot:
    """an HttpBot represents one browser session, with cookies."""
    def __init__(self):
        cookie_handler= urllib2.HTTPCookieProcessor()
        redirect_handler= urllib2.HTTPRedirectHandler()
        self._opener = urllib2.build_opener(redirect_handler, cookie_handler)

    def GET(self, url):
        return self._opener.open(url).read()

    def POST(self, url, parameters):
        return self._opener.open(url, urllib.urlencode(parameters)).read()


if __name__ == "__main__":
    bot = HttpBot()
    ignored_html = bot.POST('https://example.com/authenticator', {'passwd':'foo'})
    print bot.GET('https://example.com/interesting/content')
    ignored_html = bot.POST('https://example.com/deauthenticator',{})

@ S.Lott, gracias. Su sugerencia funcionó para mí, con algunas modificaciones. Así es como lo hice.

data = urllib.urlencode(params)
url = host+page
request = urllib2.Request(url, data, headers)
response = urllib2.urlopen(request)

cookies = CookieJar()
cookies.extract_cookies(response,request)

cookie_handler= urllib2.HTTPCookieProcessor( cookies )
redirect_handler= HTTPRedirectHandler()
opener = urllib2.build_opener(redirect_handler,cookie_handler)

response = opener.open(request)

Tuve que hacer esto exactamente hace poco. Solo necesitaba clases de la biblioteca estándar. Aquí hay un extracto de mi código:

from urllib import urlencode
from urllib2 import urlopen, Request

# encode my POST parameters for the login page
login_qs = urlencode( [("username",USERNAME), ("password",PASSWORD)] )

# extract my session id by loading a page from the site
set_cookie = urlopen(URL_BASE).headers.getheader("Set-Cookie")
sess_id = set_cookie[set_cookie.index("=")+1:set_cookie.index(";")]

# construct headers dictionary using the session id
headers = {"Cookie": "session_id="+sess_id}

# perform login and make sure it worked
if "Announcements:" not in urlopen(Request(URL_BASE+"login",headers=headers), login_qs).read():
    print "Didn't log in properly"
    exit(1)

# here's the function I used after this for loading pages
def download(page=""):
    return urlopen(Request(URL_BASE+page, headers=headers)).read()

# for example:
print download(URL_BASE + "config")

Le daría Mechanize ( http://wwwsearch.sourceforge.net/mechanize/ ) un disparo. Es muy posible que maneje sus cookies / encabezados de manera transparente.

Pruebe twill , un lenguaje simple que permite a los usuarios navegar por la Web desde una interfaz de línea de comandos. Con twill, puede navegar a través de sitios web que utilizan formularios, cookies y la mayoría de las características web estándar. Más aún, twill está escrito en Python y tiene un API de Python , por ejemplo:

from twill import get_browser
b = get_browser()

b.go("http://www.python.org/")
b.showforms()

Además del hecho de que puede faltarle una cookie, puede haber algunos campos en el formulario que no está PUBLICANDO en el servidor web. La mejor manera sería capturar la POST real desde un navegador web. Puede usar LiveHTTPHeaders o WireShark para espiar el tráfico e imitar el mismo comportamiento en su script.

Funkload es una gran herramienta de prueba de aplicaciones web también. Envuelve la unidad web para manejar la emulación del navegador, luego le brinda funciones funcionales y de prueba de carga en la parte superior.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top