Problema con Python y SSL [RESUELTO]

Iniciado por NikNitro!, 5 Julio 2017, 21:46 PM

0 Miembros y 1 Visitante están viendo este tema.

NikNitro!

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
Link de la web de la API de AEMET

El ejemplo de uso que estoy intentando ejecutar es el siguiente:
Código (python) [Seleccionar]

import requests

url = "https://opendata.aemet.es/opendata/api/valores/climatologicos/inventarioestaciones/todasestaciones/"

querystring = {"api_key":"xxxxxxxxxxxxxxxxxxxxxxx"}

headers = {
   'cache-control': "no-cache"
   }

response = requests.request("GET", url, headers=headers, params=querystring)

print(response.text)


Bueno, el error que me da dice tal que así:

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

engel lex

CitarEn 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 (python) [Seleccionar]
import urllib, urllib2, ssl

url = "https://opendata.aemet.es/opendata/api/valores/climatologicos/inventarioestaciones/todasestaciones/"

querystring = {"api_key":"xxxxxxxxxxxxxxxxxxxxxxx"}

data = urllib.urlencode(querystring)
context = ssl._create_unverified_context()
try:
req = urllib2.urlopen(url+"?"+data, context=context)
response = urllib2.urlopen(req)
print response.read()

except urllib2.HTTPError, e:
print e.code, e.reason

El problema con la sociedad actualmente radica en que todos creen que tienen el derecho de tener una opinión, y que esa opinión sea validada por todos, cuando lo correcto es que todos tengan derecho a una opinión, siempre y cuando esa opinión pueda ser ignorada, cuestionada, e incluso ser sujeta a burla, particularmente cuando no tiene sentido alguno.

NikNitro!

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

engel lex

ups! jjejeje tienes razón se me pasó XD lo hice brevemente de copia de otros codigos y lo armé aśi sin querer
El problema con la sociedad actualmente radica en que todos creen que tienen el derecho de tener una opinión, y que esa opinión sea validada por todos, cuando lo correcto es que todos tengan derecho a una opinión, siempre y cuando esa opinión pueda ser ignorada, cuestionada, e incluso ser sujeta a burla, particularmente cuando no tiene sentido alguno.