2013-09-10 3 views
2

Я пытаюсь изменить User Agent от TChromium, и я не нашел процедуры для этого, если он использует CefVCL. Уже по ceflib выглядит так, как будто да, я видел переменную «настройки», которая получает значение «user_agent», но VCL уже имеет, будет или не будет таким образом?Изменение пользовательского агента в Chromium Embedded 3 (DCEF3) (CefVCL)

ответ

2

Для этого не существует встроенного способа. По моему опыту, настройка user-agent ничего не делает .. поэтому вам нужно отредактировать ceflib.pas напрямую (строка ~ 8532) для достижения этого эффекта.

settings.user_agent := cefstring(UserAgent); 

становится:

settings.user_agent := cefstring('My USERAGENT v1.0'); 

С выше, вы можете включить свой собственный ОС и браузер Info в этом блокирует реализацию CEF в этих переменных. Или добавить его, как это:

settings.user_agent := cefstring(UserAgent+'; My UserAgent v1.0'); 

Это, как я делаю это .. Я работал с DCEF1 и DCEF3 около года .. и все еще учусь!

+0

К сожалению, это устаревшая ссылка. Теперь это строка 11091. –

1

ceflib.pas линия 5549

Var

UA: integer;
UAescojido: Ustring;

...

settings.cache_path := CefString(Cache); 
UA:= Random(2)+1; //NEW LINE 
if UA=1 then UAescojido:= 'xxxxxxxxxx'; //NEW LINE 
if UA=2 then UAescojido:= 'xxxxxxxxxx'; //NEW LINE 
settings.user_agent := cefstring(UAescojido); //ASSIGN VARIABLE 
+0

К сожалению, это устаревшая ссылка. Теперь это линия 11091. –

1

Просмотр проекта демо-guiclient в

begin 
    //CefCache := 'cache'; 
    CefCache:='./ca1'; 
    CefUserAgent:='"Mozilla/5.0(Linux; U; Android 4.0.4; zh-cn; MI-ONE C1 Build/IMM76D) UC AppleWebKit/534.31 (KHTML, like Gecko) Mobile Safari/534.31"'; 

    CefOnRegisterCustomSchemes := RegisterSchemes; 
    CefSingleProcess := False; 
    if not CefLoadLibDefault then 
    Exit; 

    CefRegisterSchemeHandlerFactory('local', '', False, TFileScheme); 


    Application.Initialize; 
    Application.CreateForm(TMainForm, MainForm); 
    Application.Run; 
end. 
0

Установите переменную CefUserAgent в разделе инициализации вашего основного программного блока.

initialization 
    CefUserAgent := "Your Agent"; 

Альтернатива:

Если вы используете версию CEF, которая не имеет глобального Название переменной CefUserAgent, то вы можете попробовать:

Агент пользователя хранится в

var 
    settings: TCefSettings; 

в файле ceflib, который объявляется в локальной функции, а не глобальной переменной. Запись настроек содержит переменную settings.user_agent, которая может быть изменена.

function CefLoadLib 

Здесь объявлена ​​переменная, а CefLoadLibDefault вызывает CefLoadLib.

Выполнение настроек глобальным в верхней части файла блока вместо того, чтобы оставить его как локальную переменную функции, может быть решением, позволяющим изменять пользовательский агент в разделе инициализации другого устройства до того, как компоненты будут загруженный в форму. Однако, поскольку глобальные переменные во многих случаях являются плохими и могут вызывать непреднамеренные последствия ... Нужно было бы проверить, не будет ли опасно делать такую ​​модификацию.

Если это еще не сделано, это должен быть запрос функции, который CEF для delphi содержит настройку пользовательского агента, изменяемую в компоненте vcl. Кто-нибудь просил эту функцию ... все же ... Если бы это не было определенно полезно.

Другим временным решением, чтобы сделать глобальную строковую переменную вместо всей записи настроек является глобальным, и просто использовать глобальную переменную строку, когда агент пользователя установлен:

settings.user_agent := cefstring(YourGlobalVariableHere); 

Это опять не постоянное решение, и эта функция должна быть реализована в самом компоненте.

0

Мой (C++) реализация вилы CEF и добавьте следующий метод к CefRequestHandler:

virtual bool GetOverrideUserAgent(CefRefPtr<CefBrowser> browser, 
            CefRefPtr<CefDictionaryValue> request_info, 
            CefString& overrideUserAgent) { return false; } 

Тогда в CEF \ libcef \ Common \ request_impl.cc:

void CefRequestImpl::Set(net::URLRequest* request) { 
    base::AutoLock lock_scope(lock_); 
    CHECK_READONLY_RETURN_VOID(); 
    ... 
    const content::ResourceRequestInfo* info = 
     content::ResourceRequestInfo::ForRequest(request); 
    if (info) { 
     ... 
     CefRefPtr<CefBrowserHostImpl> browser = 
     CefBrowserHostImpl::GetBrowserForRequest(request); 
     if(browser) { 
     ... 
     CefString overrideUserAgent; 
     if(request_handler->**GetOverrideUserAgent**(browser.get(), 
      request_info, overrideUserAgent)) { 
      headermap_.erase(
      net::HttpRequestHeaders::kUserAgent); 
      headermap_.insert(
      std::make_pair(net::HttpRequestHeaders::kUserAgent, 
          overrideUserAgent)); 
     } 
     ... 

Так (базовыми) являются следующие: 1. fork CEF 2. добавить CefRequestHandler :: GetOverrideUserAgent 3. в вашем приложении обработчик клиента должен быть получен из CefRequestHandler и реализовать GetOverrideUserAgent 4. Ваше приложение может установить UA по мере необходимости.

Это, однако, как I сделал это. Возможно, это не подходит для ваших нужд.

0

Мы используем DCEF1 в течение нескольких лет, и у нас нет обновления до DCEF3 (так как у нас отсутствует что-то, что нам нужно). Таким образом, этот ответ может быть устаревшим, но для чего он стоит:

В DCEF1 В элементе ciflib, называемом CefUserAgent, существует глобальная переменная. Мы установили эту переменную в нашу пользовательскую строку User Agent в разделе инициализации одного из наших блоков проекта. Это просто и, похоже, хорошо работает для нас.

CefUserAgent := OutCustomUserAgentString; 

Я не помню вывод этого метода сейчас (это было слишком давно), но я ожидаю, что мы бы только это сделать в разделе инициализации блока, если это то, что требуется, чтобы заставить его работать должным образом.

К сожалению, я понятия не имею, работает ли это в DCEF3.

1

Не полное изменение, но оно работает для меня.

procedure TForm1.Chromium1BeforeResourceLoad(Sender: TObject; 
 
    const browser: ICefBrowser; const frame: ICefFrame; 
 
    const request: ICefRequest; const callback: ICefRequestCallback; out 
 
    Result: TCefReturnValue); 
 

 
Var 
 
    map: ICefStringMultimap; 
 
begin 
 
    map := TCefStringMultimapOwn.Create; 
 
    request.GetHeaderMap(map); 
 
    map.Append('User-Agent','Mozilla/5.0 (iPhone; U; CPU iPhone OS 3_0 like Mac OS X; en-us) AppleWebKit/528.18 (KHTML, like Gecko) Version/4.0 Mobile/7A341 Safari/528.16'); 
 
    request.SetHeaderMap(map); 
 
    callback.Cont(true); 
 
end;

 Смежные вопросы

  • Нет связанных вопросов^_^