0

I wrote a bot in C#, I used Selenium.

Problem: When I start more threads at same time, the bot does the work in the first window. All of the e-mail addresses are being added to the "E-mail" textbox in the same window instead of one e-mail address per window.

not correct

But it should look like:

correct

Start function: DivisionStart()

private void DivisionStart() {
    foreach(var account in BotConfig.AccountList) {
        while (CurrentBotThreads >= BotConfig.MaxLoginsAtSameTime) {
            Thread.Sleep(1000);
        }
 
        StartedBotThreads++;
        CurrentBotThreads++;
 
        int startIndex = (StartedBotThreads * BotConfig.AdsPerAccount + 1) - BotConfig.AdsPerAccount - 1;
        int stopIndex = BotConfig.AdsPerAccount * CurrentBotThreads;
 
        if (stopIndex > BotConfig.ProductList.Count) {
            stopIndex = BotConfig.ProductList.Count;
        }
 
        Debug.Print("Thread: " + StartedBotThreads);
 
        var adList = GetAdListBy(startIndex, stopIndex);
 
        foreach(var ad in adList) {
            Debug.Print("Für thread: " + StartedBotThreads + " | Anzeige: " + ad.AdTitle);
        }
 
        Debug.Print("Parallel");
 
        var ebayBotThread = new Thread(() => {
            var botOptions = new IBotOptionsModel() {
                CaptchaSolverApiKey = CaptchaSolverApiKey,
                    ReCaptchaSiteKey = "6LcZlE0UAAAAAFQKM6e6WA2XynMyr6WFd5z1l1Nr",
                    StartPageUrl = "https://www.ebay-kleinanzeigen.de/m-einloggen.html?targetUrl=/",
                    EbayLoginEmail = account.AccountEmail,
                    EbayLoginPassword = account.AccountPassword,
                    Ads = adList,
            };
 
            var ebayBot = new EbayBot(this, botOptions);
 
            ebayBot.Start(StartedBotThreads);
 
            Thread.Sleep(5000);
        });
 
        ebayBotThread.Start();
    }
}

The class with function which will be executed in each thread:

using OpenQA.Selenium;
using Selenium.WebDriver.UndetectedChromeDriver;
using System.Diagnostics;
using TwoCaptcha.Captcha;
using System.Drawing;
using OpenQA.Selenium.Chrome;
using OpenQA.Selenium.Chrome.ChromeDriverExtensions;
 
namespace EbayBot
{
    class EbayBot
    {
        public Selenium.Extensions.SlDriver Driver;
        private WebDriverHelper DriverHelper;
        private Bot Sender;
        private bool CaptchaSolved = false;
 
        public IBotOptionsModel Options;
 
        public EbayBot(Bot sender, IBotOptionsModel options)
        {
            Sender = sender;
            Options = options;
        }
 
        public void Start(int threadIndex)
        {
            var chromeOptions = new ChromeOptions();
 
            /*if (Sender.BotConfig.EnableProxy)
            {
                chromeOptions.AddHttpProxy(
                    Options.Proxy.IpAddress,
                    Options.Proxy.Port,
                    Options.Proxy.Username,
                    Options.Proxy.Password
                );
            }*/
 
            Driver = UndetectedChromeDriver.Instance(null, chromeOptions);
 
            DriverHelper = new WebDriverHelper(Driver);
 
            string status = "";
 
            Debug.Print("Bot-Thread: " + threadIndex);
 
            Driver.Url = Options.StartPageUrl + Options.EbayLoginEmail;
 
            PressAcceptCookiesButton();
 
            Login();
 
            if (!CaptchaSolved) return;
 
            Driver.Wait(3);
 
            if (LoginError() || !IsLoggedIn())
            {
                status = "Login für '" + Options.EbayLoginEmail + "' fehlgeschlagen!";
                Debug.Print(status);
                Sender.ProcessStatus = new IStatusModel(status, Color.Red);
 
                return;
 
            }
            else
            {
                status = "Login für '" + Options.EbayLoginEmail + "' war erfolgreich!";
                Debug.Print(status);
                Sender.ProcessStatus = new IStatusModel(status, Color.Green);
            }
 
            Driver.Wait(5);
 
            BeginFillFormular();
        }
 
        private bool CookiesAccepted()
        {
            try
            {
                var btnAcceptCookies = Driver.FindElement(By.Id(Config.PageElements["id_banner"]));
 
                return btnAcceptCookies == null;
 
            }
            catch (Exception)
            {
                return true;
            }
        }
        private void PressAcceptCookiesButton()
        {
            DriverHelper.WaitForElement(Config.PageElements["id_banner"], "", 10);
 
            if (CookiesAccepted()) return;
 
            var btnAcceptCookies = Driver.FindElement(By.Id(Config.PageElements["id_banner"]));
 
            btnAcceptCookies.Click();
        }
 
