private static List <PolaczenieLotnicze> Szukaj2(DaneWyszukiwania dane)
        {
            List <List <PolaczenieLotnicze> > pp = new List <List <PolaczenieLotnicze> >();
            int max = -1;
            int ix  = -1;

            for (int i = 0; i < 5; i++)
            {
                var a = SzukajNatalia(dane.Klonuj());
                pp.Add(a);
            }

            for (int i = 0; i < pp.Count; i++)
            {
                if (pp[i].Count > max)
                {
                    max = pp[i].Count;
                    ix  = i;
                }
            }

            if (ix != -1)
            {
                return(pp[ix]);
            }

            return(null);
        }
        private static List <PolaczenieLotnicze> SzukajNatalia(DaneWyszukiwania dane)
        {
            var HAPparser = new WebsiteDataService();

            List <PolaczenieLotnicze> pol = new List <PolaczenieLotnicze>();
            List <Flight>             lista;

            try {
                lista = HAPparser.Kayak_go(dane);
            } catch (Exception) {
                return(pol);
            }

            var en = lista.GetEnumerator();

            while (en.MoveNext())
            {
                try {
                    PolaczenieLotnicze pp = Konwerter.KonwertujFlight(en.Current, dane);
                    pp.Zrodlo = Lotniska.NazwaLotniska(pp.Zrodlo);
                    pp.Cel    = Lotniska.NazwaLotniska(pp.Cel);
                    pol.Add(pp);
                } catch { }
            }

            return(pol);
        }
