@infosel-sdk/news
Version:
Financial news SDK for Infosel platform. Provides comprehensive tools for accessing, filtering, and managing financial news data, including news services, sectors, and detailed news items with advanced filtering capabilities.
605 lines (489 loc) • 17.2 kB
Markdown
# @infosel-sdk/news
SDK de noticias financieras para la plataforma Infosel. Proporciona herramientas integrales para acceder, filtrar y gestionar datos de noticias financieras, incluyendo servicios de noticias, sectores y elementos de noticias detallados con capacidades de filtrado avanzado.
## 🚀 Características
- **Recuperación de Noticias**: Obtener elementos de noticias con filtrado avanzado y paginación
- **Gestión de Servicios**: Acceder a servicios de noticias disponibles y sus descripciones
- **Clasificación por Sectores**: Navegar por sectores de noticias para contenido dirigido
- **Noticias Detalladas**: Recuperar detalles completos de elementos de noticias incluyendo archivos adjuntos
- **Filtrado Avanzado**: Filtrar por rango de fechas, servicios, sectores y consultas personalizadas
- **Múltiples Tipos de Lista**: Soporte para noticias trending, más relevantes, últimas y relacionadas
- **Noticias por Sector**: Filtrar noticias específicamente por sector económico
- **Noticias del Día**: Obtener noticias publicadas en el día actual
- **Noticias Más Leídas**: Acceder a las noticias con mayor engagement
- **Metadatos de Respuesta**: Información detallada sobre paginación y estado de las consultas
## 📦 Instalación
```bash
npm install @infosel-sdk/news
```
## 🔧 Prerrequisitos
Este SDK requiere que el paquete `@infosel-sdk/core` esté instalado y configurado:
```bash
npm install @infosel-sdk/core
```
## 🏗️ Configuración
```typescript
import { InfoselSdkManager } from '@infosel-sdk/core';
import InfoselNews from '@infosel-sdk/news';
// Inicializar el gestor del SDK
const sdkManager = InfoselSdkManager.init({
mode: 'prod', // o 'qa' para pruebas
// ... otras opciones de configuración
});
// Inicializar el SDK de Noticias
const newsSDK = InfoselNews.init({ sdkManager });
```
## 📚 Referencia de la API
### Métodos Principales
#### 1. `getServices()` - Obtener Servicios de Noticias Disponibles
Recupera todos los servicios de noticias disponibles con sus IDs y descripciones.
```typescript
const services = await newsSDK.getServices();
console.log(services);
// Salida: [
// { id: 1, description: "Noticias Financieras" },
// { id: 2, description: "Actualizaciones de Mercado" },
// { id: 3, description: "Reportes Económicos" }
// ]
```
#### 2. `getSectors()` - Obtener Sectores de Noticias
Recupera todos los sectores de noticias disponibles para categorización.
```typescript
const sectors = await newsSDK.getSectors();
console.log(sectors);
// Salida: [
// { id: 1, description: "Tecnología" },
// { id: 2, description: "Finanzas" },
// { id: 3, description: "Salud" }
// ]
```
#### 3. `getNews(request: NewsRequest)` - Obtener Elementos de Noticias
Recupera elementos de noticias basados en criterios y filtros especificados.
```typescript
const newsRequest = {
listType: NewsListType.LATEST_NEWS,
services: [1, 2], // Filtrar por IDs de servicios específicos
sectors: [1, 3], // Filtrar por IDs de sectores específicos
dateRange: {
start: new Date('2024-01-01'),
end: new Date('2024-01-31'),
},
pagination: {
page: 1,
rows: 20,
},
filter: {
type: NewsFilterType.KEYWORDS,
query: 'bitcoin criptomonedas',
},
};
const newsItems = await newsSDK.getNews(newsRequest);
console.log(newsItems);
```
#### 4. `getDetail(id: number)` - Obtener Detalle de Elemento de Noticia
Recupera información detallada sobre un elemento de noticia específico por ID.
```typescript
const newsDetail = await newsSDK.getDetail(12345);
console.log(newsDetail);
```
#### 5. `getNewsBySector(sectorId: number, request?: NewsSectorRequest)` - Obtener Noticias por Sector
Recupera noticias específicas de un sector económico particular con opciones de filtrado avanzado.
```typescript
const sectorNews = await newsSDK.getNewsBySector(1, {
services: [1, 2], // Filtrar por servicios específicos
rows: 20,
page: 1,
symbol: 'AAPL', // Filtrar por símbolo financiero
startDate: new Date('2024-01-01'),
endDate: new Date('2024-01-31'),
newsTypeId: 1, // Tipo específico de noticia
});
console.log(`Noticias del sector: ${sectorNews.data.length}`);
console.log('Metadatos:', sectorNews.metadata);
```
#### 6. `getNewsToday(request?: NewsTodayRequest)` - Obtener Noticias del Día
Recupera noticias publicadas en el día actual con múltiples opciones de filtrado.
```typescript
const todayNews = await newsSDK.getNewsToday({
services: [1], // Solo noticias financieras
limit: 50, // Límite de resultados
offset: 0, // Desplazamiento para paginación
onlyTop: true, // Solo noticias destacadas
rows: 25,
page: 1,
sourcesId: [1, 2], // Fuentes específicas
sectors: [1, 3], // Sectores específicos
symbol: 'TSLA', // Símbolo financiero
newsTypeId: [1, 2], // Tipos de noticia
});
console.log(`Noticias del día: ${todayNews.data.length}`);
todayNews.data.forEach(news => {
console.log(`📰 ${news.header} - ${news.date} ${news.time}`);
});
```
#### 7. `getNewsDetails(request?: NewsDetailsRequest)` - Obtener Detalles de Noticias
Recupera noticias con información detallada y opciones de búsqueda avanzada.
```typescript
const detailedNews = await newsSDK.getNewsDetails({
services: [1, 2],
rows: 30,
page: 1,
limit: 100,
offset: 0,
symbol: 'MSFT',
startDate: new Date('2024-01-01'),
endDate: new Date('2024-01-31'),
newsTypeId: 1,
keyword: 'inteligencia artificial',
});
console.log(`Noticias detalladas encontradas: ${detailedNews.data.length}`);
detailedNews.data.forEach(news => {
console.log(`📰 ${news.header}`);
console.log(`🏷️ ${news.tags}`);
console.log(`🌍 ${news.countries}`);
console.log(`📄 ${news.body.substring(0, 100)}...`);
});
```
#### 8. `getNewsMostRead(request?: NewsMostReadRequest)` - Obtener Noticias Más Leídas
Recupera las noticias con mayor engagement y lectura, perfectas para análisis de tendencias.
```typescript
const mostReadNews = await newsSDK.getNewsMostRead({
services: [1], // Servicios específicos
sourcesId: [1, 2, 3], // Fuentes de noticias
rows: 50,
page: 1,
});
console.log(`Noticias más leídas: ${mostReadNews.data.length}`);
mostReadNews.data.forEach((news, index) => {
console.log(`${index + 1}. 📰 ${news.header}`);
console.log(` 📅 ${news.date} ${news.time}`);
console.log(` 🏷️ ${news.tags}`);
console.log(` 📊 Prioridad: ${news.priority}`);
console.log(` 📎 Archivos: ${news.numberAttachedFiles}`);
});
```
## 🏷️ Tipos de Datos
### NewsRequest
Interfaz para configurar búsqueda y filtrado de noticias:
```typescript
interface NewsRequest {
listType?: NewsListType; // Tipo de lista de noticias a recuperar
services?: number[]; // Array de IDs de servicios para filtrar
sectors?: number[]; // Array de IDs de sectores para filtrar
dateRange?: {
// Filtro de rango de fechas
start: Date;
end: Date;
};
pagination?: {
// Configuración de paginación
page: number;
rows: number;
};
filter?: {
// Filtrado basado en texto
type: NewsFilterType;
query: string;
};
}
```
### NewsSectorRequest
Interfaz para filtrar noticias por sector:
```typescript
interface NewsSectorRequest {
services?: number[]; // Servicios específicos
rows?: number; // Número de filas por página
page?: number; // Número de página
symbol?: string; // Símbolo financiero
startDate?: Date; // Fecha de inicio
endDate?: Date; // Fecha de fin
newsTypeId?: number; // ID del tipo de noticia
}
```
### NewsTodayRequest
Interfaz para obtener noticias del día:
```typescript
interface NewsTodayRequest {
services?: number[]; // Servicios específicos
limit?: number; // Límite de resultados
offset?: number; // Desplazamiento
onlyTop?: boolean; // Solo noticias destacadas
rows?: number; // Filas por página
page?: number; // Número de página
sourcesId?: number[]; // IDs de fuentes
sectors?: number[]; // IDs de sectores
symbol?: string; // Símbolo financiero
newsTypeId?: number[]; // IDs de tipos de noticia
}
```
### NewsDetailsRequest
Interfaz para obtener noticias con detalles completos:
```typescript
interface NewsDetailsRequest {
services?: number[]; // Servicios específicos
rows?: number; // Filas por página
page?: number; // Número de página
limit?: number; // Límite de resultados
offset?: number; // Desplazamiento
symbol?: string; // Símbolo financiero
startDate?: Date; // Fecha de inicio
endDate?: Date; // Fecha de fin
newsTypeId?: number; // ID del tipo de noticia
keyword?: string; // Palabra clave para búsqueda
}
```
### NewsMostReadRequest
Interfaz para obtener noticias más leídas:
```typescript
interface NewsMostReadRequest {
services?: number[]; // Servicios específicos
sourcesId?: number[]; // IDs de fuentes
rows?: number; // Filas por página
page?: number; // Número de página
}
```
### NewsItem
Información completa del elemento de noticia:
```typescript
interface NewsItem {
id: number; // Identificador único
serviceId: number; // ID del servicio asociado
priority: number; // Nivel de prioridad de la noticia
sectors: NewsSector[]; // Sectores asociados
date: Date; // Fecha de publicación
source: string; // Fuente de la noticia
countries: string[]; // Países relacionados
tags: string[]; // Etiquetas asociadas
header: string; // Título de la noticia
abstract: string; // Resumen de la noticia
body: string; // Contenido completo de la noticia
symbols: string[]; // Símbolos financieros relacionados
image: string; // URL de la imagen destacada
numberOfAttachedFiles: number; // Cantidad de archivos adjuntos
files: NewsFile[]; // Archivos adjuntos
}
```
### NewsMetadata
Metadatos de respuesta para paginación y estado:
```typescript
interface NewsMetadata {
statuscode: number; // Código de estado de la respuesta
pagination?: {
// Información de paginación
total: number; // Total de registros
limit: number; // Límite por página
offset: number; // Desplazamiento actual
};
totalRegistros?: number; // Total de registros (alternativo)
}
```
### NewsListType
Enumeración de tipos de lista de noticias disponibles:
```typescript
enum NewsListType {
MOST_RELEVANT = 1, // Noticias más relevantes
MOST_READ = 2, // Artículos más leídos
RELATED = 3, // Noticias relacionadas
TRENDING = 4, // Temas trending
NEWS_BY_INSTRUMENT = 8, // Noticias por instrumento financiero
LATEST_NEWS = 9, // Últimas noticias
FAVORITE = 10, // Noticias favoritas/guardadas
}
```
### NewsFilterType
Enumeración de tipos de filtro:
```typescript
enum NewsFilterType {
NO_FILTER = 0, // Sin filtro aplicado
KEYWORDS = 1, // Filtrar por palabras clave
TAGS = 2, // Filtrar por etiquetas
}
```
### NewsService & NewsSector
Interfaces básicas de entidades:
```typescript
interface NewsService {
id: number; // Identificador del servicio
description: string; // Descripción del servicio
}
interface NewsSector {
id: number; // Identificador del sector
description: string; // Descripción del sector
}
```
### NewsFile
Información de archivo adjunto:
```typescript
interface NewsFile {
type: NewsFileType; // Tipo de archivo (Archivo, Imagen, o -)
url: string; // URL de descarga del archivo
size: number; // Tamaño del archivo en bytes
format: string; // Formato del archivo
alt: string; // Texto alternativo
}
type NewsFileType = 'File' | 'Image' | '-';
```
## 💡 Ejemplos de Uso
### Ejemplo 1: Dashboard de Noticias Financieras
```typescript
import { NewsListType, NewsFilterType } from '@infosel-sdk/news';
// Obtener últimas noticias financieras
const financialNews = await newsSDK.getNews({
listType: NewsListType.LATEST_NEWS,
services: [1], // Servicio de noticias financieras
pagination: {
page: 1,
rows: 10,
},
});
// Mostrar elementos de noticias
financialNews.forEach(news => {
console.log(`📰 ${news.header}`);
console.log(`📅 ${news.date.toLocaleDateString()}`);
console.log(`🏷️ ${news.tags.join(', ')}`);
console.log(`📄 ${news.abstract}`);
console.log('---');
});
```
### Ejemplo 2: Monitoreo de Noticias por Sector
```typescript
// Obtener noticias del sector tecnológico de la última semana
const techNews = await newsSDK.getNewsBySector(1, {
startDate: new Date(Date.now() - 7 * 24 * 60 * 60 * 1000),
endDate: new Date(),
rows: 25,
page: 1,
});
console.log(
`Se encontraron ${techNews.data.length} elementos de noticias tecnológicas`,
);
console.log('Metadatos de paginación:', techNews.metadata);
```
### Ejemplo 3: Búsqueda Avanzada con Palabras Clave
```typescript
// Buscar noticias sobre empresas específicas
const companyNews = await newsSDK.getNewsDetails({
keyword: 'Apple Microsoft Google',
limit: 50,
rows: 15,
page: 1,
});
// Filtrar por símbolos específicos
const relevantNews = companyNews.data.filter(
news =>
news.header.toLowerCase().includes('apple') ||
news.header.toLowerCase().includes('microsoft') ||
news.header.toLowerCase().includes('google'),
);
console.log(`Noticias relevantes encontradas: ${relevantNews.length}`);
```
### Ejemplo 4: Análisis de Noticias Trending
```typescript
// Obtener noticias más leídas para análisis de tendencias
const mostReadNews = await newsSDK.getNewsMostRead({
services: [1, 2], // Servicios financieros y de mercado
rows: 100,
page: 1,
});
// Analizar temas trending
const trendingTopics = mostReadNews.data.reduce((acc, news) => {
const tags = news.tags.split(',').map(tag => tag.trim());
tags.forEach(tag => {
acc[tag] = (acc[tag] || 0) + 1;
});
return acc;
}, {} as Record<string, number>);
// Ordenar por frecuencia
const sortedTopics = Object.entries(trendingTopics)
.sort(([, a], [, b]) => b - a)
.slice(0, 10);
console.log('🔥 Temas Trending Principales:');
sortedTopics.forEach(([topic, count]) => {
console.log(`${topic}: ${count} menciones`);
});
```
### Ejemplo 5: Noticias del Día con Filtros Avanzados
```typescript
// Obtener noticias destacadas del día en sectores específicos
const todayHighlights = await newsSDK.getNewsToday({
onlyTop: true, // Solo noticias destacadas
sectors: [1, 2, 3], // Tecnología, Finanzas, Salud
services: [1], // Servicio principal
limit: 30,
rows: 15,
page: 1,
});
console.log(`📰 Noticias destacadas del día: ${todayHighlights.data.length}`);
// Agrupar por sector
const newsBySector = todayHighlights.data.reduce((acc, news) => {
const sector = news.sectors || 'General';
if (!acc[sector]) acc[sector] = [];
acc[sector].push(news);
return acc;
}, {} as Record<string, typeof todayHighlights.data>);
Object.entries(newsBySector).forEach(([sector, news]) => {
console.log(`\n🏢 ${sector}: ${news.length} noticias`);
news.forEach(item => {
console.log(` • ${item.header} (${item.date} ${item.time})`);
});
});
```
### Ejemplo 6: Sistema de Monitoreo de Noticias en Tiempo Real
```typescript
// Función para monitorear noticias en tiempo real
async function monitorNews() {
try {
// Obtener noticias del día cada hora
const todayNews = await newsSDK.getNewsToday({
limit: 100,
rows: 50,
page: 1,
});
// Obtener noticias más leídas
const mostRead = await newsSDK.getNewsMostRead({
rows: 25,
page: 1,
});
// Combinar y analizar
const allNews = [...todayNews.data, ...mostRead.data];
console.log(`📊 Resumen de Monitoreo:`);
console.log(` • Noticias del día: ${todayNews.data.length}`);
console.log(` • Noticias más leídas: ${mostRead.data.length}`);
console.log(` • Total analizado: ${allNews.length}`);
// Detectar noticias urgentes (alta prioridad)
const urgentNews = allNews.filter(news => news.priority >= 8);
if (urgentNews.length > 0) {
console.log(`🚨 Noticias urgentes: ${urgentNews.length}`);
urgentNews.forEach(news => {
console.log(` ⚠️ ${news.header} - Prioridad: ${news.priority}`);
});
}
} catch (error) {
console.error('Error en monitoreo de noticias:', error);
}
}
// Ejecutar monitoreo
monitorNews();
```
## 🔍 Manejo de Errores
Los métodos del SDK devuelven Promesas que pueden rechazarse con varios tipos de errores. Siempre envuelve tus llamadas en bloques try-catch:
```typescript
try {
const news = await newsSDK.getNewsToday({
limit: 50,
rows: 10,
page: 1,
});
console.log('Noticias recuperadas exitosamente:', news.data.length);
console.log('Metadatos:', news.metadata);
} catch (error) {
console.error('Error al recuperar noticias:', error);
// Manejar tipos de error específicos apropiadamente
}
```
## 🔗 Paquetes Relacionados
- `@infosel-sdk/core` - Funcionalidad principal del SDK
- `@infosel-sdk/markets` - Datos de mercados financieros
- `@infosel-sdk/securities` - Información de valores
- `@infosel-sdk/users` - Gestión de usuarios
---
Para más información, visita el [Portal de Desarrolladores de Infosel](https://developer.infosel.com) o contacta a nuestro equipo de soporte.