protected async Task <Browser> LaunchWithPluginAsync(IPuppeteerExtraPlugin plugin, LaunchOptions options = null) { var extra = new PuppeteerExtra().Use(plugin); //DownloadChromeIfNotExists(); options ??= CreateDefaultOptions(); var browser = await extra.LaunchAsync(options); _launchedBrowsers.Add(browser); return(browser); }
public static async Task PuppeteerOpenBrowser(BotData data) { data.Logger.LogHeader(); PuppeteerSharp.Browser browser; var args = data.ConfigSettings.PuppeteerSettings.CommandLineArgs; if (data.Proxy != null && data.UseProxy) { args += $" --proxy-server={data.Proxy.Type.ToString().ToLower()}://{data.Proxy.Host}:{data.Proxy.Port}"; } // Check if there is already an open browser if (!data.Objects.ContainsKey("puppeteer") || ((PuppeteerSharp.Browser)data.Objects["puppeteer"]).IsClosed) { // Configure the options var launchOptions = new LaunchOptions { Args = new string[] { args }, ExecutablePath = data.Providers.PuppeteerBrowser.ChromeBinaryLocation, Headless = data.ConfigSettings.PuppeteerSettings.Headless, DefaultViewport = null // This is important }; // Add the plugins var extra = new PuppeteerExtra(); extra.Use(new StealthPlugin()); // Launch the browser browser = await extra.LaunchAsync(launchOptions); browser.IgnoreHTTPSErrors = data.ConfigSettings.PuppeteerSettings.IgnoreHttpsErrors; // Save the browser for further use data.Objects["puppeteer"] = browser; var page = (await browser.PagesAsync()).First(); SetPageAndFrame(data, page); // Authenticate if the proxy requires auth if (data.UseProxy && data.Proxy != null && data.Proxy.NeedsAuthentication) { await page.AuthenticateAsync(new Credentials { Username = data.Proxy.Username, Password = data.Proxy.Password }); } data.Logger.Log($"{(launchOptions.Headless ? "Headless " : "")}Browser opened successfully!", LogColors.DarkSalmon); } else { data.Logger.Log("The browser is already open, close it if you want to open a new browser", LogColors.DarkSalmon); } }
public static async Task PuppeteerOpenBrowser(BotData data) { data.Logger.LogHeader(); // Check if there is already an open browser var oldBrowser = data.TryGetObject <PuppeteerSharp.Browser>("puppeteer"); if (oldBrowser is not null && !oldBrowser.IsClosed) { data.Logger.Log("The browser is already open, close it if you want to open a new browser", LogColors.DarkSalmon); return; } var args = data.ConfigSettings.PuppeteerSettings.CommandLineArgs; if (data.Proxy != null && data.UseProxy) { if (data.Proxy.Type == ProxyType.Http || !data.Proxy.NeedsAuthentication) { args += $" --proxy-server={data.Proxy.Type.ToString().ToLower()}://{data.Proxy.Host}:{data.Proxy.Port}"; } else { var proxyType = data.Proxy.Type == ProxyType.Socks5 ? Yove.Proxy.ProxyType.Socks5 : Yove.Proxy.ProxyType.Socks4; var proxyClient = new ProxyClient( data.Proxy.Host, data.Proxy.Port, data.Proxy.Username, data.Proxy.Password, proxyType); data.SetObject("puppeteer.yoveproxy", proxyClient); args += $" --proxy-server={proxyClient.GetProxy(null).Authority}"; } } // Configure the options var launchOptions = new LaunchOptions { Args = new string[] { args }, ExecutablePath = data.Providers.PuppeteerBrowser.ChromeBinaryLocation, Headless = data.ConfigSettings.PuppeteerSettings.Headless, DefaultViewport = null // This is important }; // Add the plugins var extra = new PuppeteerExtra(); extra.Use(new StealthPlugin()); // Launch the browser var browser = await extra.LaunchAsync(launchOptions); browser.IgnoreHTTPSErrors = data.ConfigSettings.PuppeteerSettings.IgnoreHttpsErrors; // Save the browser for further use data.SetObject("puppeteer", browser); var page = (await browser.PagesAsync()).First(); SetPageAndFrame(data, page); await SetPageLoadingOptions(data, page); // Authenticate if the proxy requires auth if (data.UseProxy && data.Proxy is { NeedsAuthentication : true, Type : ProxyType.Http } proxy) { await page.AuthenticateAsync(new Credentials { Username = proxy.Username, Password = proxy.Password }); } data.Logger.Log($"{(launchOptions.Headless ? "Headless " : "")}Browser opened successfully!", LogColors.DarkSalmon); }
public async Task <bool> DoAsync() { try { CancellationTokenSource.CancelAfter(TimeSpan.FromSeconds(60)); BrowserFetcher browserFetcher = new BrowserFetcher(); if (!browserFetcher.LocalRevisions().Contains(BrowserFetcher.DefaultChromiumRevision)) { Logger.Warn($"Downloading browser... First time it can take a while, depending on your internet connection."); RevisionInfo revisionInfo = await browserFetcher.DownloadAsync(BrowserFetcher.DefaultChromiumRevision); Logger.Warn($"Downloaded browser. Downloaded: {revisionInfo.Downloaded}, Platform: {revisionInfo.Platform}, Revision: {revisionInfo.Revision}, Path: {revisionInfo.FolderPath}"); } Logger.Debug($"Creating browser..."); PuppeteerExtra puppeteerExtra = new PuppeteerExtra(); // Use stealth plugin (needed for Cloudflare / hCaptcha) puppeteerExtra.Use(new StealthPlugin()); using (Browser = await puppeteerExtra.LaunchAsync(new LaunchOptions { Headless = false, Args = new[] { "--no-sandbox", "--disable-setuid-sandbox", $"--user-agent=\"{Constants.UserAgent.Chrome}\"" }, DefaultViewport = null, IgnoreHTTPSErrors = true })) { Logger.Info($"Started browser with PID {Browser.Process.Id}"); Browser.Closed += Browser_Closed; Browser.Disconnected += Browser_Disconnected; Browser.TargetChanged += Browser_TargetChanged; Browser.TargetCreated += Browser_TargetCreated; Browser.TargetDestroyed += Browser_TargetDestroyed; Logger.Debug($"Created browser."); Logger.Debug($"Creating page..."); using (Page = (await Browser.PagesAsync())[0]) { Page.Close += Page_Close; Page.Console += Page_Console; Page.Dialog += Page_Dialog; Page.DOMContentLoaded += Page_DOMContentLoaded; Page.Error += Page_Error; Page.FrameAttached += Page_FrameAttached; Page.FrameDetached += Page_FrameDetached; Page.FrameNavigated += Page_FrameNavigated; Page.Load += Page_Load; Page.Metrics += Page_Metrics; Page.PageError += Page_PageError; Page.Popup += Page_Popup; Page.Request += Page_Request; Page.RequestFailed += Page_RequestFailed; Page.RequestFinished += Page_RequestFinished; Page.RequestServedFromCache += Page_RequestServedFromCache; Page.Response += Page_Response; Page.WorkerCreated += Page_WorkerCreated; Page.WorkerDestroyed += Page_WorkerDestroyed; Logger.Debug($"Created page."); Stopwatch stopwatch = Stopwatch.StartNew(); Logger.Debug($"Navigating to {Url}.."); await Page.GoToAsync(Url); await Task.Delay(TimeSpan.FromSeconds(60), CancellationTokenSource.Token); Logger.Debug($"Navigation done in {stopwatch.ElapsedMilliseconds}ms"); } } Logger.Debug("Finished with browser!"); } catch (OperationCanceledException ex) { if (!OK) { Logger.Error(ex, "Looks like Cloudflare protection wasn't solved in time."); } } catch (Exception ex) { Logger.Error(ex, "Error with browser"); } finally { Logger.Debug("Closing browser"); await Browser.CloseAsync(); Logger.Debug("Closed browser"); } return(OK); }