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); } } }
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 }