/// <summary> /// Точка входа в библиотеку. Отделяет полезные запросы от бесполезных и направляет каждый на свои парсеры /// </summary> /// <param name="page_type">Тип страницы: список матчей или страница кефа. Если страницы кефов нет - по умолчанию страница матчей</param> /// <param name="request_type">Тип запроса: обычный или фрейм WebSocket`а</param> /// <param name="request">Инфо с обычного запроса, либо NULL</param> /// <param name="wsFrame">Инфо о фрейме WebSocket`а, либо NULL</param> /// <returns>Вернуть распаршенную структуру Parsed или NULL, если запросу парсинг не требуется</returns> public Parsed Router(pageTypes page_type, requestTypes request_type, ref NormalRequest request, ref WebSocketRequest wsFrame) { // По request.request_url (если надо request_headers) направить на выполнение // Вернуть Parsed или null, если парсинг не нужен return(null); }
/// <summary> /// Отделяет полезные запросы от бесполезных и направляет каждый на свои парсеры /// </summary> /// <param name="page_type">Тип страницы: список матчей или страница кефа. Если страницы кефов нет - по умолчанию страница матчей</param> /// <param name="request_type">Тип запроса: обычный или фрейм WebSocket`а</param> /// <param name="request">Инфо с обычного запроса, либо NULL</param> /// <param name="wsFrame">Инфо о фрейме WebSocket`а, либо NULL</param> /// <returns>Вернуть распаршенную структуру Parsed или NULL, если запросу парсинг не требуется</returns> public Parsed Router(pageTypes page_type, requestTypes request_type, ref NormalRequest request, ref WebSocketRequest wsFrame) { // Выходная структура Parsed parsed = new Parsed { BookmakerID = BookmakerID }; // По request.request_url (если надо request_headers) направить на нужный парсер // Пример: получено xhr-обновление матчей if (page_type == pageTypes.MatchesList && request.request_url.Contains("/live_as.html?curs=0&curName=$")) { // Направляем на парсер списка матчей try { parsed.matches = Matches(request.response_data); } catch { sendException("Неизвестная ошибка парсинга", "Router", request.response_data); return(null); } // Отдаём распаршенную структуру с матчами return(parsed); } // Получена страница одного матча else if (page_type == pageTypes.OneMatch && request.request_url.Contains("/live_ar.html?hl=")) { // Направляем на парсер списка матчей try { parsed.matches = Matches(request.response_data); } catch { sendException("Неизвестная ошибка парсинга", "Router", request.response_data); return(null); } // Отдаём распаршенную структуру с одним матчем return(parsed); } // Вернуть null, если парсинг не нужен return(null); }
/// <summary> /// Запустить парсер нужной страницы, отправляя запросы вручную /// Предпочтение отдавать асинхронным запросам и использованию WebClientCookie /// </summary> /// <param name="page">Какую страницу парсить: список матчей или одного матча</param> /// <param name="urlMatches">Ссылка на страницу списка матчей, обязательно указывать даже если парсится страница матча</param> /// <param name="urlOneMatch">Ссылка на страницу конкретного матча, не нужно указывать, если парсится список матчей</param> /// <param name="speed_kef">Коэффициент ускорения отправки запросов</param> /// <param name="callback">Коллбек, который надо вызвать со структурой Parsed, которую вернёт роутер, если нужно</param> public async Task Start(pageTypes page, string urlMatches, string urlOneMatch, double speed_kef = 1, Action <Parsed> callback = null) { // Пример того как этой функции желательно выглядеть, можете даже просто подставить свои Fetch-запросы // WebClientCookie - расширенная версия вебклиента, которая сама хранит сессию, подставляет User-agent // и другие стандартные заголовки // использовать глобальный куки контейнер GlobalCookies для каждого нового экземпляра WebClientCookie WebClientCookie WC = new WebClientCookie(GlobalCookies); // Разогреть страницу и получить куки if (!await preloadPage(page, urlMatches, urlOneMatch, WC)) { sendException("Не удалось разогреть страницу"); return; } // ID матча из URL, если нужно string matchID = ""; // if(page== pageTypes.OneMatch) // matchID = urlOneMatch.Split(new string[] { "hl=" }, StringSplitOptions.None)[1]; // запустить цикл обновлений NormalRequest request = new NormalRequest(); WebSocketRequest noRequest = null; Parsed data = null; string response; while (true) { // Запускаем парсер страницы матчей if (page == pageTypes.MatchesList) { try { response = await WC.DownloadStringTaskAsync("https://www.parimatch.com/live_as.html?curs=0&curName=$&shed=0"); } catch { continue; } // Экземпляр запроса request = new NormalRequest { request_url = "https://www.parimatch.com/live_as.html?curs=0&curName=$&shed=0", response_data = response, //response_headers = WC.ResponseHeaders // только если нужно для парсинга }; // отправить NormalRequest в роутер data = Router(pageTypes.MatchesList, requestTypes.Normal, ref request, ref noRequest); // Вызывать коллбек с данными, если он есть [асинхронен в вызывающем коде] if (callback != null) { callback.Invoke(data); } Debugger.Break(); // Подождать стандартное для букмекера время обновления списка матчей await Task.Delay(TimeSpan.FromMilliseconds(speed_kef * 7500)); } // Страница одного матча [если для этого букмекера это применимо] else if (page == pageTypes.OneMatch) { // * Запросим данные try { response = await WC.DownloadStringTaskAsync("https://www.parimatch.com/live_ar.html?hl=" + matchID + "&hl=" + matchID + ",&curs=0&curName=$"); } catch { continue; } // Экземпляр запроса request = new NormalRequest { request_url = "https://www.parimatch.com/live_ar.html?hl=" + matchID + "&hl=" + matchID + ",&curs=0&curName=$", response_data = response, //response_headers = wc.response_headers // только если нужно для парсинга }; // отправить NormalRequest в роутер data = Router(pageTypes.OneMatch, requestTypes.Normal, ref request, ref noRequest); // Вызывать коллбек с данными, если он есть [асинхронен в вызывающем коде] if (callback != null) { callback.Invoke(data); } // Подождать стандартное для букмекера время обновления 1 страницы матча await Task.Delay(TimeSpan.FromMilliseconds(speed_kef * 7500)); } // Останавливаем поток, если нужно if (needStop) { return; } } }
public string zero(NormalRequest request) { return(null); }
public string zero(NormalRequest request) { return null; }
/// <summary> /// Точка входа в библиотеку. Отделяет полезные запросы от бесполезных и направляет каждый на свои парсеры /// </summary> /// <param name="page_type">Тип страницы: список матчей или страница кефа. Если страницы кефов нет - по умолчанию страница матчей</param> /// <param name="request_type">Тип запроса: обычный или фрейм WebSocket`а</param> /// <param name="request">Инфо с обычного запроса, либо NULL</param> /// <param name="wsFrame">Инфо о фрейме WebSocket`а, либо NULL</param> /// <returns>Вернуть распаршенную структуру Parsed или NULL, если запросу парсинг не требуется</returns> public Parsed Router(pageTypes page_type, requestTypes request_type, ref NormalRequest request, ref WebSocketRequest wsFrame) { return(new Parsed()); }