CEFSharp Изменение пользовательского агента с помощью специального обработчика

НЕВОЗМОЖНО УДАЛИТЬ. Неправильный подход к проблеме. Используйте пример, который дает сопровождающий кода

Все еще новичок в работе с проектом 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 глобально. Я ненавижу комментировать и раскомментировать строку, устанавливающую ее.

Я попробовал следующее

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/what-is-my-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/what-is-my-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/what-is-my-user-agent Измененный запрос успешно загружен.

С этим последним кодом, который, кажется, перехватывает URL-адрес и использует мой обработчик, мне пришлось выполнить некоторую регистрацию, чтобы получить это

OnBeforeBrowse URL: https://www.whatismybrowser.com/detect/what-is-my-user-agent
Intercepted URL: https://www.whatismybrowser.com/detect/what-is-my-user-agent
Modified request loaded successfully.
Load Error: Aborted, ERR_ABORTED, https://www.whatismybrowser.com/detect/what-is-my-user-agent
Loading State Changed: False
[14956:7864:0710/043123.774:ERROR:bad_message.cc(29)] Terminating renderer for bad IPC message, reason 213
GetResourceRequestHandler: https://csm.us5.us.criteo.net/iev?entry=c~Gum.ChromeSyncframe.CookieRead.uid~1&entry=c~Gum.ChromeSyncframe.FragmentData.onetag.Bundle.Origin.undefined~1&entry=c~Gum.ChromeSyncframe.SidReadSuccess~1&entry=h~Gum.ChromeSyncframe.SidReadSuccessDuration~328
Render process terminated: ProcessCrashed

[8352:10124:0710/040922.537:ERROR:bad_message.cc(29)] Terminating renderer for bad IPC message, reason 213
[8352:10124:0710/040922.538:VERBOSE1:browser_info_manager.cc(531)] frame 6-BB0DCBA5339448D1441249D75553904F, pdf_process=0, browser_process_guest=0, print_preview_dialog=0, main=1
[8352:10124:0710/040922.542:VERBOSE1:frame_host_impl.cc(515)] frame A-F5DF7D801E84FDC36BCC535A08C6FD9B (sub) detached (reason=RENDER_FRAME_DELETED, is_connected=1)
[8352:10124:0710/040922.543:VERBOSE1:frame_host_impl.cc(515)] frame 9-870ABD8F28E33A0A82F7D99F90C14289 (sub) detached (reason=RENDER_FRAME_DELETED, is_connected=1)
[18420:11048:0710/040922.543:VERBOSE1:network_delegate.cc(35)] NetworkDelegate::NotifyBeforeURLRequest: https://csm.us5.us.criteo.net/iev?entry=c~Gum.ChromeSyncframe.CookieRead.uid~1&entry=c~Gum.ChromeSyncframe.FragmentData.onetag.Bundle.Origin.undefined~1&entry=c~Gum.ChromeSyncframe.SidReadSuccess~1&entry=h~Gum.ChromeSyncframe.SidReadSuccessDuration~676
[8352:10124:0710/040922.544:VERBOSE1:frame_host_impl.cc(515)] frame 8-A5EA056889DFBED6602D2F909E9971D4 (sub) detached (reason=RENDER_FRAME_DELETED, is_connected=1)

При использовании командной строки Disable-site-isolation-trials страница по-прежнему не загружается, и браузер находится в состоянии постоянного обновления страницы в бесконечном цикле.

См. github.com/cefsharp/CefSharp/wiki/General-Usage#useragent

amaitland 06.07.2024 00:38

Эти методы не работают для того, что я ищу, поскольку я пытаюсь открыть две формы, одна из которых сообщает как мобильный браузер, а другая - как настольный браузер одновременно. Мне нужно установить пользовательский агент для экземпляра не глобально.

Spontane 07.07.2024 23:08

@amaitland Не поймите меня неправильно, я использую первый метод, чтобы установить пользовательский агент. Проблема в том, что мне приходится постоянно комментировать строку, которая устанавливает пользовательский агент при компиляции. Просто если бы я мог прикрепить пользовательский агент к экземпляру ChromiumWebBrowser вместо того, чтобы устанавливать его глобально, это решило бы мою проблему.

