Я пытаюсь изменить User Agent от TChromium, и я не нашел процедуры для этого, если он использует CefVCL. Уже по ceflib выглядит так, как будто да, я видел переменную «настройки», которая получает значение «user_agent», но VCL уже имеет, будет или не будет таким образом?Изменение пользовательского агента в Chromium Embedded 3 (DCEF3) (CefVCL)
ответ
Для этого не существует встроенного способа. По моему опыту, настройка 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 около года .. и все еще учусь!
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
К сожалению, это устаревшая ссылка. Теперь это линия 11091. –
Просмотр проекта демо-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.
Установите переменную 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);
Это опять не постоянное решение, и эта функция должна быть реализована в самом компоненте.
Мой (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 сделал это. Возможно, это не подходит для ваших нужд.
Мы используем DCEF1 в течение нескольких лет, и у нас нет обновления до DCEF3 (так как у нас отсутствует что-то, что нам нужно). Таким образом, этот ответ может быть устаревшим, но для чего он стоит:
В DCEF1 В элементе ciflib, называемом CefUserAgent, существует глобальная переменная. Мы установили эту переменную в нашу пользовательскую строку User Agent в разделе инициализации одного из наших блоков проекта. Это просто и, похоже, хорошо работает для нас.
CefUserAgent := OutCustomUserAgentString;
Я не помню вывод этого метода сейчас (это было слишком давно), но я ожидаю, что мы бы только это сделать в разделе инициализации блока, если это то, что требуется, чтобы заставить его работать должным образом.
К сожалению, я понятия не имею, работает ли это в DCEF3.
Не полное изменение, но оно работает для меня.
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;
К сожалению, это устаревшая ссылка. Теперь это строка 11091. –