Ejemplo n.º 3
0
        public static PolaczenieLotnicze KonwertujFlight(Flight flight, DaneWyszukiwania data)
        {
            PolaczenieLotnicze p = new PolaczenieLotnicze();
            var time             = Konwerter.KonwertujStringGodzMinNaTimeSpan(flight.Departure_time);

            p.Cel        = flight.Arrival_city;
            p.Cena       = Konwerter.KonwertujCeneNaDouble(flight.Cena);
            p.Czas       = Konwerter.KonwertujStringCzasLotuNaTimeSpan(flight.Czas);
            p.DataWylotu = new DateTime(data.Data.Year, data.Data.Month, data.Data.Day,
                                        time.Hours, time.Minutes, time.Seconds);
            p.Link       = flight.Link;
            p.Przewoznik = flight.Carrier;
            p.Zrodlo     = flight.Departure_city;
            return(p);
        }
        public DaneWyszukiwania Klonuj()
        {
            DaneWyszukiwania dw = new DaneWyszukiwania();

            dw.Zrodlo = string.Copy(Zrodlo);
            dw.Cel    = string.Copy(Cel);
            dw.Data   = Data;

            dw.PrzewTak = new string[PrzewTak.Length];
            for (int i = 0; i < PrzewTak.Length; i++)
            {
                dw.PrzewTak[i] = string.Copy(PrzewTak[i]);
            }

            dw.PrzewNie = new string[PrzewNie.Length];
            for (int i = 0; i < PrzewNie.Length; i++)
            {
                dw.PrzewNie[i] = string.Copy(PrzewNie[i]);
            }

            dw.Osoby        = Osoby.Klonuj();
            dw.Bezposrednie = Bezposrednie;
            return(dw);
        }
        public static string Bulid(DaneWyszukiwania data)
        {
            var html = @"https://www.kayak.pl/flights/" + data.Zrodlo + "-" + data.Cel + "/"
                       + data.Data.Year + "-";

            if (data.Data.Month < 10)
            {
                html += "0";
            }
            html += data.Data.Month + "-";

            if (data.Data.Day < 10)
            {
                html += "0";
            }
            html += data.Data.Day + "/";
            //var html = @"https://www.kayak.pl/flights/WRO-STN/2018-12-13/1adults/children-17-17?sort=price_a&fs=airlines=-AF;stops=0";
            if (data.Osoby.Dorosli > 0)
            {
                html += data.Osoby.Dorosli + "adults";
            }

            if (data.Osoby.Mlodziez > 0 || data.Osoby.Niemowleta > 0 ||
                data.Osoby.Dzieci > 0)
            {
                html += "/children";
                if (data.Osoby.Niemowleta > 0)
                {
                    for (int i = 0; i < data.Osoby.Niemowleta; i++)
                    {
                        html += "-1S";
                    }
                }
                if (data.Osoby.Dzieci > 0)
                {
                    for (int i = 0; i < data.Osoby.Dzieci; i++)
                    {
                        html += "-11";
                    }
                }
                if (data.Osoby.Mlodziez > 0)
                {
                    for (int i = 0; i < data.Osoby.Mlodziez; i++)
                    {
                        html += "-17";
                    }
                }
            }
            html += "?sort=price_a";//sortowanie rosnaco po cenie
            bool is_special_features_added = false;
            var  shortcuts = Konwerter.KonwertujPrzewoznikowDoSkrotow(data.PrzewNie);

            for (int i = 0; i < shortcuts.Count; i++)
            {
                if (is_special_features_added == false)
                {
                    html += "&fs=airlines=-";
                    is_special_features_added = true;
                }
                if (i > 0)
                {
                    html += ",";
                }

                html += shortcuts[i];
            }

            if (data.Bezposrednie)
            {
                if (is_special_features_added)
                {
                    html += ";";
                }
                else
                {
                    html += "&fs=";
                    is_special_features_added = true;
                }

                html += "stops=0";
            }
            return(html);
        }
        private static List <PolaczenieLotnicze> SzukajPiotr(DaneWyszukiwania dane)
        {
            Process p;

            lock (sl) {
                if (kolejka.Count > 0)
                {
                    p = kolejka.Dequeue();
                }
                else
                {
                    p = UtworzProces();
                }
            }

            try {
                dane.Zrodlo = char.ToUpper(dane.Zrodlo[0]) + dane.Zrodlo.Substring(1);
                dane.Cel    = char.ToUpper(dane.Cel[0]) + dane.Cel.Substring(1);
            } catch { }

            p.StandardInput.WriteLine(dane.Zrodlo);
            p.StandardInput.WriteLine(dane.Cel);
            p.StandardInput.WriteLine(miesiace[dane.Data.Month]);
            p.StandardInput.WriteLine(dane.Data.Year);
            p.StandardInput.WriteLine(dane.Data.Day);

            p.StandardInput.WriteLine(dane.Osoby.Dorosli);
            p.StandardInput.WriteLine(dane.Osoby.Mlodziez);
            p.StandardInput.WriteLine(dane.Osoby.Dzieci);
            p.StandardInput.WriteLine(dane.Osoby.Niemowleta);


            List <PolaczenieLotnicze> pol = new List <PolaczenieLotnicze>();

            int ilosc = int.Parse(p.StandardOutput.ReadLine());

            for (int i = 0; i < ilosc; i++)
            {
                string[]           czas;
                PolaczenieLotnicze pp = new PolaczenieLotnicze();
                pp.Przewoznik   = p.StandardOutput.ReadLine();
                pp.Cena         = double.Parse(p.StandardOutput.ReadLine());
                pp.Zrodlo       = Lotniska.NazwaLotniska(p.StandardOutput.ReadLine());
                pp.Cel          = Lotniska.NazwaLotniska(p.StandardOutput.ReadLine());
                pp.DataWylotu   = dane.Data.Add(TimeSpan.Parse(p.StandardOutput.ReadLine()));
                pp.DataPrzylotu = dane.Data.Add(TimeSpan.Parse(p.StandardOutput.ReadLine()));
                czas            = p.StandardOutput.ReadLine().Split(' ');
                pp.Link         = p.StandardOutput.ReadLine();
                p.StandardOutput.ReadLine();    //kreski

                int poz;
                int godz = 0, min = 0;

                for (int j = 0; j < czas.Length; j++)
                {
                    poz = czas[j].IndexOf('h');
                    if (poz > 0)
                    {
                        godz = pobierzLiczbe(czas[j], poz);
                    }
                    else
                    {
                        poz = czas[j].IndexOf("min");
                        if (poz > 0)
                        {
                            min = pobierzLiczbe(czas[j], poz);
                        }
                    }
                }

                pp.Czas = new TimeSpan(godz, min, 0);

                if (pp.Zrodlo != "" && pp.Cel != "")
                {
                    pol.Add(pp);
                }
            }

            lock (sl) {
                kolejka.Enqueue(p);
            }

            return(pol);
        }
        public static WyszukanePolaczenia WyszukajPolaczenia(DaneWyszukiwania dane)
        {
            if (dane == null)
            {
                return(null);
            }
            if (!Lotniska.CzyIstnieje(dane.Zrodlo) || !Lotniska.CzyIstnieje(dane.Cel))
            {
                return(null);
            }
            if (dane.Zrodlo == null || dane.Cel == null || dane.Data <= DateTime.Now || dane.PrzewTak == null || dane.PrzewNie == null || dane.Osoby == null)
            {
                return(null);
            }
            if (dane.PrzewTak.Length == 0)
            {
                return(null);
            }

            if (dane.Osoby.Dorosli <= 0 || dane.Osoby.Mlodziez < 0 || dane.Osoby.Dzieci < 0 || dane.Osoby.Niemowleta < 0)
            {
                return(null);
            }
            int niepelnoletni = dane.Osoby.Dzieci + dane.Osoby.Mlodziez + dane.Osoby.Niemowleta;

            if (niepelnoletni + dane.Osoby.Dorosli > 9)
            {
                return(null);
            }
            if (dane.Osoby.Dorosli < niepelnoletni)
            {
                return(null);
            }

            List <PolaczenieLotnicze> pol = new List <PolaczenieLotnicze>();


            var Piotr   = Task.Run(() => SzukajPiotr(dane.Klonuj()));
            var Natalia = Task.Run(() => Szukaj2(dane.Klonuj()));

            Task.WaitAll(Piotr, Natalia);

            pol.AddRange(Piotr.Result);
            if (Natalia.Result != null)
            {
                pol.AddRange(Natalia.Result);
            }

            if (dane.PrzewTak.Contains("inni"))
            {
                dane.PrzewNie = (from d in dane.PrzewNie select d.ToLower()).ToArray();
                pol           = pol.Where(p => !dane.PrzewNie.Contains(p.Przewoznik.ToLower())).ToList();
            }
            else
            {
                dane.PrzewTak = (from d in dane.PrzewTak select d.ToLower()).ToArray();
                pol           = pol.Where(p => dane.PrzewTak.Contains(p.Przewoznik.ToLower())).ToList();
            }

            WyszukanePolaczenia wysz = new WyszukanePolaczenia();

            wysz.Polaczenia = pol.OrderBy(l => l.DataWylotu).ToArray();
            wysz.Zasoby     = Wydajnosc.PobierzZasoby();
            return(wysz);
        }
        public List <Flight> Kayak_go(DaneWyszukiwania data)
        {
            //try
            {
                var html = KayakUrlBuilder.Bulid(data);
                Console.WriteLine(html);

                HtmlWeb web = new HtmlWeb();
                web.UserAgent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.113 Safari/537.36";
                var doc = web.Load(html);

                var nodes_carriers = doc.DocumentNode.SelectNodes("//*[@class='section times']//*[@class='bottom']");
                var task_carriers  = Task.Run(() => get_list_of_strings_from_HtmlNodeCollection(nodes_carriers));

                var nodes_departure_times = doc.DocumentNode.SelectNodes("//*[@class='depart-time base-time']");
                var task_departure_times  = Task.Run(() => get_list_of_strings_from_HtmlNodeCollection(nodes_departure_times));

                var nodes_departure_cities = doc.DocumentNode.SelectNodes("//*[@class='section duration']//*[@class='bottom']/span[1]");
                var task_departure_cities  = Task.Run(() => get_list_of_strings_from_HtmlNodeCollection(nodes_departure_cities));

                var nodes_stops = doc.DocumentNode.SelectNodes("//*[@class='section stops']/div[1]");
                var task_stops  = Task.Run(() => get_list_of_strings_from_HtmlNodeCollection(nodes_stops));

                var nodes_arrival_times = doc.DocumentNode.SelectNodes("//*[@class='arrival-time base-time']");
                var task_arrival_times  = Task.Run(() => get_list_of_strings_from_HtmlNodeCollection(nodes_arrival_times));

                var nodes_arrival_cities = doc.DocumentNode.SelectNodes("//*[@class='section duration']//*[@class='bottom']/span[3]");
                var task_arrival_cities  = Task.Run(() => get_list_of_strings_from_HtmlNodeCollection(nodes_arrival_cities));

                var nodes_flight_times = doc.DocumentNode.SelectNodes("//*[@class='section duration']//*[@class='top']");
                var task_flight_times  = Task.Run(() => get_list_of_strings_from_HtmlNodeCollection(nodes_flight_times));

                var nodes_prices = doc.DocumentNode.SelectNodes("//*[@class='multibook-dropdown']//*[@class='price option-text']");
                var task_prices  = Task.Run(() => get_list_of_strings_from_HtmlNodeCollection(nodes_prices));

                var nodes_links = doc.DocumentNode.SelectNodes("//*[@class='col col-best']/div/div/a");
                var task_links  = Task.Run(() => get_list_of_strings_from_HtmlNodeCollection_kayak_url(nodes_links));

                var task_array = new Task <List <string> >[9]
                {
                    task_carriers,
                    task_departure_times, task_departure_cities,
                    task_stops,
                    task_arrival_times, task_arrival_cities,
                    task_flight_times, task_prices,
                    task_links
                };
                Task.WaitAll(task_array);

                var carriers         = task_carriers.Result;
                var departure_times  = task_departure_times.Result;
                var departure_cities = task_departure_cities.Result;
                var stops            = task_stops.Result;
                var arrival_times    = task_arrival_times.Result;
                var arrival_cities   = task_arrival_cities.Result;
                var flight_times     = task_flight_times.Result;
                var prices           = task_prices.Result;
                var links            = task_links.Result;

                List <Flight>             lst        = new List <Flight>();
                List <PolaczenieLotnicze> polaczenia = new List <PolaczenieLotnicze>();
                for (int i = 0; i < departure_times.Count; i++)
                {
                    var flight = new Flight();
                    flight.Carrier        = carriers[i];
                    flight.Departure_time = departure_times[i];
                    flight.Departure_city = departure_cities[i];
                    flight.Stops          = stops[i];
                    flight.Arrival_time   = arrival_times[i];
                    flight.Arrival_city   = arrival_cities[i];
                    flight.Czas           = flight_times[i];
                    flight.Cena           = prices[i];
                    flight.Link           = links[i];
                    lst.Add(flight);
                }
                return(lst);
            }/*
              * catch (Exception e)
              * {
              * Console.WriteLine("ERROR!");
              * Console.WriteLine(e.Message);
              * Console.WriteLine("END OF ERROR!");
              * return new List<Flight>();
              * }*/
        }