Untitled

 avatar
unknown
csharp
2 years ago
7.0 kB
9
Indexable
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);
        }
    }
}
 
Editor is loading...