Spontane 08.07.2024 02:00

SetUserAgentOverrideAsync — единственный способ полностью зарядить пользовательский агент во время выполнения. Изменение заголовка запроса не приведет к изменению пользовательского агента в JavaScript. Создайте другой контекст запроса для каждого браузера, а затем вызовите SetUserAgentOverrideAsync.

amaitland 11.07.2024 08:49
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
4
126
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Хорошо, я не знаю, почему у меня было так много проблем. Может быть, я просто еще учусь и не совсем понимаю, что делаю. ВИНОВАТ. Ничто из того, что я изначально пробовал, не было НЕПРАВИЛЬНЫМ. Я не могу удалить эту тему.

Это решение, на которое намекал Амайтланд, сработало.

// Copyright © 2020 The CefSharp Authors. All rights reserved.
//
// Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.

namespace CefSharp.MinimalExample.WinForms
{
    public class LifeSpanHandler : ILifeSpanHandler
    {
        bool ILifeSpanHandler.DoClose(IWebBrowser chromiumWebBrowser, IBrowser browser)
        {
            return false;
        }

        void ILifeSpanHandler.OnAfterCreated(IWebBrowser chromiumWebBrowser, IBrowser browser)
        {
            using (var client = chromiumWebBrowser.GetDevToolsClient())
            {
                _ = client.Network.SetUserAgentOverrideAsync("Mozilla/5.0 (iPhone; CPU iPhone OS 17_5_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.5 Mobile/15E148 Safari/604.1");
            }
        }

        void ILifeSpanHandler.OnBeforeClose(IWebBrowser chromiumWebBrowser, IBrowser browser)
        {

        }

        bool ILifeSpanHandler.OnBeforePopup(IWebBrowser chromiumWebBrowser, IBrowser browser, IFrame frame, string targetUrl, string targetFrameName, WindowOpenDisposition targetDisposition, bool userGesture, IPopupFeatures popupFeatures, IWindowInfo windowInfo, IBrowserSettings browserSettings, ref bool noJavascriptAccess, out IWebBrowser newBrowser)
        {
            newBrowser = null;

            return false;
        }
    }
}
            browser.LifeSpanHandler = new LifeSpanHandler();

Приведенный выше код является ТОЧНЫМ КОДОМ ИЗ МОЕЙ ФОРМЫ/КОДА, но он точно такой же, как и у сопровождающего кода в их ссылке. Лично я считаю, что лучше использовать ссылку, которую сопровождающий кода лучше, чем копировать/вставлять сюда. На самом деле вопрос следует полностью удалить, потому что я не знал, что делаю, а ответ дал специалист по сопровождению кода. На самом деле, ни один код в моем исходном вопросе не является действительным, как заявил специалист по сопровождению кода. Вопрос в том, чтобы больше запутать людей, чем отвечать на любые вопросы. Невозможно удалить

Зачем голосовать за ответ. Имейте в виду, это ответ на вопрос, который я задал и на который ответил. Кто знает, какое решение работает лучше, чем тот, кто задал вопрос. Так что давай, проголосуй против совершенно нормального ответа.

Хотя эта ссылка может ответить на вопрос, лучше включить сюда основные части ответа и предоставить ссылку для справки. Ответы, содержащие только ссылки, могут стать недействительными, если связанная страница изменится. - Из отзыва

David Maze 13.07.2024 13:31

Другие вопросы по теме

Почему API IPC общей памяти POSIX C требует разрешений (чтение/запись) в нескольких местах?
Перезапуск интерпретатора Python с использованием Python C API
Очереди сообщений IPC не работают должным образом
Именованный семафор не будет работать, как предполагалось, при синхронизации между процессами
Попытка передать «указатель на структуру данных» обработчику сигнала с помощью функции sigqueue из одного процесса в другой, используя структуру siginfo_t
Почему сегменты общей памяти работают дольше, чем конвейер при передаче больших данных?
Сериализация данных C++ и совместимость с ABI
Служба WCF размещается локально с использованием службы Windows - именованные каналы связи с графическим интерфейсом пользователя - «Канал завершен. (109, 0x6d)»
Очередь многопроцессорной обработки Python: выполнение get() является узким местом
Как Java может записывать команды в GHCi?