更改Chromium Embedded 3(DCEF3)中的用户代理(CefVCL)

时间:2013-09-10 00:54:33

标签: delphi chromium-embedded tchromium

我正在尝试修改TChromium的用户代理,如果使用的是CefVCL,我没有找到相应的程序。 ceflib已经看起来好像是,我看到一个变量“settings”接收到一个值“user_agent”,但是VCL已经拥有,将会有或不可能这样做?

7 个答案:

答案 0 :(得分:1)

没有内置方法可以做到这一点。根据我的经验,用户代理设置什么都不做..所以你必须直接编辑ceflib.pas(第~8532行)才能达到这个效果。

    settings.user_agent := cefstring(UserAgent);

变为:

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

通过上述内容,您可能希望包含自己的操作系统和浏览器信息,因为这会阻止CEF对这些变量的实施。或者追加它,就像这样:

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

我就是这样做的..我和DCEF1和DCEF3一起工作了大约一年......还在学习!

答案 1 :(得分: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

答案 2 :(得分: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.

答案 3 :(得分:1)

没有完全改变,但它对我有用。



Convert pasted Java code to Kotlin




答案 4 :(得分:0)

在主程序单元的初始化部分设置CefUserAgent变量。

initialization
  CefUserAgent := "Your Agent";

<强>替代:

如果您使用的是没有CefUserAgent全局变量的CEF版本,那么您可以尝试:

用户代理存储在

var
  settings: TCefSettings;
在ceflib文件中,该文件在本地函数中声明,而不是全局变量。设置记录包含可以修改的变量 settings.user_agent

function CefLoadLib

是声明变量的地方,CefLoadLibDefault调用CefLoadLib。

设置设置为单元文件顶部的全局而不是将其作为本地函数变量,可以是一个解决方案,以便您可以修改另一个单元的初始化部分中的用户代理在组件加载到表单之前。但是,由于全局变量在很多情况下都是一件坏事,并且可能导致意想不到的后果......人们必须检查一下,做这样的修改并不是不安全的。

如果还没有这样做,这应该是一个功能请求,CEF for delphi包含一个可在vcl组件中修改的用户代理设置。有没有人要求这个功能...但是..如果不是它肯定会有用。

另一个临时解决方案是创建一个全局字符串变量而不是整个设置记录是全局的,只需在设置用户代理时使用全局字符串变量:

settings.user_agent := cefstring(YourGlobalVariableHere);

这再次不是一个永久的解决方案,这个功能应该真正在组件本身实现。

答案 5 :(得分: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.分叉CEF 2.添加CefRequestHandler :: GetOverrideUserAgent 3.在您的应用程序中,客户端处理程序应该从CefRequestHandler派生并实现GetOverrideUserAgent 4.您的应用程序可以根据需要设置UA。

然而,是如何做到的。它可能不适合您的需求。

答案 6 :(得分:0)

我们多年来一直在使用DCEF1,而且我们还没有升级到DCEF3(因为它缺少我们需要的东西)。所以这个答案可能已经过时了,但是值得的是:

在DCEF1中,ciflib单元中有一个名为CefUserAgent的全局变量。 我们在我们的一个项目单元的初始化部分中将该变量设置为我们的客户用户代理字符串。这很简单,似乎对我们有用。

CefUserAgent := OutCustomUserAgentString;

我现在不记得这个方法的推导(很久以前),但我希望我们只能在单元的初始化部分完成它,如果这是使其正常工作所需的。

不幸的是我不知道这是否仍适用于DCEF3。