Python, HTTPS GET con autenticación básica

Estoy tratando de hacer un GET HTTPS con autenticación básica usando python. Soy muy nuevo en Python y las guías parecen usar diferentes bibliotecas para hacer cosas. (http.client, httplib y urllib). ¿Alguien me puede mostrar cómo se hace? ¿Cómo puedes decirle a la biblioteca estándar para usar?

En Python 3 funcionará lo siguiente. Estoy usando el http.client de nivel inferior de la biblioteca estándar. También consulte la sección 2 de rfc2617 para obtener detalles de la autorización básica. Este código no verificará que el certificado sea válido, pero configurará una conexión https. Consulte la documentación de http.client sobre cómo hacerlo.

from http.client import HTTPSConnection from base64 import b64encode #This sets up the https connection c = HTTPSConnection("www.google.com") #we need to base 64 encode it #and then decode it to acsii as python 3 stores it as a byte string userAndPass = b64encode(b"username:password").decode("ascii") headers = { 'Authorization' : 'Basic %s' % userAndPass } #then connect c.request('GET', '/', headers=headers) #get the response back res = c.getresponse() # at this point you could check the status etc # this gets the page text data = res.read() 

Usa el poder de Python y confía en una de las mejores bibliotecas: solicitudes

 import requests r = requests.get('https://my.website.com/rest/path', auth=('myusername', 'mybasicpass')) print(r.text) 

La variable r (solicitud de respuesta) tiene muchos más parámetros que puedes usar. Lo mejor es aparecer en el intérprete interactivo y jugar con él, y / o leer las solicitudes de documentos.

 ubuntu@hostname:/home/ubuntu$ python3 Python 3.4.3 (default, Oct 14 2015, 20:28:29) [GCC 4.8.4] on linux Type "help", "copyright", "credits" or "license" for more information. >>> import requests >>> r = requests.get('https://my.website.com/rest/path', auth=('myusername', 'mybasicpass')) >>> dir(r) ['__attrs__', '__bool__', '__class__', '__delattr__', '__dict__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getstate__', '__gt__', '__hash__', '__init__', '__iter__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__nonzero__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__setstate__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__', '_content', '_content_consumed', 'apparent_encoding', 'close', 'connection', 'content', 'cookies', 'elapsed', 'encoding', 'headers', 'history', 'iter_content', 'iter_lines', 'json', 'links', 'ok', 'raise_for_status', 'raw', 'reason', 'request', 'status_code', 'text', 'url'] >>> r.content b'{"battery_status":0,"margin_status":0,"timestamp_status":null,"req_status":0}' >>> r.text '{"battery_status":0,"margin_status":0,"timestamp_status":null,"req_status":0}' >>> r.status_code 200 >>> r.headers CaseInsensitiveDict({'x-powered-by': 'Express', 'content-length': '77', 'date': 'Fri, 20 May 2016 02:06:18 GMT', 'server': 'nginx/1.6.3', 'connection': 'keep-alive', 'content-type': 'application/json; charset=utf-8'}) 

Actualización: OP usa Python 3. Entonces, agregando un ejemplo usando httplib2

 import httplib2 h = httplib2.Http(".cache") h.add_credentials('name', 'password') # Basic authentication resp, content = h.request("https://host/path/to/resource", "POST", body="foobar") 

El siguiente trabajo para python 2.6:

Uso mucho pycurl en producción para un proceso que realiza más de 10 millones de solicitudes por día.

Tendrás que importar lo siguiente primero.

 import pycurl import cStringIO import base64 

Parte del encabezado de autenticación básico consiste en el nombre de usuario y la contraseña codificados como Base64.

 headers = { 'Authorization' : 'Basic %s' % base64.b64encode("username:password") } 

En el encabezado HTTP verá esta línea Authorization: Basic dXNlcm5hbWU6cGFzc3dvcmQ= . La cadena codificada cambia dependiendo de su nombre de usuario y contraseña.

Ahora necesitamos un lugar para escribir nuestra respuesta HTTP y un identificador de conexión de enrollamiento.

 response = cStringIO.StringIO() conn = pycurl.Curl() 

Podemos configurar varias opciones de rizo. Para una lista completa de opciones, vea esto . La documentación vinculada es para la API libcurl, pero las opciones no cambian para otros enlaces de idioma.

 conn.setopt(pycurl.VERBOSE, 1) conn.setopt(pycurlHTTPHEADER, ["%s: %s" % t for t in headers.items()]) conn.setopt(pycurl.URL, "https://host/path/to/resource") conn.setopt(pycurl.POST, 1) 

Si no es necesario verificar el certificado. Advertencia: Esto es inseguro. Similar a correr curl -k o curl --insecure .

 conn.setopt(pycurl.SSL_VERIFYPEER, False) conn.setopt(pycurl.SSL_VERIFYHOST, False) 

Llame a cStringIO.write para almacenar la respuesta HTTP.

 conn.setopt(pycurl.WRITEFUNCTION, response.write) 

Cuando estás haciendo una solicitud POST.

 post_body = "foobar" conn.setopt(pycurl.POSTFIELDS, post_body) 

Haga la solicitud actual ahora.

 conn.perform() 

Hacer algo basado en el código de respuesta HTTP.

 http_code = conn.getinfo(pycurl.HTTP_CODE) if http_code is 200: print response.getvalue() 

A continuación se urllib.request una forma correcta de realizar la autenticación básica en urthib.request de urllib.request con validación de certificado.

Tenga en cuenta que certifi no es obligatorio. Puede usar su paquete de sistema operativo (probablemente * nix solamente) o distribuir el paquete de CA de Mozilla usted mismo. O si los hosts con los que se comunica son solo algunos, concatene usted mismo el archivo de CA de los hosts, lo que puede reducir el riesgo de ataque MitM causado por otra CA corrupta.

 #!/usr/bin/env python3 import urllib.request import ssl import certifi context = ssl.SSLContext(ssl.PROTOCOL_TLSv1) context.verify_mode = ssl.CERT_REQUIRED context.load_verify_locations(certifi.where()) httpsHandler = urllib.request.HTTPSHandler(context = context) manager = urllib.request.HTTPPasswordMgrWithDefaultRealm() manager.add_password(None, 'https://domain.com/', 'username', 'password') authHandler = urllib.request.HTTPBasicAuthHandler(manager) opener = urllib.request.build_opener(httpsHandler, authHandler) # Used globally for all urllib.request requests. # If it doesn't fit your design, use opener directly. urllib.request.install_opener(opener) response = urllib.request.urlopen('https://domain.com/some/path') print(response.read())