Titanium web proxy и selenium
От: dsalodki Беларусь http://dsalodki.wix.com/resume
Дата: 01.11.22 19:06
Оценка:
Дайте, пожалуйста, рабочий пример с упомянутыми технологиями. Что-то пока что не получается никак открыть url через selenium web driver и получить контент страницы. BeforeResponse событие не срабатывает. Завтра дам код, сегодня уже с мобильника в кровати.

using Newtonsoft.Json.Linq;
using OpenQA.Selenium.Chrome;
using OpenQA.Selenium;
using System;
using System.Net;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using Titanium.Web.Proxy.EventArguments;
using Titanium.Web.Proxy.Models;
using Titanium.Web.Proxy;

namespace Proxy
{
    public class Translator
    {
        private string _baseUrl = @"https://www.translate.ru/перевод/";
        private ProxyServer _proxyServer;
        private IWebDriver _driver;
        private const int _port = 8000;

        private string _translatedText = string.Empty;

        public Language fromCode { get; private set; } = Proxy.Language.Russian;
        public Language toCode { get; private set; } = Proxy.Language.Tatar;

        public Translator()
        {
            _proxyServer = new ProxyServer(false);

            //_proxyServer.CertificateManager.TrustRootCertificate(true);

            _proxyServer.BeforeResponse += ProxyServer_BeforeResponse;
            _proxyServer.AfterResponse += ProxyServer_AfterResponse;

            var explicitEndPoint = new ExplicitProxyEndPoint(IPAddress.Loopback, _port, true);
            explicitEndPoint.BeforeTunnelConnectRequest += ExplicitEndPoint_BeforeTunnelConnectRequest;
            _proxyServer.AddEndPoint(explicitEndPoint);
            _proxyServer.Start();

            //_proxyServer.SetAsSystemHttpProxy(explicitEndPoint);
            //_proxyServer.SetAsSystemHttpsProxy(explicitEndPoint);

            ChromeOptions options = new ChromeOptions();

            var proxy = new OpenQA.Selenium.Proxy
            {
                HttpProxy = $"http://localhost:{_port}",
                SslProxy = $"http://localhost:{_port}",
                FtpProxy = $"http://localhost:{_port}"
            };
            options = new ChromeOptions
            {
                Proxy = proxy
            };

            //options.AddArguments("--proxy-server=" + IPAddress.Loopback + ":8000");
            options.AddArguments("--window-size=20,20");
            options.AddArgument("user-agent=Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.103 Safari/537.36");
            ChromeDriverService service = ChromeDriverService.CreateDefaultService();
            service.HideCommandPromptWindow = true;
            _driver = new ChromeDriver(service, options);
            _driver.Manage().Window.Minimize();
            _driver.Navigate().GoToUrl("https://www.translate.ru");

        }

        private async Task ProxyServer_AfterResponse(object sender, SessionEventArgs e)
        {
            throw new NotImplementedException();
        }

        private async Task ExplicitEndPoint_BeforeTunnelConnectRequest(object sender, TunnelConnectSessionEventArgs e)
        {
            if (!e.HttpClient.Request.RequestUri.Host.Contains("www.translate.ru"))
            {
                e.DecryptSsl = false;
            }
            //return Task.CompletedTask;
        }

        private async Task ProxyServer_BeforeResponse(object sender, SessionEventArgs e)
        {
            if (e.HttpClient.Response.StatusCode == 200 && (e.HttpClient.Request.Method == "GET" || e.HttpClient.Request.Method == "POST"))
            {
                string url = e.HttpClient.Request.Url;
                if (url.Contains("www.translate.ru/api/getTranslation"))
                {
                    var q = await e.GetResponseBody();
                    string responseInString = Encoding.UTF8.GetString(q);
                    _translatedText = JObject.Parse(responseInString)["text"].Value<string>();
                }
            }
        }

        public string Go(string originalText)
        {
            _driver.Navigate().GoToUrl(_baseUrl + GetLenguageArgs() + GetTextArgs(originalText));
            
            while (_translatedText == string.Empty)
            {
                Thread.Sleep(100);
            }
            return _translatedText;
        }

        private string GetLenguageArgs(bool toOrFrom = false)
        {
            if (toOrFrom)
            {
                return $"{((PromtLanguageCode)((int)toCode)).ToString()}-{((PromtLanguageCode)((int)fromCode)).ToString()}?";
            }
            return $"{((PromtLanguageCode)((int)fromCode)).ToString()}-{((PromtLanguageCode)((int)toCode)).ToString()}?";
        }

        private string GetTextArgs(string text)
        {
            return $"text={text.Replace(" ", "%20")}";
        }
    }
}
Отредактировано 02.11.2022 7:56 dsalodki . Предыдущая версия .
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.