Ejemplo n.º 1
0
        private void DoWork()
        {
            int _checkCount = 0;

            while (_keepRunning)
            {
                int gapTime = 3 * 1000;

                if (int.TryParse(txtGapTime.Text, out gapTime) == false)
                {
                    gapTime = 3;
                }

                gapTime *= 1000;

                foreach (var data in _selectedList)
                {
                    // 스크래핑함
                    int    숙박일 = 1; // 1박
                    string 시작일 = new DateTime(data.Year, data.Month, data.Day).ToString("yyyyMMdd");
                    string 종료일 = new DateTime(data.Year, data.Month, data.Day).AddDays(숙박일).ToString("yyyyMMdd");

                    int[] 구역 = new int[] { 1 };
                    if (data.Site == SiteType.전체)
                    {
                        구역 = new int[] { 1, 2, 3, 4, 5 }
                    }
                    ;
                    else
                    {
                        구역 = new int[] { (int)data.Site }
                    };

                    foreach (var site in 구역)
                    {
                        string url  = string.Format(string.Format(@"https://gwgs.ticketplay.zone/portal/realtime/productSelect?room_area_no={0}&stay_cnt={1}&check_in={2}&check_out={3}", site, 숙박일, 시작일, 종료일));
                        string html = ScrapTest.Scrap.Scraping(url, ScrapTest.Method.GET, "UTF-8");

                        int day   = data.Day;
                        int month = data.Month;

                        string displayMessage = "송지호 : {1}월 {2}일 ({0}) --  {3}";

                        //송지호 오토캠핑장
                        string title = "송지호 오토캠핑장";
                        if (html.IndexOf(title) <= 0)
                        {
                            // 페이지 오류
                            DisplayTextBox(DateTime.Now.ToString("\r\n yyyy-MM-dd [HH:mm:ss] \t"));

                            string message = string.Format(displayMessage, Enum.GetName(typeof(SiteType), site), month, day, "조회중 오류가 발생하였습니다. !!!!!!!!!!!!!!!!!!!");
                            DisplayTextBox(message);
                        }
                        else
                        {
                            // 확인 텍스트
                            string searchText = "예약 가능한 사이트가 없습니다.";

                            if (html.IndexOf(searchText) <= 0)
                            {
                                DisplayTextBox(DateTime.Now.ToString("\r\n yyyy-MM-dd [HH:mm:ss] \t"));

                                string message = string.Format(displayMessage, Enum.GetName(typeof(SiteType), site), month, day, "예약가능함. ○○○○○○○○○○○○○○○○○○○○");
                                DisplayTextBox(message);

                                // 텔레그램
                                TelegramHelper.SendMessageByTelegramBot(string.Format("{0}- {1}", message, url));

                                //if (_reservationPossible < _showWebCount)
                                //{
                                //System.Diagnostics.Process.Start(url);

                                //ShowAlarmForm(url, message);
                                if (chkPassAlarm.Checked == false)
                                {
                                    if (MessageBox.Show(message, "확인", MessageBoxButtons.YesNo) == DialogResult.Yes)
                                    {
                                        // 바로가기
                                        System.Diagnostics.Process.Start(url);
                                    }
                                }
                                // Thread.Sleep(10000);
                                // }

                                _reservationPossible++;
                            }
                            else
                            {
                                DisplayTextBox(DateTime.Now.ToString("\r\n yyyy-MM-dd [HH:mm:ss] \t"));
                                DisplayTextBox(string.Format(displayMessage, Enum.GetName(typeof(SiteType), site), month, day, "예약완료. XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"));

                                _reservationPossible = 0;
                            }
                        }

                        _checkCount++;
                    }
                }

                if (_checkCount > 600)
                {
                    CrearDisplayText();
                    _checkCount = 0;
                }

                // 선택된 날짜 모두 확인후 대기후 시작
                Thread.Sleep(gapTime);
            }
        }

        void CrearDisplayText()
        {
            if (richTextBox1.InvokeRequired)
            {
                richTextBox1.BeginInvoke(new Action(() => richTextBox1.Clear()));
            }
            else
            {
                richTextBox1.Clear();
            }
        }

        void DisplayTextBox(string text)
        {
            if (richTextBox1.InvokeRequired)
            {
                richTextBox1.BeginInvoke(new Action(() => richTextBox1.Text          += text));
                richTextBox1.BeginInvoke(new Action(() => richTextBox1.SelectionStart = richTextBox1.Text.Length));
                richTextBox1.BeginInvoke(new Action(() => richTextBox1.ScrollToCaret()));
            }
            else
            {
                richTextBox1.Text          += text;
                richTextBox1.SelectionStart = richTextBox1.Text.Length;
                richTextBox1.ScrollToCaret();
            }
        }
