/** * WebShare Tasks - API integration */ import { getLogger } from '@stock-bot/logger'; import { type ProxyInfo } from '@stock-bot/http'; const logger = getLogger('webshare-tasks'); /** * Fetch proxies from WebShare API and convert to ProxyInfo format */ export async function fetchWebShareProxies(): Promise { try { // Get configuration from config system const { getConfig } = await import('@stock-bot/config'); const config = getConfig(); const apiKey = config.webshare?.apiKey; const apiUrl = config.webshare?.apiUrl; if (!apiKey || !apiUrl) { logger.error('Missing WebShare configuration', { hasApiKey: !!apiKey, hasApiUrl: !!apiUrl, }); return []; } logger.info('Fetching proxies from WebShare API', { apiUrl }); const response = await fetch(`${apiUrl}proxy/list/?mode=direct&page=1&page_size=100`, { method: 'GET', headers: { Authorization: `Token ${apiKey}`, 'Content-Type': 'application/json', }, }); if (!response.ok) { logger.error('WebShare API request failed', { status: response.status, statusText: response.statusText, }); return []; } const data = await response.json(); if (!data.results || !Array.isArray(data.results)) { logger.error('Invalid response format from WebShare API', { data }); return []; } // Transform proxy data to ProxyInfo format const proxies: ProxyInfo[] = data.results.map((proxy: { username: string; password: string; proxy_address: string; port: number; }) => ({ source: 'webshare', protocol: 'http' as const, host: proxy.proxy_address, port: proxy.port, username: proxy.username, password: proxy.password, isWorking: true, // WebShare provides working proxies firstSeen: new Date(), lastChecked: new Date(), })); logger.info('Successfully fetched proxies from WebShare', { count: proxies.length, total: data.count || proxies.length, }); return proxies; } catch (error) { logger.error('Failed to fetch proxies from WebShare', { error }); return []; } }