requests - Conexión HTTPS Python
python requests github (8)
Estoy intentando verificar que ese objetivo expone un servicio web https. Tengo un código para conectarme a través de HTTP pero no estoy seguro de cómo conectarme a través de HTTPS. Leí que usa SSL, pero también he leído que no admite errores de certificado. El código que obtuve proviene de los documentos de Python:
import httplib
conn = httplib.HTTPConnection("www.python.org")
conn.request("GET", "/index.html")
r1 = conn.getresponse()
print r1.status, r1.reason
¿Alguien sabe cómo conectarse a HTTPS?
Ya probé la HTTPSConenction pero responde con un código de error que afirma que httplib no tiene el atributo HTTPSConnection. Tampoco tengo socket.ssl disponible.
He instalado Python 2.6.4 y no creo que tenga soporte SSL compilado en él. ¿Hay alguna manera de integrar este suppot en el python más nuevo sin tener que instalarlo de nuevo?
He instalado OpenSSL y pyOpenSsl y he intentado el siguiente código a partir de una de las respuestas:
import urllib2
from OpenSSL import SSL
try:
response = urllib2.urlopen(''https://example.com'')
print ''response headers: "%s"'' % response.info()
except IOError, e:
if hasattr(e, ''code''): # HTTPError
print ''http error code: '', e.code
elif hasattr(e, ''reason''): # URLError
print "can''t connect, reason: ", e.reason
else:
raise
Tengo un error:
Traceback (most recent call last):
File "<stdin>", line 2, in <module>
File "/home/build/workspace/downloads/Python-2.6.4/Lib/urllib.py", line 87, in urlopen
return opener.open(url)
File "/home/build/workspace/downloads/Python-2.6.4/Lib/urllib.py", line 203, in open
return self.open_unknown(fullurl, data)
File "/home/build/workspace/downloads/Python-2.6.4/Lib/urllib.py", line 215, in open_unknown
raise IOError, (''url error'', ''unknown url type'', type)
IOError: [Errno url error] unknown url type: ''https''
¿Alguien sabe cómo hacerlo funcionar?
-- UPDATE
Descubrí cuál era el problema, la versión de Python que estaba usando no tenía soporte para SSL. Encontré esta solución actualmente en: http://www.webtop.com.au/compiling-python-with-ssl-support .
El código ahora funcionará después de esta solución que es muy buena. Cuando importo ssl y HTTPSConnection, sé que no aparece un error.
Gracias por toda la ayuda.
¿Por qué no has probado httplib.HTTPSConnection? No hace la validación SSL, pero esto no es necesario para conectarse a través de https. Tu código funciona bien con la conexión https:
>>> import httplib
>>> conn = httplib.HTTPSConnection("mail.google.com")
>>> conn.request("GET", "/")
>>> r1 = conn.getresponse()
>>> print r1.status, r1.reason
200 OK
Para comprobar el soporte de SSL en Python 2.6+ :
try:
import ssl
except ImportError:
print "error: no ssl support"
Para conectarse a través de https :
import urllib2
try:
response = urllib2.urlopen(''https://example.com'')
print ''response headers: "%s"'' % response.info()
except IOError, e:
if hasattr(e, ''code''): # HTTPError
print ''http error code: '', e.code
elif hasattr(e, ''reason''): # URLError
print "can''t connect, reason: ", e.reason
else:
raise
Python 2.x: docs.python.org/2/library/httplib.html :
Nota: El soporte HTTPS solo está disponible si el módulo de socket fue compilado con soporte SSL.
Python 3.x: docs.python.org/3/library/http.client.html :
Nota El soporte HTTPS solo está disponible si Python se compiló con soporte SSL (a través del módulo ssl).
#!/usr/bin/env python
import httplib
c = httplib.HTTPSConnection("ccc.de")
c.request("GET", "/")
response = c.getresponse()
print response.status, response.reason
data = response.read()
print data
# =>
# 200 OK
# <!DOCTYPE html ....
Para verificar si SSL está habilitado, intente:
>>> import socket
>>> socket.ssl
<function ssl at 0x4038b0>
Si usa httplib.HTTPSConnection:
Por favor, eche un vistazo a: Modificado en la versión 2.7.9:
Esta clase ahora realiza todos los certificados necesarios y las verificaciones del nombre de host de forma predeterminada. Para volver al comportamiento anterior, no verificado, ssl._create_unverified_context () se puede pasar al parámetro de contexto. Puedes usar:
if hasattr(ssl, ''_create_unverified_context''):
ssl._create_default_https_context = ssl._create_unverified_context
Suponiendo que la compatibilidad con SSL está habilitada para el módulo de socket
.
connection1 = httplib.HTTPSConnection(''www.somesecuresite.com'')
Tenía un código que estaba fallando con un HTTPConnection (MOVED_PERMANENTLY error)
, pero tan pronto como HTTPConnection (MOVED_PERMANENTLY error)
a HTTPS
funcionó perfectamente otra vez sin necesidad de otros cambios. ¡Es una solución muy simple!
utilizando
class httplib.HTTPSConnection
http://docs.python.org/library/httplib.html#httplib.HTTPSConnection
import requests
r = requests.get("https://.com")
data = r.content # Content of response
print r.status_code # Status code of response
print data