#!/usr/bin/env python3 """Plantilla: los proyectos de una busqueda de Sondeva Renovables, de la API de datos a un CSV que abre Excel. Necesita: Python 3.8 o superior, sin nada mas. La clave: «Mi espacio» → «API» en https://renovables.sondeva.es (Enterprise Plus). SONDEVA_CLAVE=sdv_... python sondeva-a-csv.py proyectos.csv Cambie FILTROS por los suyos: son los del buscador (la tabla de la documentacion, https://renovables.sondeva.es/api). Cada proyecto que sale gasta del cupo mensual de su plan, como el Excel; repetir la misma busqueda ese mes no gasta otra vez. """ import csv import json import os import sys import urllib.parse import urllib.request BASE = os.environ.get("SONDEVA_URL", "https://renovables.sondeva.es").rstrip("/") FILTROS = {"estados": ["vivo"], "tecnologias": ["fotovoltaica"], "dias": 365} def pagina(n, clave, filtros): q = urllib.parse.urlencode({"f": json.dumps(filtros), "pagina": n, "por_pagina": 100}) pedido = urllib.request.Request(f"{BASE}/api/v1/proyectos?{q}", headers={"Authorization": f"Bearer {clave}"}) with urllib.request.urlopen(pedido, timeout=60) as r: return json.loads(r.read().decode("utf-8")) def todos(clave, filtros): """(proyectos, cuantos se quedaron fuera del cupo, las citas de las fuentes). Pide las paginas una a una.""" proyectos, fuera, fuentes, n = [], 0, [], 1 while True: d = pagina(n, clave, filtros) for x in d["items"]: if x.get("fuera_del_cupo"): fuera += 1 else: proyectos.append(x) fuentes += [c for c in d.get("fuentes") or [] if c not in fuentes] if n >= d["paginas"]: return proyectos, fuera, fuentes n += 1 def a_texto(v): """Lo que va en una celda: las listas separadas por comas y lo demas (diccionarios) como JSON.""" if v is None: return "" if isinstance(v, list): return ", ".join(str(a_texto(x)) for x in v) if isinstance(v, dict): return json.dumps(v, ensure_ascii=False) return v def main(argv=None): argv = sys.argv[1:] if argv is None else argv salida = argv[0] if argv else "proyectos.csv" clave = os.environ.get("SONDEVA_CLAVE", "").strip() if not clave: sys.exit("Falta la clave: SONDEVA_CLAVE=sdv_...") proyectos, fuera, fuentes = todos(clave, FILTROS) columnas = list(proyectos[0]) if proyectos else [] # utf-8-sig y «;»: lo que Excel en español abre sin preguntar. with open(salida, "w", encoding="utf-8-sig", newline="") as f: w = csv.writer(f, delimiter=";") w.writerow(columnas) for x in proyectos: w.writerow([a_texto(x.get(c)) for c in columnas]) print(f"{len(proyectos)} proyectos en {salida}" + (f"; {fuera} no caben en el cupo de este mes" if fuera else "")) for c in fuentes: print("Fuente:", c) if __name__ == "__main__": main()