static int MakeRequest(APIAirlineSearch filters, string TravelHost, string Key) { int RequestsNumbers = 0; bool result = false; try { int MaxRequestAttempts = FlightsEngine.Models.Constants.Constants.MaxRequestAttempts; int MaxDaysNumberForSearch = 35; int AttemptsNumber = 1; String OriginalSearchType = "OVERALL"; String SearchType = OriginalSearchType; bool endOfPreSearch = false; DateTime originalFromDateMin = filters.FromDateMin; DateTime originalToDateMax = (filters.ToDateMax ?? filters.FromDateMax); DateTime FromDateMin = originalFromDateMin; DateTime ToDateMax = originalToDateMax; if ((originalToDateMax - originalFromDateMin).TotalDays > MaxDaysNumberForSearch) { ToDateMax = FromDateMin.AddDays(MaxDaysNumberForSearch); } var context = new TemplateEntities1(); SearchTripProviderService _searchTripProviderService = new SearchTripProviderService(context); int SearchTripProviderId = -1; if (TravelHost == AIRFranceKLMTravelHost.AF) { SearchTripProviderId = _searchTripProviderService.GetSearchTripProviderId(originalFromDateMin, originalToDateMax, filters.SearchTripWishesId, Providers.AirFrance); } else { SearchTripProviderId = _searchTripProviderService.GetSearchTripProviderId(originalFromDateMin, originalToDateMax, filters.SearchTripWishesId, Providers.KLM); } List <TripItem> Trips = new List <TripItem>(); bool NeedToContinueSearch = true; while (ToDateMax <= originalToDateMax && NeedToContinueSearch) { AttemptsNumber = 1; result = false; SearchType = OriginalSearchType; while (!result && AttemptsNumber <= MaxRequestAttempts && NeedToContinueSearch) { try { AttemptsNumber = AttemptsNumber + 1; string url = "https://api.klm.com/opendata/flightoffers/v3/lowest-fare-offers?expand-suggested-flights=true&type=" + SearchType; var httpWebRequest = (HttpWebRequest)WebRequest.Create(url); httpWebRequest.ContentType = "application/json"; httpWebRequest.Method = "POST"; httpWebRequest.Headers.Add("Accept-Language", "en-US"); httpWebRequest.Headers.Add("AFKL-TRAVEL-Host", TravelHost); httpWebRequest.Headers.Add("Api-Key", Key); using (var streamWriter = new StreamWriter(httpWebRequest.GetRequestStream())) { RequestBody body = new RequestBody(); body.passengerCount.ADT = filters.AdultsNumber; body.passengerCount.CHD = filters.ChildrenNumber; body.passengerCount.INF = filters.BabiesNumber; connection connection = new connection(); connection.dateInterval = FromDateMin.ToString("yyyy-MM-dd") + "/" + ToDateMax.ToString("yyyy-MM-dd"); //filters.FromDate.Value.ToString("yyyy-MM-dd"); connection.minDaysOfStay = filters.DurationMin; connection.minDaysOfStay = filters.DurationMax; if (!String.IsNullOrWhiteSpace(filters.FromAirportCode)) { connection.origin.airport.code = filters.FromAirportCode; } if (!String.IsNullOrWhiteSpace(filters.ToAirportCode)) { connection.destination.airport.code = filters.ToAirportCode; } body.requestedConnections.Add(connection); if (filters.Return) { connection returnFlight = new connection(); if (!String.IsNullOrWhiteSpace(filters.FromAirportCode)) { returnFlight.destination.airport.code = filters.FromAirportCode; } if (!String.IsNullOrWhiteSpace(filters.ToAirportCode)) { returnFlight.origin.airport.code = filters.ToAirportCode; } body.requestedConnections.Add(returnFlight); } string json = new JavaScriptSerializer().Serialize(body); streamWriter.Write(json); streamWriter.Flush(); streamWriter.Close(); } HttpWebResponse httpResponse = null; try { RequestsNumbers++; httpResponse = (HttpWebResponse)httpWebRequest.GetResponse(); result = true; } catch (WebException e) { result = false; string webError = FlightsEngine.Utils.Logger.GenerateWebError(e, System.Reflection.MethodBase.GetCurrentMethod().DeclaringType, filters.ToSpecialString()); if (webError.ToUpper().Contains("UNSPECIFIED/TIME_OUT") && MaxDaysNumberForSearch > 10) { MaxDaysNumberForSearch = MaxDaysNumberForSearch - 5; ToDateMax = FromDateMin.AddDays(MaxDaysNumberForSearch); endOfPreSearch = false; } else if (webError.ToLower().Contains("requestedconnections[0].destination.airport.code")) { NeedToContinueSearch = false; endOfPreSearch = true; } else { SearchType = "OVERALL"; MaxDaysNumberForSearch = MaxDaysNumberForSearch - 5; ToDateMax = FromDateMin.AddDays(MaxDaysNumberForSearch); endOfPreSearch = false; } } if (result) { endOfPreSearch = true; using (var streamReader = new StreamReader(httpResponse.GetResponseStream())) { var requestResult = streamReader.ReadToEnd(); if (!String.IsNullOrWhiteSpace(requestResult)) { AirFranceKLMResponse ResultItem = JsonConvert.DeserializeObject <AirFranceKLMResponse>(requestResult); if (ResultItem != null && ResultItem.itineraries != null) { foreach (Itinerary itinerary in ResultItem.itineraries) { bool AddTrip = true; TripItem Trip = new TripItem(); Trip.SearchTripProviderId = SearchTripProviderId; Trip.Comment = AIRFranceKLMTravelHost.ToString(TravelHost); bool returnTrip = false; if (TravelHost == AIRFranceKLMTravelHost.AF) { Trip.Url = "https://www.airfrance.com"; Trip.ProviderId = Providers.AirFrance; } else { Trip.Url = "https://www.klm.com"; Trip.ProviderId = Providers.KLM; } foreach (var connexion in itinerary.connections) { string stopInfo = ""; string flightNumber = ""; string airlineCode = ""; int stopNumber = 0; DateTime DepartureDate = new DateTime(); DateTime LastDepartureDate = DepartureDate; foreach (var stop in connexion.segments) { stopNumber++; flightNumber = flightNumber + stop.marketingFlight.number + FlightsEngine.Models.Constants.Constants.Separator; if (String.IsNullOrWhiteSpace(airlineCode)) { airlineCode = stop.marketingFlight.carrier.code; } else if (airlineCode != stop.marketingFlight.carrier.code) { airlineCode = "SEVERAL"; } if (stopNumber > 1) { stopInfo = stopInfo + stop.origin.city.name + " (" + stop.origin.code + ")" + FlightsEngine.Models.Constants.Constants.Separator; } else { DepartureDate = Convert.ToDateTime(stop.departureDateTime); } LastDepartureDate = Convert.ToDateTime(stop.departureDateTime); } if (!String.IsNullOrWhiteSpace(stopInfo)) { stopInfo = stopInfo.Substring(0, stopInfo.Length - 3); } else { stopInfo = null; } if (!String.IsNullOrWhiteSpace(flightNumber)) { flightNumber = flightNumber.Substring(0, flightNumber.Length - 3); } else { flightNumber = null; } if (!returnTrip) { Trip.OneWayTrip_Stops = connexion.segments.Count - 1; Trip.OneWayTrip_FromAirportCode = connexion.origin.airport.code; Trip.OneWayTrip_ToAirportCode = connexion.destination.airport.code; Trip.OneWayTrip_StopInformation = stopInfo; Trip.OneWayTrip_AirlineName = airlineCode; Trip.OneWayTrip_FlightNumber = flightNumber; Trip.OneWayTrip_DepartureDate = DepartureDate.ToString(DateFormat.Trip).Replace("-", "/"); Trip.OneWayTrip_ArrivalDate = LastDepartureDate.ToString(DateFormat.Trip).Replace("-", "/"); Trip.OneWayTrip_Duration = -1; } else { Trip.ReturnTrip_Stops = connexion.segments.Count - 1; Trip.ReturnTrip_FromAirportCode = connexion.origin.airport.code; Trip.ReturnTrip_ToAirportCode = connexion.destination.airport.code; Trip.ReturnTrip_StopInformation = stopInfo; Trip.ReturnTrip_FlightNumber = flightNumber; Trip.ReturnTrip_AirlineName = airlineCode; Trip.ReturnTrip_DepartureDate = DepartureDate.ToString(DateFormat.Trip).Replace("-", "/"); Trip.ReturnTrip_ArrivalDate = LastDepartureDate.ToString(DateFormat.Trip).Replace("-", "/"); Trip.ReturnTrip_Duration = -1; } returnTrip = true; } Trip.Price = Convert.ToDecimal(itinerary.flightProducts[0].price.totalPrice); Trip.CurrencyCode = itinerary.flightProducts[0].price.currency; AddTrip = Trip.OneWayTrip_Stops <= filters.MaxStopsNumber && (Trip.ReturnTrip_Stops == null || Trip.ReturnTrip_Stops.Value <= filters.MaxStopsNumber); if (AddTrip) { Trips.Add(Trip); NeedToContinueSearch = false; } } } } } FromDateMin = FromDateMin.AddDays(MaxDaysNumberForSearch); if (ToDateMax == originalToDateMax) { ToDateMax = ToDateMax.AddDays(1); } else if (ToDateMax.AddDays(MaxDaysNumberForSearch) > originalToDateMax) { ToDateMax = originalToDateMax; } else { ToDateMax = FromDateMin.AddDays(MaxDaysNumberForSearch); } } System.Threading.Thread.Sleep(200); } catch (Exception ex) { result = false; FlightsEngine.Utils.Logger.GenerateError(ex, System.Reflection.MethodBase.GetCurrentMethod().DeclaringType, "MakeRequest LOOP ERROR :" + filters.ToSpecialString() + " and Provider = " + TravelHost + " and Key = " + Key); } } } TripsService _tripService = new TripsService(context); _tripService.InsertTrips(Trips); if (endOfPreSearch) { SearchTripWishesService _searchTripWishesService = new SearchTripWishesService(context); _searchTripWishesService.DisableSearchTripWishes(filters.SearchTripWishesId); } } catch (Exception e) { result = false; FlightsEngine.Utils.Logger.GenerateError(e, System.Reflection.MethodBase.GetCurrentMethod().DeclaringType, "MakeRequest ERROR :" + filters.ToSpecialString() + " and Provider = " + TravelHost + " and Key = " + Key); } return(RequestsNumbers); }
public static bool SearchFlights(int?SearchTripWishesId, string ScrappingFolder, string FirefoxExeFolder, int?ProviderId = null) { bool result = false; try { var context = new TemplateEntities1(); SearchTripWishesService _searchTripWishesService = new SearchTripWishesService(context); SearchTripProviderService _searchTripProviderService = new SearchTripProviderService(context); TripsService _tripService = new TripsService(context); List <ProxyItem> Proxies = null; string lastSuccessfullProxy = null; List <SearchTripWishesItem> SearchTripWishesItems = _searchTripWishesService.GetSearchTripWishesById(SearchTripWishesId, ProviderId); foreach (var SearchTripWishesItem in SearchTripWishesItems) { if (SearchTripWishesItem != null && SearchTripWishesItem._SearchTripWishes != null) { var SearchTripWishes = SearchTripWishesItem._SearchTripWishes; #region api APIAirlineSearch APIAirlineSearchItem = new APIAirlineSearch(); APIAirlineSearchItem.SearchTripWishesId = SearchTripWishes.Id; if (SearchTripWishes.FromAirport != null) { APIAirlineSearchItem.FromAirportCode = SearchTripWishes.FromAirport.Code; } APIAirlineSearchItem.FromDateMax = SearchTripWishes.FromDateMax; APIAirlineSearchItem.FromDateMin = SearchTripWishes.FromDateMin; if (SearchTripWishes.ToAirport != null) { APIAirlineSearchItem.ToAirportCode = SearchTripWishes.ToAirport.Code; } if (SearchTripWishes.ToDateMin != null) { APIAirlineSearchItem.Return = true; APIAirlineSearchItem.ToDateMin = SearchTripWishes.ToDateMin; APIAirlineSearchItem.ToDateMax = SearchTripWishes.ToDateMax; } APIAirlineSearchItem.AdultsNumber = 1; APIAirlineSearchItem.MaxStopsNumber = SearchTripWishes.MaxStopNumber; APIAirlineSearchItem.DurationMin = SearchTripWishes.DurationMin; APIAirlineSearchItem.DurationMax = SearchTripWishes.DurationMax; APIAirlineSearchItem.MaxStopsNumber = SearchTripWishes.MaxStopNumber; List <APIKey> AFKLMKeys = FlightsEngine.FlighsAPI.AirFranceKLM.GetAPIKeys(); if (SearchTripWishesItem.ProvidersToSearch.Select(p => p.Id).Contains(Providers.Kiwi)) { Kiwi.SearchFlights(APIAirlineSearchItem); } if (SearchTripWishesItem.ProvidersToSearch.Select(p => p.Id).Contains(Providers.AirFrance)) { APIKey KeyToUse = AFKLMKeys.Where(k => k.RequestsNumber < 5000).OrderBy(k => k.RequestsNumber).FirstOrDefault(); if (KeyToUse != null) { AFKLMKeys.Where(k => k.Key == KeyToUse.Key).FirstOrDefault().RequestsNumber = KeyToUse.RequestsNumber + FlightsEngine.FlighsAPI.AirFranceKLM.SearchFlights(APIAirlineSearchItem, Providers.AirFrance, KeyToUse.Key); } } if (SearchTripWishesItem.ProvidersToSearch.Select(p => p.Id).Contains(Providers.KLM)) { APIKey KeyToUse = AFKLMKeys.Where(k => k.RequestsNumber < 5000).OrderBy(k => k.RequestsNumber).FirstOrDefault(); if (KeyToUse != null) { AFKLMKeys.Where(k => k.Key == KeyToUse.Key).FirstOrDefault().RequestsNumber = KeyToUse.RequestsNumber + FlightsEngine.FlighsAPI.AirFranceKLM.SearchFlights(APIAirlineSearchItem, Providers.KLM, KeyToUse.Key); } } if (SearchTripWishesItem.ProvidersToSearch.Select(p => p.Id).Contains(Providers.Transavia)) { FlightsEngine.FlighsAPI.Transavia.SearchFlights(APIAirlineSearchItem); } if (SearchTripWishesItem.ProvidersToSearch.Select(p => p.Id).Contains(Providers.TurkishAirlines)) { FlightsEngine.FlighsAPI.TurkishAirlines.SearchFlights(APIAirlineSearchItem); } if (SearchTripWishesItem.ProvidersToSearch.Select(p => p.Id).Contains(Providers.RyanAir)) { FlightsEngine.FlighsAPI.RyanAir.SearchFlights(APIAirlineSearchItem); } #endregion kiwi result = true; bool newProxy = true; foreach (var searchTrip in SearchTripWishes.SearchTrips) { try { AirlineSearch filter = new AirlineSearch(); if (SearchTripWishes.FromAirport != null) { filter.FromAirportCode = SearchTripWishes.FromAirport.Code; } filter.FromDate = searchTrip.FromDate; if (SearchTripWishes.ToAirport != null) { filter.ToAirportCode = SearchTripWishes.ToAirport.Code; } if (searchTrip.ToDate != null) { filter.Return = true; filter.ToDate = searchTrip.ToDate.Value; } filter.AdultsNumber = 1; filter.MaxStopsNumber = SearchTripWishes.MaxStopNumber; foreach (var provider in SearchTripWishesItem.ProvidersToSearch) { if (!provider.HasAPI) { string Proxy = lastSuccessfullProxy; if (String.IsNullOrWhiteSpace(Proxy)) { if (Proxies == null) { Proxies = ProxyHelper.GetProxies(); } Proxy = ProxyHelper.GetBestProxy(Proxies); if (Proxy == null) { Proxies = ProxyHelper.GetProxies(); Proxy = ProxyHelper.GetBestProxy(Proxies); } newProxy = true; } ScrappingSearch scrappingSearch = new ScrappingSearch(); if (provider.Id == Providers.Edreams) { scrappingSearch.Url = ScrappingHelper.GetEdreamsUrl(filter); } else if (provider.Id == Providers.Kayak) { scrappingSearch.Url = ScrappingHelper.GetKayakUrl(filter); } int SearchTripProviderId = _searchTripProviderService.InsertSearchTripProvider(provider.Id, searchTrip.Id, Proxy, scrappingSearch.Url); if (!String.IsNullOrWhiteSpace(scrappingSearch.Url) && SearchTripProviderId > 0) { scrappingSearch.Proxy = Proxy; scrappingSearch.FirefoxExeFolder = FirefoxExeFolder; scrappingSearch.ScrappingFolder = ScrappingFolder; scrappingSearch.NewProxy = newProxy; if (SearchTripProviderId > 0 && !String.IsNullOrWhiteSpace(Proxy)) { filter.SearchTripProviderId = SearchTripProviderId; scrappingSearch.Provider = provider.Name; scrappingSearch.ProxiesList = Proxies; var ScrappingResult = ScrappingHelper.SearchViaScrapping(scrappingSearch, filter.SearchTripProviderId); Proxies = ScrappingResult.ProxiesList; _searchTripProviderService.SetSearchTripProviderAsEnded(SearchTripProviderId, ScrappingResult.Success, ScrappingResult.LastProxy, ScrappingResult.AttemptsNumber); result = result && ScrappingResult.Success; if (ScrappingResult.Success) { lastSuccessfullProxy = ScrappingResult.LastProxy; _tripService.InsertTrips(SearchTripProviderId); newProxy = false; //Task.Factory.StartNew(() => { _tripService.InsertTrips(SearchTripProviderId); }); } else { lastSuccessfullProxy = null; } } else { result = false; } } else { FlightsEngine.Utils.Logger.GenerateInfo("No url for SearchTripProviderId : " + SearchTripProviderId + " and provider = " + provider.Name); } } else { if (provider.Id == Providers.Transavia) { // FlightsEngine.FlighsAPI.Transavia.SearchFlights(filter); } int SearchTripProviderId = _searchTripProviderService.InsertSearchTripProvider(provider.Id, searchTrip.Id, null, null); filter.SearchTripProviderId = SearchTripProviderId; } } // Task.Factory.StartNew(() => FlighsBot.PythonHelper.Run(filter, scrappingSearch)); // Console.WriteLine("Pythonresult = "+ Pythonresult.Success+" and Error = "+ (Pythonresult.Error??"")); // FlighsBot.Kayak.SearchFlights(filter); // FlighsBot.Kayak.SearchFlights(filter); // FlightsEngine.FlighsAPI.AirFranceKLM.SearchFlights(filter); // FlightsEngine.FlighsAPI.AirHob.SearchFlights(filter); // FlightsEngine.FlighsAPI.Kiwi.SearchFlights(filter); // FlightsEngine.FlighsAPI.RyanAir.SearchFlights(filter); // FlightsEngine.FlighsAPI.Transavia.SearchFlights(filter); } catch (Exception e2) { result = false; FlightsEngine.Utils.Logger.GenerateError(e2, System.Reflection.MethodBase.GetCurrentMethod().DeclaringType, "searchTrip.Id = " + searchTrip.Id); } } } } } catch (Exception e) { result = false; FlightsEngine.Utils.Logger.GenerateError(e, System.Reflection.MethodBase.GetCurrentMethod().DeclaringType, "SearchTripWishesId = " + (SearchTripWishesId ?? -1) + " and ScrappingFolder = " + ScrappingFolder + " and FirefoxExeFolder = " + FirefoxExeFolder); } return(result); }