Ejemplo n.º 2
0
        private void DoWork()
        {
            int _checkCount = 0;

            while (_keepRunning)
            {
                int gapTime = 3;

                if (int.TryParse(txtGapTime.Text, out gapTime) == false)
                {
                    gapTime = 3;
                }


                gapTime *= 1000;

                var monthList = _selectedList.GroupBy(x => new { x.Year, x.Month }).Select(x => new { x.Key.Year, x.Key.Month }).ToList();

                string title          = "솔향기캠핑장";
                string displayMessage = "솔향기캠핑장 : {1}월 {2}일 ({0}) --  {3}";
                string message        = string.Empty;

                foreach (var data in monthList)
                {
                    // 스크래핑함
                    string 검색월         = new DateTime(data.Year, data.Month, 1).ToString("yyyyMM");
                    string url         = string.Format(string.Format(@"https://camping.gtdc.or.kr/DZ_reservation/reserCamping.php?xch=reservation&xid=camping_reservation&searchDate={0}", 검색월));
                    string html        = ScrapTest.Scrap.Scraping(url, ScrapTest.Method.GET, "UTF-8");
                    string remainCount = string.Empty;

                    if (html.IndexOf(title) <= 0)
                    {
                        // 페이지 읽기 오류
                        // 페이지 오류
                        DisplayTextBox(DateTime.Now.ToString("\r\n yyyy-MM-dd [HH:mm:ss] \t"));

                        message = string.Format(" {0}년{1}월 - 조회중 오류가 발생하였습니다. !!!!!!!!!!!", data.Year, data.Month);
                        DisplayTextBox(message);

                        continue;
                    }

                    // 1. 날짜 찾기
                    // 2. 구역 찾기
                    var dayList = (from x in _selectedList
                                   where x.Year == data.Year && x.Month == data.Month
                                   group x by x.Day into grp
                                   orderby grp.Key
                                   select new SelectionSHG()
                    {
                        Year = data.Year,
                        Month = data.Month,
                        Day = grp.Key,
                    }
                                   ).ToList();

                    //foreach (var searchDatre in _selectedList.Where(x => x.Year == data.Year && x.Month == data.Month).OrderBy(x=> x.Day)
                    foreach (var searchDatre in dayList)
                    {
                        // 구분자
                        const string startBlockTag = "<TD style='padding:5px;'>";
                        const string dayTag1       = "<span class='fl b fs11pt txt-dark'>{0}</span>"; // 평일
                        const string dayTag2       = "<span class='fl b fs11pt txt-red'>{0}</span>";  // 주말/휴일

                        const string siteTag    = "mr5'></i>{0}";
                        const string siteEndTag = "</span>";  // 앞에 (숫자) 남은것 (0) 이 아니면 자리있음으로 확인하면됨

                        //
                        string temp = string.Empty;

                        // 날짜 블럭 시작부터로
                        html = html.Substring(html.IndexOf(startBlockTag));

                        // 날짜 찾기
                        if (html.IndexOf(string.Format(dayTag1, searchDatre.Day)) > 0)
                        {
                            html = html.Substring(html.IndexOf(string.Format(dayTag1, searchDatre.Day)));
                        }
                        else
                        {
                            html = html.Substring(html.IndexOf(string.Format(dayTag2, searchDatre.Day)));
                        }

                        // 해당 날짜 블럭 구하기
                        if (html.IndexOf(startBlockTag) > 0)
                        {
                            temp = html.Substring(0, html.IndexOf(startBlockTag));
                        }
                        else
                        {
                            temp = html;
                        }

                        // site 확인
                        var siteList = _selectedList.Where(x => x.Year == data.Year && x.Month == data.Month && x.Day == searchDatre.Day).Select(x => x.Site).ToList();

                        var sites = new string[] { "A", "B", "C", "D", "E" };

                        // 전체 없는경우
                        if (siteList.Any(x => x == SiteTypeSHG.전체) == false)
                        {
                            sites = siteList.OrderBy(x => x).Select(x => x.ToString()).ToArray();
                        }

                        foreach (var selectedSite in sites)
                        {
                            if (temp.IndexOf(string.Format(siteTag, selectedSite)) < 0)
                            {
                                message = string.Format(displayMessage, selectedSite, searchDatre.Month, searchDatre.Day, "조회오류 - 아직 예약전이거나, 해당사이트 정보를 찾을수 없습니다.");
                            }
                            else
                            {
                                temp = temp.Substring(temp.IndexOf(string.Format(siteTag, selectedSite)));

                                remainCount = temp.Substring(0, temp.IndexOf(siteEndTag));

                                remainCount = remainCount.Substring(remainCount.IndexOf("(") + 1, remainCount.IndexOf(")") - remainCount.IndexOf("(") - 1);

                                Console.WriteLine("{1}-{2} [{3}] remainCount : {0}", remainCount, searchDatre.Month, searchDatre.Day, selectedSite);

                                if ("0".Equals(remainCount) == true) // 만석
                                {
                                    message = string.Format(displayMessage, selectedSite, searchDatre.Month, searchDatre.Day, "예약완료. XXXXXXXXXXXXXXXXXXXXXXXXX");
                                }
                                else
                                {
                                    // 가능
                                    message = string.Format(displayMessage, selectedSite, searchDatre.Month, searchDatre.Day, "예약가능함. ○○○○○○○○○○○○○○○○");

                                    // 텔레그램
                                    TelegramHelper.SendMessageByTelegramBot(string.Format("{0}- {1}", message, url));

                                    if (chkShowForm.Checked)
                                    {
                                        //싸이트 점유하기
                                        OpenForm(url, string.Format("{0}:{1}", selectedSite, new DateTime(searchDatre.Year, searchDatre.Month, searchDatre.Day).ToString("yyyy-MM-dd")));
                                    }

                                    if (chkPassAlarm.Checked == false)
                                    {
                                        if (MessageBox.Show(message, "확인", MessageBoxButtons.YesNo) == DialogResult.Yes)
                                        {
                                            // 바로가기
                                            System.Diagnostics.Process.Start(url);
                                        }
                                    }
                                }
                            }

                            DisplayTextBox(DateTime.Now.ToString("\r\n yyyy-MM-dd [HH:mm:ss] \t"));
                            DisplayTextBox(message);
                        }


                        _checkCount++;
                    }
                }

                if (_checkCount > 600)
                {
                    CrearDisplayText();
                    _checkCount = 0;
                }

                // 선택된 날짜 모두 확인후 대기후 시작
                Thread.Sleep(gapTime);
            }
        }