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);
        }
Example #2
0
        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);
        }