Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Text;
- using System.Threading.Tasks;
- using System.Threading;
- using System.Windows;
- using AngleSharp;
- using System.Net;
- namespace webBot9000
- {
- class GUI
- {
- public Application application;
- public MainGui maingui;
- public GUI()
- {
- //RUN GUI IN NEW THREAD
- Thread GuiThread = new Thread(InitializeGUI);
- //SET THE THREAD TO BE SPECIALLY FOR GUI
- GuiThread.SetApartmentState(ApartmentState.STA);
- //START THE THREAD
- GuiThread.Start();
- }
- public void InitializeGUI()
- {
- //CREATE THE USER-CONTROL CLASS, THAT WILL BE OUR GUI
- maingui = new MainGui();
- //CREATE NEW APPLICATION CLASS, THAT WILL RUN THE GUI WINDOWS
- application = new System.Windows.Application();
- //CREATE A NEW GUI WINDOW
- application.MainWindow = new System.Windows.Window();
- //SET SOME GUI WINDOW SETTINGS
- application.MainWindow.Height = 450;
- application.MainWindow.Width = 800;
- //THIS WILL ABORT ALL OF THE THREADS
- application.MainWindow.Closing += (x, e) => { Environment.Exit(0); };
- //SET OUR GUI WINDOW CONTENT TO OUR USER-CONTROL GUI CONTENT
- application.MainWindow.Content = maingui;
- //SHOW THE WINDOW
- application.MainWindow.Show();
- //RUN THE APPLICATION WHICH HANDLES THE RESPONSIVE GUI
- application.Run();
- }
- }
- class AngleSharp
- {
- //WE WILL STORE HERE ALL THE LINKS THAT WE CHECK
- public List<string> AllLinks;
- //THIS IS FOR ANGLE-SHARP CONFIGURATION
- IConfiguration config;
- IBrowsingContext context;
- //THIS WILL BE USED FOR DOWNLOADING THE HTML FROM LINKS
- WebClient client = new WebClient();
- public AngleSharp()
- {
- //CONFIGURE OUR HTML PARSER WHICH IS ANGLE-SHARP
- config = Configuration.Default.WithDefaultLoader();
- context = BrowsingContext.New(config);
- //CREATE LIST WHERE WE WILL STORE ALL LINKS
- AllLinks = new List<string>();
- }
- public async Task<List<string>> GetTheLinks(string url, string LookFor)
- {
- //LIST THAT WE WILL RETURN IF WE FIND ANY LINKS THAT CONTAINS THE SPECIFIED WORD
- List<string> FoundLinks = new List<string>();
- //TRY DOWNLOADING HTML, PARSING IT, SEARCHING IT, IT CRASHES OFTEN BECAUSE OF BAD LINKS
- try
- {
- //DOWNLOAD THE SPECIFIED URL
- string source = client.DownloadString(url);
- //PARSE THE DOWNLOADED HTML
- var HTML = await context.OpenAsync(req => req.Content(source));
- //SEARCH FOR LINKS
- var LinkList = HTML.GetElementsByTagName("a");
- //CONVERT LINKS TO STRINGS
- List<string> LinkList_Strings = LinkList.Select(item => item.GetAttribute("href")).ToList();
- //CHECK EVERY STRING
- foreach (string item in LinkList_Strings)
- {
- //IF THE STRING IS A VALID LINK
- if (Uri.TryCreate(item, UriKind.Absolute, out Uri uriResult) && (uriResult.Scheme == Uri.UriSchemeHttp || uriResult.Scheme == Uri.UriSchemeHttps))
- {
- //IF WE ALREADY HAVE THE STRING
- if (!AllLinks.Contains(item))
- {
- //IF IT IS, ADD IT TO THE LIST
- AllLinks.Add(item);
- //IF IT CONTAINS THE WORD, ADD IT TO FOUND-LINKS LIST TOO
- if (item.Contains(LookFor))
- FoundLinks.Add(item);
- }
- }
- }
- }
- catch (Exception)
- {
- //RETURN THE LIST IF IT CRASHES
- return FoundLinks;
- }
- //RETURN THE LIST IF IT DOESN'T CRASH
- return FoundLinks;
- }
- }
- class main
- {
- //CLASS FOR CREATING GUI
- static GUI gui;
- //CLASS FOR SEARCHING LINKS
- static AngleSharp anglesharp;
- //BOOL FOR STOPPING THE SEARCH FOR THE LINKS
- public static bool searching = false;
- static void Main()
- {
- //LOAD GUI
- gui = new GUI();
- //LOAD ENGINE
- anglesharp = new AngleSharp();
- }
- public static void ToggleLinkSearch(string looking_at, string looking_for)
- {
- //GET BUTTON STATUS
- string ButtonState = string.Empty;
- Application.Current.Dispatcher.Invoke(() =>
- {
- ButtonState = gui.maingui.SEARCH_BUTTON.Content.ToString();
- });
- //IF BUTTON STATUS IS SET TO SEARCH - BEGIN SEARCH
- if (ButtonState == "SEARCH")
- {
- //RESET EVERYTHING BACK TO ZERO
- Application.Current.Dispatcher.Invoke(() =>
- {
- //RESET GUI COUNTER
- gui.maingui.COUNT.Text = "0";
- //RESET GUI LIST
- gui.maingui.ViewList.Items.Clear();
- });
- //RESET INTERNAL LINK LIST
- anglesharp.AllLinks.Clear();
- //UPDATE SEARCH STATUS
- searching = true;
- //ADD FIRST PAGE FROM WHERE WE WILL START
- anglesharp.AllLinks.Add(looking_at);
- ////START NEW THREAD WITH INFINITE LOOP
- new Thread(async () => {
- //GRABS A LINK FROM THE LIST AND SEARCHES IT
- for (int i = 0; searching == true; i++)
- {
- //SEARCH LINK FROM LIST, FOR SPECIFIED WORD
- var FoundLinks = await anglesharp.GetTheLinks(anglesharp.AllLinks[i], looking_for);
- //UPDATE GUI
- Application.Current.Dispatcher.Invoke(() =>
- {
- //UPDATE THE COUNTER
- gui.maingui.COUNT.Text = anglesharp.AllLinks.Count.ToString();
- //IF WE FOUND LINKS, ADD THEM
- if (FoundLinks.Count > 0)
- {
- //ADD THE LINKS
- foreach (var item in FoundLinks)
- gui.maingui.ViewList.Items.Add(item);
- //FORCE SCROLL THE LIST TO THE BOTTOM
- gui.maingui.ViewList.SelectedIndex = gui.maingui.ViewList.Items.Count - 1;
- gui.maingui.ViewList.ScrollIntoView(gui.maingui.ViewList.SelectedItem);
- }
- });
- }
- //UPDATE THE GUI AFTER LOOP WAS STOPPED
- Application.Current.Dispatcher.Invoke(() =>
- {
- //RESET BUTTON STATUS/TEXT
- gui.maingui.SEARCH_BUTTON.Content = "SEARCH";
- //ENABLE THE BUTTONN
- gui.maingui.SEARCH_BUTTON.IsEnabled = true;
- });
- }).Start();
- //UPDATE THE GUI AFTER THE LOOP WAS STARTED
- Application.Current.Dispatcher.Invoke(() =>
- {
- //SET BUTTON STATUS/TEXT TO STOP
- gui.maingui.SEARCH_BUTTON.Content = "STOP";
- });
- }
- //IF BUTTON STATUS IS STOP
- else
- {
- //UPDATE SEARCH STATUS
- searching = false;
- //DISABLE THE BUTTON - IT WILL BE ENABLED AFTER THREAD STOPS - (AFTER LOOP)
- Application.Current.Dispatcher.Invoke(() =>
- {
- gui.maingui.SEARCH_BUTTON.IsEnabled = false;
- });
- }
- }
- }
- }
Add Comment
Please, Sign In to add comment