HodlEye_Crypto_Price_Tracker/server/newsfeed/server.js
Gerald Hasani aed13bfcd6 Update 1.0.8
Adding Tradingview chart display loaded when you click on the respective cryptocurrencies
2025-03-11 10:48:25 +01:00

100 lines
3.2 KiB
JavaScript

const express = require("express");
const axios = require("axios");
const xml2js = require("xml2js");
const cors = require("cors");
const app = express();
const PORT = process.env.PORT || 5001;
/*
* Metadata
* Version: 1.0.6
* Author/Dev: Gerald Hasani
* Name: HodlEye Crypto Price Tracker
* Email: contact@gerald-hasani.com
* GitHub: https://github.com/Gerald-Ha
*/
console.log("Server gestartet...");
app.use(cors());
const RSS_FEEDS = [
{ name: "crypto_news", url: "https://crypto.news/feed/" },
{ name: "cointelegraph", url: "https://cointelegraph.com/rss" },
{ name: "thedefiant", url: "https://thedefiant.io/api/feed" },
{ name: "newsbtc", url: "https://newsbtc.com/feed" },
{ name: "bitcoin_news", url: "https://news.bitcoin.com/feed" }, // nicht erreichbar mit deutscher ip
{ name: "bitcoinmagazine", url: "https://bitcoinmagazine.com/feed" },
{ name: "cryptopanic", url: "https://cryptopanic.com/news/rss/" },
{ name: "decrypt", url: "https://decrypt.co/feed" }
];
app.get("/api/news", async (req, res) => {
try {
const requestedSource = req.query.source;
const fetchFeed = async (feed) => {
try {
const response = await axios.get(feed.url, {
headers: {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/110.0.0.0 Safari/537.36"
}
});
const xml = response.data;
return new Promise((resolve, reject) => {
xml2js.parseString(xml, { trim: true, explicitArray: false }, (err, result) => {
if (err) return reject(err);
if (!result.rss || !result.rss.channel || !result.rss.channel.item) {
console.error(`Kein gültiger RSS-Feed von ${feed.url}`);
return resolve([]);
}
const items = result.rss.channel.item.map(item => ({
title: item.title,
link: item.link,
description: item.description || "Keine Beschreibung verfügbar.",
pubDate: new Date(item.pubDate),
source: feed.name
}));
resolve(items);
});
});
} catch (error) {
console.error(`Fehler beim Abrufen von ${feed.url}:`, error.message);
return [];
}
};
const allFeeds = await Promise.all(RSS_FEEDS.map(fetchFeed));
let allArticles = allFeeds.flat().sort((a, b) => b.pubDate - a.pubDate);
if (requestedSource) {
allArticles = allArticles.filter(article => article.source === requestedSource);
}
res.json(allArticles);
} catch (error) {
console.error("Fehler beim Abrufen der Feeds:", error);
res.status(500).json({ error: "Fehler beim Abrufen der Feeds" });
}
});
app.listen(PORT, () => {
console.log(`Server läuft auf Port ${PORT}`);
});