Foro de elhacker.net

Programación => Scripting => Mensaje iniciado por: NikNitro! en 5 Julio 2017, 21:46 pm



Título: Problema con Python y SSL [RESUELTO]
Publicado por: NikNitro! en 5 Julio 2017, 21:46 pm
Buenas gente. Estoy haciendo un pequeño script para obtener la temperatura en España de cada dia durante el año pasado. Estoy usando la web de AEMET que trae una API bastante buena pero no consigo ejecutar ni siquiera el ejemplo que ponen.
Link del ejemplo (https://opendata.aemet.es/centrodedescargas/ejemProgramas)
Link de la web de la API de AEMET (http://www.aemet.es/es/datos_abiertos/AEMET_OpenData)

El ejemplo de uso que estoy intentando ejecutar es el siguiente:
Código
  1. import requests
  2.  
  3. url = "https://opendata.aemet.es/opendata/api/valores/climatologicos/inventarioestaciones/todasestaciones/"
  4.  
  5. querystring = {"api_key":"xxxxxxxxxxxxxxxxxxxxxxx"}
  6.  
  7. headers = {
  8.    'cache-control': "no-cache"
  9.    }
  10.  
  11. response = requests.request("GET", url, headers=headers, params=querystring)
  12.  
  13. print(response.text)

Bueno, el error que me da dice tal que así:
Código:
C:\Users\NikNitro\Desktop>python test.py
Traceback (most recent call last):
  File "test.py", line 29, in <module>
    response = requests.request("GET", url, headers=headers, params=querystring)
  File "C:\Python27\lib\site-packages\requests\api.py", line 58, in request
    return session.request(method=method, url=url, **kwargs)
  File "C:\Python27\lib\site-packages\requests\sessions.py", line 502, in request
    resp = self.send(prep, **send_kwargs)
  File "C:\Python27\lib\site-packages\requests\sessions.py", line 612, in send
    r = adapter.send(request, **kwargs)
  File "C:\Python27\lib\site-packages\requests\adapters.py", line 514, in send
    raise SSLError(e, request=request)
requests.exceptions.SSLError: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:661)

Estoy usando Windows 10.
En cuanto a soluciones he visto el poner verify=False, pero no me deja acceder así porque es necesario ssl.
A True me da el mismo error y, según he visto en la red, debería poner una ruta a un certificado.
En windows no he encontrado la carpeta donde están, solo el administrador así que he descargado uno de GoDaddy, he puesto la ruta y... el mismo error.

Ya no sé qué más probar. Qué me recomendáis?

Gracias;)


Título: Re: Problema con Python y SSL
Publicado por: engel lex en 5 Julio 2017, 22:14 pm
Citar
En cuanto a soluciones he visto el poner verify=False, pero no me deja acceder así porque es necesario ssl.

es raro, porque esta opción no descarta el certificado, solo ignora las advertencias de su validez y sigue usandolo...

probando verify=True, funciona bien, aunque da una alerta de inseguridad... puedes hacer esto que es lo mismo y te ahorras la alerta

Código
  1. import urllib, urllib2, ssl
  2.  
  3. url = "https://opendata.aemet.es/opendata/api/valores/climatologicos/inventarioestaciones/todasestaciones/"
  4.  
  5. querystring = {"api_key":"xxxxxxxxxxxxxxxxxxxxxxx"}
  6.  
  7. data = urllib.urlencode(querystring)
  8. context = ssl._create_unverified_context()
  9. try:
  10. req = urllib2.urlopen(url+"?"+data, context=context)
  11. response = urllib2.urlopen(req)
  12. print response.read()
  13.  
  14. except urllib2.HTTPError, e:
  15. print e.code, e.reason
  16.  


Título: Re: Problema con Python y SSL
Publicado por: NikNitro! en 5 Julio 2017, 22:48 pm
D'accord, lo conseguí. Muchas gracias Engel Lex :)

Como aporte decir que de primeras da error en la línea 11 porque (según he entendido) req es ya una url abierta.
El cambio sería unicamente no hacer la línea 11 e imprimir req.read().

Gracias de nuevo.
Saludos;)


Título: Re: Problema con Python y SSL
Publicado por: engel lex en 5 Julio 2017, 22:59 pm
ups! jjejeje tienes razón se me pasó XD lo hice brevemente de copia de otros codigos y lo armé aśi sin querer