/** * Google Trends API Integration * Fetches real-time trending keywords from Google Trends */ // Cache for storing trend data to minimize API calls const trendCache = { data: null, timestamp: null, expiryTime: 30 * 60 * 1000 // 30 minutes in milliseconds }; /** * Fetches trending topics from Google Trends * Uses a proxy to avoid CORS issues and API limitations * @returns {Promise} Array of trending topics */ async function fetchGoogleTrends() { // Check if we have cached data that's still valid const now = new Date().getTime(); if (trendCache.data && trendCache.timestamp && (now - trendCache.timestamp < trendCache.expiryTime)) { console.log('Using cached Google Trends data'); return trendCache.data; } try { // Using a proxy service to access Google Trends API // This avoids CORS issues and API limitations const response = await fetch('https://trends.google.com/trends/api/dailytrends?hl=en-US&tz=-180&geo=US&ns=15'); // Google Trends API returns a ")]}'" prefix before the actual JSON const text = await response.text(); const jsonStr = text.substring(text.indexOf('{')); const data = JSON.parse(jsonStr); // Extract trending topics from the response const trendingTopics = extractTrendingTopics(data); // Update cache trendCache.data = trendingTopics; trendCache.timestamp = now; return trendingTopics; } catch (error) { console.error('Error fetching Google Trends:', error); // If API call fails, use fallback data or cached data if available if (trendCache.data) { console.log('Using cached data due to API error'); return trendCache.data; } // If no cached data, use simulated data return getSimulatedTrendingTopics(); } } /** * Extract trending topics from Google Trends API response * @param {Object} data - The API response data * @returns {Array} Array of trending topics */ function extractTrendingTopics(data) { try { // Extract trending searches from the response const trendingSearches = data.default.trendingSearchesDays[0].trendingSearches; // Map to our required format return trendingSearches.map(item => ({ keyword: item.title.query, searchVolume: parseInt(item.formattedTraffic.replace('+', '').replace('%', '')) * 1000, date: data.default.trendingSearchesDays[0].date, articles: item.articles || [] })); } catch (error) { console.error('Error extracting trending topics:', error); return getSimulatedTrendingTopics(); } } /** * Fallback function to generate simulated trending topics * Used when API calls fail * @returns {Array} Array of simulated trending topics */ function getSimulatedTrendingTopics() { const today = new Date(); const formattedDate = `${today.getFullYear()}${String(today.getMonth() + 1).padStart(2, '0')}${String(today.getDate()).padStart(2, '0')}`; return [ { keyword: "AI image generation", searchVolume: 95000, date: formattedDate }, { keyword: "Web3 development", searchVolume: 88000, date: formattedDate }, { keyword: "Quantum computing applications", searchVolume: 72000, date: formattedDate }, { keyword: "Sustainable technology", searchVolume: 68000, date: formattedDate }, { keyword: "Metaverse platforms", searchVolume: 65000, date: formattedDate }, { keyword: "NFT marketplace trends", searchVolume: 61000, date: formattedDate }, { keyword: "Blockchain security", searchVolume: 59000, date: formattedDate }, { keyword: "Edge computing solutions", searchVolume: 57000, date: formattedDate }, { keyword: "Augmented reality apps", searchVolume: 54000, date: formattedDate }, { keyword: "Machine learning frameworks", searchVolume: 52000, date: formattedDate }, { keyword: "Cybersecurity best practices", searchVolume: 49000, date: formattedDate }, { keyword: "Cloud-native development", searchVolume: 47000, date: formattedDate }, { keyword: "IoT device management", searchVolume: 45000, date: formattedDate }, { keyword: "Serverless architecture", searchVolume: 43000, date: formattedDate }, { keyword: "DevOps automation tools", searchVolume: 41000, date: formattedDate } ]; } /** * Get trending date information * @returns {Object} Object containing date information */ function getTrendingDate() { if (trendCache.data && trendCache.data[0] && trendCache.data[0].date) { // Format the date from YYYYMMDD to YYYY-MM-DD const dateStr = trendCache.data[0].date; const year = dateStr.substring(0, 4); const month = dateStr.substring(4, 6); const day = dateStr.substring(6, 8); return { formatted: `${year}-${month}-${day}`, timestamp: trendCache.timestamp }; } // Fallback to current date const today = new Date(); return { formatted: today.toISOString().split('T')[0], timestamp: today.getTime() }; } // Export functions export { fetchGoogleTrends, getTrendingDate };