Дайте, пожалуйста, рабочий пример с упомянутыми технологиями. Что-то пока что не получается никак открыть 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")}";
}
}
}