type requests libreria example descargar content python python-3.x

requests - Python, HTTPS GET con autenticación básica



request session get python (4)

A continuación, se urllib.request una forma correcta de realizar autenticación básica en Python3 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 CA de Mozilla usted mismo. O si los hosts con los que se comunica son solo unos pocos, concatene el archivo de CA desde las CA de los hosts, lo que puede reducir el riesgo de ataque de 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())

Estoy tratando de hacer un GET de 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 puede mostrarme cómo se hace? ¿Cómo puede decirle a la biblioteca estándar que use?


Actualización: OP usa Python 3. Por lo tanto, agregue 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 funciona para Python 2.6:

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

Primero deberá importar lo siguiente.

import pycurl import cStringIO import base64

Parte del encabezado de autenticación básica 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 según su nombre de usuario y contraseña.

Ahora necesitamos un lugar donde escribir nuestra respuesta HTTP y un identificador de conexión curl.

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

Podemos establecer varias opciones de curl. Para obtener una lista completa de opciones, vea esto . La documentación vinculada es para la API de 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 necesita verificar el certificado. Advertencia: esto es inseguro. Similar a ejecutar 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()

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

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


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

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()


Utilice el poder de Python y apóyese en una de las mejores bibliotecas disponibles: requests

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 puede usar. Lo mejor es ingresar al intérprete interactivo y jugar con él, y / o leer documentos de requests .

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''})