GUIA PARA ESTA CLASE
# Integración de Python con News API usando parámetros dinámicos
"""API Real con parametros dinamicos"""
import json
import time
# este url parse sirve para poder configurar que la url baseurl tenga formato
# Adecuado para el momento de hacer el requests para que sea valido
import urllib.parse
# Este url request nos permite hacer los ajustes/
# configuraciones que queramos de request como si fuera navegador web
import urllib.request
# Configuración inicial
API_KEY = "pongan su LLAVE DE API"
BASE_URL = "pongan el hhtps de su URL"
# --- CLIENTES DE API ---
# --- 1. DEFINIR PRIMERO LAS FUNCIONES DE LOS CLIENTES ---
def news_api_client(api_key, query, timeout=30, retries=3):
"""Realiza la petición a NewsAPI, maneja reintentos y retorna un JSON."""
query_string = urllib.parse.urlencode({"q": query, "apiKey": api_key})
url = f"{BASE_URL}?{query_string}"
for intento in range(retries):
try:
with urllib.request.urlopen(url, timeout=timeout) as response:
# Leemos los datos y los decodificamos a string
raw_data = response.read().decode("utf-8")
# Convertimos el string a un diccionario/lista de Python (JSON)
return json.loads(raw_data)
except Exception as e:
print(f"Intento {intento + 1} falló: {e}")
if intento < retries - 1:
time.sleep(2)
else:
# Si falla del todo, retornamos un dict con el error para no romper el flujo
return {"status": "error", "message": str(e), "articles": []}
def guardian_client(api_key, section, from_date, timeout=30, retries=3):
"""Simulación para la API (retorna formato similar)."""
return {
"status": "ok",
"articles": [{"title": f"Noticia de Guardian en {section} desde {from_date}"}],
}
# --- FUNCIÓN PUENTE (DYNAMIC FETCH) ---
# --- 2. DEFINIR LA FUNCIÓN PUENTE ---
def fetch_news(api_name, *args, **kwargs):
"""Gestiona la configuración base y selecciona el cliente."""
config = {
"timeout": 15,
"retries": 3,
}
config.update(kwargs)
# Ahora Python ya conoce 'news_api_client' y 'guardian_client'
api_clients = {
"newsAPI": news_api_client,
"Guardian": guardian_client,
}
if api_name not in api_clients:
raise ValueError(f"API '{api_name}' no soportada.")
client = api_clients[api_name]
return client(*args, **config)
# --- 3. EJECUCIÓN Y PROCESAMIENTO ---
print("=== BUSCANDO NOTICIAS ===")
# Ejecutamos la petición
response_data = fetch_news("newsAPI", api_key=API_KEY, query="Python programming")
# Procesamos los resultados (como en el código que te pasaron)
if response_data.get("status") == "ok":
print(f"Se encontraron {len(response_data.get('articles', []))} artículos.\n")
# Iteramos sobre la lista de artículos
for article in response_data["articles"][
:5
]: # Limitamos a los primeros 5 para no saturar
print(f"Título: {article['title']}")
print(f"Fuente: {article['source']['name']}")
print("-" * 30)
else:
print(f"Error al obtener noticias: {response_data.get('message')}")