Есть ли способ настроить пользовательский агент на лету с помощью CEFSharp?C#

Место общения программистов C#
Ответить Пред. темаСлед. тема
Anonymous
 Есть ли способ настроить пользовательский агент на лету с помощью CEFSharp?

Сообщение Anonymous »

Все еще новичок в работе с проектом cefsharp.
Я пытаюсь привязать пользовательский агент к экземпляру, а не глобально.
В настоящее время я использую следующее в своем Program.cs
var settings = new CefSettings();
settings.CefCommandLineArgs.Add("user-agent", "Mozilla/5.0 (iPhone; CPU iPhone OS 14_0 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/14.0 Mobile/15E148 Safari/604.1");

Хотя это работает, он устанавливает пользовательский агент глобально. Я использую две формы, так как хочу, чтобы одна отображалась как мобильная, а другая — как настольная. При этом я не понимаю, как мне это сделать. Используя вышеизложенное, он устанавливает UserAgent глобально. Ненавижу комментировать и раскомментировать строку, устанавливающую ее.
Я попробовал следующее
var ctx = RequestContext.Configure()
.WithSharedSettings(Cef.GetGlobalRequestContext())
.WithPreference("general.useragent.override", "Mozilla/5.0 (iPhone; CPU iPhone OS 14_0 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/14.0 Mobile/15E148 Safari/604.1")
.Create();

browser = new ChromiumWebBrowser("www.google.com");
browser.RequestContext = ctx;


Однако это не работает. Я готов поспорить, что контекст запроса (изоляция браузера) — это способ сделать то, что я хочу, но я не знаю, как это сделать. Пожалуйста, помогите
Изменить:
public class CustomResourceRequestHandler : CefSharp.Handler.ResourceRequestHandler
{
protected override CefReturnValue OnBeforeResourceLoad(IWebBrowser chromiumWebBrowser, IBrowser browser, IFrame frame, IRequest request, IRequestCallback callback)
{
//Set the header by name, override the existing value
request.SetHeaderByName("user-agent", "MyBrowser CefSharp Browser", true);

return CefReturnValue.Continue;
}
}

public class CustomRequestHandler : CefSharp.Handler.RequestHandler
{
protected override IResourceRequestHandler GetResourceRequestHandler(IWebBrowser chromiumWebBrowser, IBrowser browser, IFrame frame, IRequest request, bool isNavigation, bool isDownload, string requestInitiator, ref bool disableDefaultHandling)
{
//Where possible only intercept specific Url's
//Load https://www.whatismybrowser.com/detect/ ... user-agent in the browser and you'll
//see our custom user agent
if (request.Url == "https://www.whatismybrowser.com/detect/ ... user-agent")
{
return new CustomResourceRequestHandler();
}

//Default behaviour, url will be loaded normally.
return null;
}
}

browser.RequestHandler = new CustomRequestHandler();

Я получаю сообщение об ошибке. Невозможно неявно преобразовать тип CustomResourceRequestHandler в CefSharp.IRequestHandler. Даже
using CefSharp;
using CefSharp.Handler;

public class CustomRequestHandler : CefSharp.Handler.RequestHandler
{
protected override bool OnBeforeBrowse(IWebBrowser chromiumWebBrowser, IBrowser browser, IFrame frame, IRequest request, bool userGesture, bool isRedirect)
{
// Intercept only the specific URL
if (request.Url == "https://www.whatismybrowser.com/detect/ ... user-agent")
{
request.SetHeaderByName("user-agent", "MyBrowser CefSharp Browser", true);
}

// Always return false to continue the navigation
return false;
}
}

Думаю, я правильно адаптировал его, но теперь столкнулся с тем, что IRequest доступен только для чтения. Пробовал несколько других адаптаций, всегда сталкивающихся с проблемой «только для чтения».
Редактировать: Хорошо, я думаю, что здесь что-то есть.
using CefSharp;
using CefSharp.Handler;
using System;
using System.Collections.Specialized;

public class CustomRequestHandler : RequestHandler
{
protected override bool OnBeforeBrowse(IWebBrowser chromiumWebBrowser, IBrowser browser, IFrame frame, IRequest request, bool userGesture, bool isRedirect)
{
if (request.Url == "https://www.whatismybrowser.com/detect/ ... user-agent")
{
try
{
// Log the interception of the URL
Console.WriteLine("Intercepted URL: " + request.Url);

// Create a dictionary to hold the modified headers
var modifiedHeaders = new NameValueCollection(request.Headers);

// Modify the user agent
modifiedHeaders["user-agent"] = "MyBrowser CefSharp Browser";

// Create a new request with the modified headers
var modifiedRequest = frame.CreateRequest();
modifiedRequest.Url = request.Url;
modifiedRequest.Method = request.Method;
modifiedRequest.Headers = modifiedHeaders;

// Copy post data if it exists
if (request.PostData != null)
{
modifiedRequest.PostData = request.PostData;
}

// Load the modified request using the browser
frame.LoadRequest(modifiedRequest);

// Log successful loading of the modified request
Console.WriteLine("Modified request loaded successfully.");

return true; // Cancel the original request
}
catch (Exception ex)
{
// Log any exceptions for debugging purposes
Console.WriteLine("Exception occurred: " + ex.Message);
}
}

return false; // Continue with the original request
}
}

С помощью этого кода он фактически не загружает тестовый URL-адрес, но загружает другие URL-адреса. Так что на самом деле это обработка тестового URL-адреса. Страница просто не загружается. И это только перехват мобильного браузера, как и предполагалось.
Перехваченный URL-адрес: https://www.whatismybrowser.com/detect/ ... user-agent
Измененный запрос загружен успешно.
Как вы можете заметить, я пытался атаковать эту проблему разными способами, но пока не нашел работающего решения.
Изменить: с этим последним кодом, который кажется чтобы перехватить URL-адрес и использовать свой обработчик, мне пришлось выполнить некоторую регистрацию, чтобы получить это
Intercepted URL: https://www.whatismybrowser.com/detect/ ... user-agent
Modified request loaded successfully.
Load Error: Aborted, ERR_ABORTED, https://www.whatismybrowser.com/detect/ ... user-agent
Loading State Changed: False
[2944:18276:0710/001242.230:ERROR:bad_message.cc(29)] Terminating renderer for bad IPC message, reason 213
Render process terminated: ProcessCrashed


Подробнее здесь: https://stackoverflow.com/questions/786 ... h-cefsharp
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C#»