Разработка мобильного приложения для крипто-новостного агрегатора
Крипто-новостной агрегатор — это несколько потоков данных одновременно: RSS-фиды, API новостных сервисов (CryptoCompare News, CoinGecko, Messari), Twitter/X API, данные о ценах. Задача: собрать всё, дедуплицировать, отранжировать по релевантности и показать пользователю без задержки.
Источники данных и их особенности
CryptoCompare News API — бесплатный tier даёт 100k запросов/месяц, поддерживает фильтрацию по категориям (Bitcoin, Ethereum, DeFi, NFT) и языкам. Данные структурированы: каждая новость содержит categories, tags, source_info.
Messari API — более аналитический контент, платный tier для полного доступа. Хороший источник для серьёзного финансового контента.
RSS фиды — CoinDesk, Decrypt, The Block публикуют RSS. Парсинг на сервере через feedparser (Python) или собственный RSS-парсер.
На мобильном клиенте напрямую агрегировать источники не нужно — слишком много запросов и батарея. Правильная схема: сервер агрегирует и кешируется, мобильный клиент делает один запрос к своему API.
Реальное время: WebSocket vs polling
Новости появляются постоянно. Polling каждые 60 секунд — разумный компромисс для большинства пользователей. WebSocket для real-time обновлений — если нужна реакция в секунды (например, 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, либо специализированные crypto sentiment модели (CryptoNewsScore).
Котировки рядом с новостями
Показывать текущую цену монеты рядом с новостью — стандарт для крипто-агрегаторов. CoinGecko free API позволяет получить цены 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 — по ключевым словам или по монетам из watchlist пользователя. Firebase Cloud Messaging с topic-подпиской: /topics/bitcoin-news, /topics/ethereum-news. Пользователь подписывается в настройках приложения.
Частота: не более 3–5 push в день, иначе отписки. Background fetch (iOS) или WorkManager (Android) для тихого обновления ленты.
Процесс работы
Определение источников данных и частоты обновления. Серверная агрегация с дедупликацией и AI-суммаризацией. Мобильный клиент: лента, фильтры, детальный экран. Интеграция котировок. Push-уведомления по темам. Персонализация watchlist. Тестирование производительности при большом объёме новостей.
Ориентиры по срокам
Базовый агрегатор с несколькими источниками и фильтрами — 4–6 недель. Полная система с AI-суммаризацией, sentiment, персонализацией и push-уведомлениями — 10–16 недель.







