示例#1
0
        private void KapchaBrowser_OnLoadCompleted(object sender, NavigationEventArgs e)
        {
            KapchaBrowser.InvokeScript("execScript", "document.body.style.overflow ='hidden'", "JavaScript");
            CopyBrowserImageToClipboard();
            LoadCopiedImageIntoImageControl();
            void CopyBrowserImageToClipboard()
            {
                //https://stackoverflow.com/questions/2566898/save-images-in-webbrowser-control-without-redownloading-them-from-the-internet
                var doc      = (HTMLDocument)KapchaBrowser.Document;
                var imgRange = (IHTMLControlRange)((HTMLBody)doc.body).createControlRange();

                foreach (IHTMLImgElement img in doc.images)
                {
                    imgRange.add((IHTMLControlElement)img);
                    imgRange.execCommand("Copy", false, null);
                }
            }

            void LoadCopiedImageIntoImageControl()
            {
                //https://stackoverflow.com/questions/25749843/wpf-image-source-clipboard-getimage-is-not-displayed
                if (!Clipboard.ContainsImage())
                {
                    return;
                }
                var clipboardData = System.Windows.Forms.Clipboard.GetDataObject();

                if (clipboardData == null)
                {
                    return;
                }
                if (!clipboardData.GetDataPresent(System.Windows.Forms.DataFormats.Bitmap))
                {
                    return;
                }
                var bitmap  = (Bitmap)clipboardData.GetData(System.Windows.Forms.DataFormats.Bitmap);
                var hBitmap = bitmap.GetHbitmap();

                try {
                    KapchaImage.Source = System.Windows.Interop.Imaging.CreateBitmapSourceFromHBitmap(hBitmap,
                                                                                                      IntPtr.Zero, Int32Rect.Empty, BitmapSizeOptions.FromEmptyOptions());
                }
                finally {
                    DeleteObject(hBitmap);
                }
            }
        }
示例#2
0
        private async void Browser_OnLoadCompleted(object sender, NavigationEventArgs e)
        {
            KapchaBrowser.Navigate(_urlProvider.KaptchaUrl);
            ResetButton.IsEnabled = true;
            string currentUrl = Browser.Source.ToString();

            if (currentUrl == _urlProvider.EndUrl)
            {
                return;
            }
            if (currentUrl.Contains(_urlProvider.TestServerUrl))
            {
                ExtractData();
            }
            else if (_urlProvider.IsLoginFailed(currentUrl))
            {
                DisplayLoginFailedMessage();
            }
            else if (_urlProvider.IsAtLoginPage(currentUrl))
            {
                AssertLoginPageIsLoadedProperly();
            }
            else if (!currentUrl.Contains(_urlProvider.CourseTimetablePreviewUrl))
            {
                NavigateToCourseTimeTablePreview();
            }
            else if (currentUrl.Contains(_urlProvider.CourseTimetablePreviewUrl))
            {
                ExtractData();
            }

            #region NestedFunctions

            void AssertLoginPageIsLoadedProperly()
            {
                string html = GetHtml(Browser);

                if (!html.Contains("Course Registration System"))
                {
                    Browser.Navigate(_urlProvider.LoginPageUrl);
                }
            }

            void DisplayLoginFailedMessage()
            {
                Global.Snackbar.MessageQueue.Enqueue(
                    "Login failed. Please make sure you entered the correct information.");
                NavigationService.Refresh();
                CaptchaBox.Text  = "";
                _navigationCount = 0;
            }

            void NavigateToCourseTimeTablePreview()
            {
                Global.CurrentUser = new UserInfo(_studentIdInput, _passwordInput);
                new UserInfoManager().SaveData(Global.CurrentUser);
                _currentPage = 1;
                if (_browsingToCourseTimetablePreview)
                {
                    return;
                }
                if (_navigationCount < NavigationCountUpperLimit)
                {
                    Browser.Navigate(_urlProvider.CourseTimetablePreviewUrl);
                    _navigationCount++;
                }
                else
                {
                    Browser.Navigate(_urlProvider.LoginPageUrl);
                    CaptchaBox.Text = "";
                    ResetButton_OnClick(null, null);
                    Global.Snackbar.MessageQueue.Enqueue($"No record found.");
                    TryLoadAutoSavedData();
                }
            }

            async void ExtractData()
            {
                string html = GetHtml(Browser);

                DisplayLoadingBar(true);
                await Task.Run(() => {
                    if (Global.Toggles.SaveLoadedHtmlToggle.IsToggledOn)
                    {
                        SaveToFile(html);
                    }
                    Global.InputSlotList.AddRange(new HtmlSlotParser().Parse(html));
                    Global.LoadedHtml += html;
                    TryGetStartDateAndEndDate(html);
                });

                if (CanGoToPage(_currentPage + 1))
                {
                    Browser.InvokeScript("changePage", _currentPage + 1);
                    _currentPage++;
                }
                else
                {
                    DisplayLoadingBar(false);
                    if (Global.InputSlotList.Count == 0)
                    {
                        DialogBox.Show("No data available.", "", "OK");
                        ResetButton_OnClick(null, null);
                        return;
                    }
                    Browser.Navigate(_urlProvider.EndUrl);
                    new UserSlotManager().SaveSlotDataAsync(Global.CurrentUser.UserId, Global.LoadedHtml);
                    NavigationService.Navigate(
                        Page_CreateTimetable.GetInstance(Global.Settings.SearchByConsideringWeekNumber,
                                                         Global.Settings.GeneralizeSlot));
                }

                #region NestedFunctions

                bool CanGoToPage(int pageNumber)
                {
                    dynamic doc      = Browser.Document;
                    string  htmlText = doc.documentElement.InnerHtml;

                    return(htmlText.Contains($"javascript:changePage(\'{pageNumber}\')"));
                }

                void TryGetStartDateAndEndDate(string input)
                {
                    try {
                        var parser = new StartDateEndDateFinder(input);
                        Global.TimetableStartDate = parser.GetStartDate();
                        Global.TimetableEndDate   = parser.GetEndDate();
                    }
                    catch { }
                }

                #endregion
            }

            #endregion
        }