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);
        }
Пример #2
0
        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);
            }
        }
Пример #3
0
        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);
    }