Розробка мобільного додатку для агрегатора крипто-новин
Агрегатор крипто-новин обробляє кілька потоків даних одночасно: RSS-канали, API новинних сервісів (CryptoCompare News, CoinGecko, Messari), Twitter/X API та дані про ціни. Завдання: зібрати все, усунути дублікати, ранжувати за релевантністю та доставити користувачам без затримок.
Джерела даних та їх особливості
CryptoCompare News API — безплатний рівень надає 100k запитів/місяць, підтримує фільтрацію за категоріями (Bitcoin, Ethereum, DeFi, NFT) та мовами. Дані структуровані: кожна стаття містить categories, tags, source_info.
Messari API — аналітичніший контент з платним рівнем для повного доступу. Хороший источник для серйозного фінансового контенту.
RSS-канали — CoinDesk, Decrypt, The Block публікують RSS. Парсинг на сервері через feedparser (Python) або власний RSS-парсер.
На мобільному клієнті не потрібно напряму агрегувати джерела — надто багато запитів та витрат батареї. Правильний підхід: сервер агрегує та кешує; мобільний клієнт робить один запит до свого API.
Реальний час: WebSocket vs Polling
Новини з'являються постійно. Polling кожні 60 секунд — розумний компромис для більшості користувачів. WebSocket для оновлень в реальному часі — якщо потрібна реакція за секунди (наприклад, breaking news).
class NewsWebSocketClient: ObservableObject {
@Published var latestNews: [NewsItem] = []
private var webSocketTask: URLSessionWebSocketTask?
func connect() {
let url = URL(string: "wss://api.yourservice.com/news/stream")!
var request = URLRequest(url: url)
request.addValue("Bearer \(token)", forHTTPHeaderField: "Authorization")
webSocketTask = URLSession.shared.webSocketTask(with: request)
webSocketTask?.resume()
listen()
}
private func listen() {
webSocketTask?.receive { [weak self] result in
if case .success(.string(let text)) = result,
let item = try? JSONDecoder().decode(NewsItem.self, from: Data(text.utf8)) {
DispatchQueue.main.async {
self?.latestNews.insert(item, at: 0)
if self?.latestNews.count ?? 0 > 200 {
self?.latestNews.removeLast()
}
}
}
self?.listen()
}
}
}
Персоналізація та фільтрація
Користувачі відслідковують певні монети — BTC, ETH, SOL. Фільтрація за тегами на клієнті працює лише якщо всі статті вже завантажені. У великому масштабі — використовуйте серверну фільтрацію з параметрами запиту.
AI-резюме: кожна стаття отримує коротке резюме з 2–3 речень, сформоване через GPT-4o mini на сервері під час індексування. Дорожче за показ оригіналу, але користувачі отримують суть без відкриття статті. Вартість резюмування — ~$0.0002 за статтю з GPT-4o mini.
Аналіз тональності заголовка (Positive / Neutral / Negative) — швидкий сигнал ринку. Використовуйте ML Kit Sentiment на Android або NLTagger.sentimentScore на iOS, або спеціалізовані моделі крипто-тональності (CryptoNewsScore).
Котирування поряд зі статтями
Відображення поточної ціни монети поряд зі статтею — стандарт для крипто-агрегаторів. Безплатний API CoinGecko отримує ціни 250+ монет одним запитом: /simple/price?ids=bitcoin,ethereum&vs_currencies=usd,rub. Кешуйте на 30 секунд, щоб уникнути надмірних запитів.
// Android: корелювання статей з цінами
data class NewsWithPrice(
val news: NewsItem,
val relatedCoin: CoinPrice? // null якщо монета не визначена
)
fun enrichNewsWithPrices(
news: List<NewsItem>,
prices: Map<String, CoinPrice>
): List<NewsWithPrice> {
return news.map { item ->
val coin = item.tags.firstOrNull { prices.containsKey(it.lowercase()) }
NewsWithPrice(news = item, relatedCoin = coin?.let { prices[it.lowercase()] })
}
}
Push-сповіщення для breaking news
Сповіщення про breaking news за ключовими словами або монетами з вачліста користувача. Firebase Cloud Messaging з підпиской на теми: /topics/bitcoin-news, /topics/ethereum-news. Користувачі підписуються в налаштуваннях додатку.
Частота: не більше 3–5 push на день, інакше користувачі відпишуться. Background fetch (iOS) або WorkManager (Android) для тихого оновлення стрічки.
Процес розробки
Визначення джерел даних та частоти оновлення. Серверна агрегація з усуненням дублікатів та AI-резюме. Мобільний клієнт: стрічка, фільтри, екран деталей. Інтеграція цін. Topic-based push-сповіщення. Персоналізація вачліста. Тестування продуктивності з великим обсягом статей.
Орієнтири за часом
Базовий агрегатор з кількома джерелами та фільтрами — 4–6 тижнів. Повна система з AI-резюме, аналізом тональності, персоналізацією та push-сповіщеннями — 10–16 тижнів.