        private bool IsLoggedIn()
        {
            Debug.Print("Check if logged in already");
            try
            {
                var userEmail = Driver.FindElement(By.Id("user-email")).Text;
 
                return userEmail.ToLower().Contains(Options.EbayLoginEmail);
 
            }
            catch (Exception)
            {
                return false;
            }
 
        }
        private bool LoginError()
        {
            try
            {
                var loginErrorH1 = Driver.FindElements(By.TagName("h1"));
 
                return loginErrorH1[0].Text.Contains("ungültig");
 
            }
            catch (Exception)
            {
                return false;
            }
        }
        private void Login()
        {
            if (IsLoggedIn()) return;
 
            string status = "Anmelden bei " + Options.EbayLoginEmail + "...";
            Debug.Print(status);
 
            Sender.ProcessStatus = Sender.ProcessStatus = new IStatusModel(status, Color.DimGray);
 
            Driver.Wait(5);
 
            var fieldEmail = Driver.FindElement(By.Id(Config.PageElements["id_login_email"]));
            var fieldPassword = Driver.FindElement(By.Id(Config.PageElements["id_login_password"]));
            var btnLoginSubmit = Driver.FindElement(By.Id(Config.PageElements["id_login_button"]));
 
            fieldEmail.SendKeys(Options.EbayLoginEmail);
 
            Driver.Wait(4);
 
            fieldPassword.SendKeys(Options.EbayLoginPassword);
 
            SolveCaptcha();
 
            if (!CaptchaSolved)
            {
                return;
            }
 
            Debug.Print("Clicking login button");
 
            btnLoginSubmit.Click();
        }
 
 
        public void BeginFillFormular()
        {
            Debug.Print("Formular setup, Inserate: " + Options.Ads.Count);
 
            foreach (var adData in Options.Ads)
            {
                Debug.Print("Setting up formular for " + adData.AdTitle);
 
                var adFormular = new AdFormular(Driver, adData, Options);
                adFormular._EbayBot = this;
 
                adFormular.CreateAd(Sender);
 
                // 10 seconds
                Debug.Print("Nächstes Insert für " + adData.AdTitle);
 
 
            }
        }
        public string GetSolvedCaptchaAnswer(string captchaUrl = "")
        {
            string code = string.Empty;
 
            var solver = new TwoCaptcha.TwoCaptcha(Options.CaptchaSolverApiKey);
            var captcha = new ReCaptcha();
 
            captcha.SetSiteKey(Options.ReCaptchaSiteKey);
            captcha.SetUrl(captchaUrl == "" ? Options.StartPageUrl : captchaUrl);
 
            try
            {
                solver.Solve(captcha).Wait();
                code = captcha.Code;
            }
            catch (AggregateException e)
            {
                Sender.ProcessStatus = new IStatusModel("Captcha Api-Fehler: " + e.InnerExceptions.First().Message, Color.Red);
                Driver.Wait(10);
            }
 
            return code;
        }
 
        public void SolveCaptcha(string captchaUrl = "")
        {
            Debug.Print("Solving captcha...");
 
            var solvedCaptchaAnswer = GetSolvedCaptchaAnswer(captchaUrl);
 
            if (solvedCaptchaAnswer == string.Empty)
            {
                Debug.Print("Captcha konnte nicht gelöst werden");
                Sender.ProcessStatus = new IStatusModel("Captcha konnte nicht gelöst werden", Color.Red);
                CaptchaSolved = false;
                Driver.Wait(10);
                return;
            }
 
            CaptchaSolved = true;
 
            Debug.Print("Captcha answer: " + solvedCaptchaAnswer);
 
            Driver.ExecuteScript("document.getElementById('g-recaptcha-response').innerHTML = '" + solvedCaptchaAnswer + "'");
 
            Debug.Print("Captcha solved!");
 
            Driver.Wait(2);
        }
    }
}

If I remove the Thread.Sleep(5000); in the DivisionStart function it will work, but I need it I actually want to wait for a found proxy but I simulated it with Thread.Sleep

How can I solve my problem?

Thanks for any answer!

Greg Burghardt
  • 17,900
  • 9
  • 49
  • 92
Manuel
  • 11
  • 1

1 Answers1

0

I fixed it.

I used UndetectedChromeDriver wich does not use different ports.

I use another Undetected driver now.

Thank you all

Manuel
  • 11
  • 1
  • Can you [edit] your answer to share the code you used? Other people might find your question useful, so they would certainly find this answer useful. But we need to see some code, first. – Greg Burghardt Jan 30 '23 at 20:52