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

Delphi 更改Chromium Embedded 3(DCEF3)(CEFFCL)中的用户代理,delphi,chromium-embedded,tchromium,Delphi,Chromium Embedded,Tchromium,我正在尝试修改TChromium的用户代理,但我没有找到相关程序,以防它使用CefVCL。ceflib看起来已经是了是的,我看到了一个变量“settings”,它接收一个值“user\u agent”,但是VCL已经、将要或不可能这样做?没有内置的方法来实现这一点。根据我的经验,用户代理设置不起任何作用。。因此,您必须直接编辑ceflib.pas(第8532行)才能实现此效果 settings.user_agent := cefstring(UserAgent); 变成: se

我正在尝试修改TChromium的用户代理,但我没有找到相关程序,以防它使用CefVCL。ceflib看起来已经是了是的,我看到了一个变量“settings”,它接收一个值“user\u agent”,但是VCL已经、将要或不可能这样做?

没有内置的方法来实现这一点。根据我的经验,用户代理设置不起任何作用。。因此,您必须直接编辑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一起工作了大约一年。。而且还在学习

没有内置的方法可以做到这一点。根据我的经验,用户代理设置不起任何作用。。因此,您必须直接编辑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一起工作了大约一年。。而且还在学习

ceflb.pas 第5549行

Var

UA:整数
UAescojido:Ustring

ceflib.pas 第5549行

Var

UA:整数
UAescojido:Ustring


查看演示GUI客户端的项目源

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.

查看演示GUI客户端的项目源

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\u agent

function CefLoadLib
是声明变量的位置,CefLoadLibDefault调用CefLoadLib

设置设置为单元文件顶部的全局设置,而不是将其保留为局部函数变量,这可能是一种解决方案,以便您可以在将组件加载到表单之前修改另一个单元的初始化部分中的用户代理。然而,由于全球化在许多情况下都是一件坏事,可能会造成意想不到的后果。。。。必须进行检查,以确保进行此类修改不会不安全

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

另一个临时解决方案是使用全局字符串变量,而不是将整个设置记录设置为全局,并在设置用户代理时仅使用全局字符串变量:

settings.user_agent := cefstring(YourGlobalVariableHere);

这也不是一个永久性的解决方案,该功能实际上应该在组件本身中实现。

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

initialization
  CefUserAgent := "Your Agent";
备选方案:

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

用户代理存储在

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

function CefLoadLib
是声明变量的位置,CefLoadLibDefault调用CefLoadLib

设置设置为单元文件顶部的全局设置,而不是将其保留为局部函数变量,这可能是一种解决方案,以便您可以在将组件加载到表单之前修改另一个单元的初始化部分中的用户代理。然而,由于全球化在许多情况下都是一件坏事,可能会造成意想不到的后果。。。。必须进行检查,以确保进行此类修改不会不安全

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

另一个临时解决方案是使用全局字符串变量,而不是将整个设置记录设置为全局,并在设置用户代理时仅使用全局字符串变量:

settings.user_agent := cefstring(YourGlobalVariableHere);
这也不是一个永久性的解决方案,该功能实际上应该在组件本身中实现。

My(C++)实现分叉CEF,并向CEF请求处理程序添加以下方法:

  virtual bool GetOverrideUserAgent(CefRefPtr<CefBrowser> browser, 
                                    CefRefPtr<CefDictionaryValue> request_info, 
                                    CefString& overrideUserAgent) { return false; }
virtual bool GetOverrideUserAgent(CefRefPtr浏览器,
CefRefPtr请求信息,
CefString&overrideUserAgent){return false;}
然后,在cef\libcef\common\request\u 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));
        }
        ...
void-CefRequestImpl::Set(net::URLRequest*request){
基本::自动锁定范围(锁定);
选中_READONLY_RETURN_VOID();
...
常量内容::ResourceRequestInfo*信息=
内容::ResourceRequestInfo::ForRequest(请求);
如果(信息){
...
CefRefPtr浏览器=
CefBrowserHostImpl::GetBrowserForRequest(请求);
如果(浏览器){
...
头孢噻吩;
如果(请求)处理程序->**GetOverrideUserAgent**(浏览器.get(),
请求(信息,覆盖代理)){
头映射。删除(
net::HttpRequestHeaders::kUserAgent);
顶盖映射插入件(
std::make_pair(net::HttpRequestHeaders::kUserAgent,
覆盖剂);
}
...
因此,(基本)步骤如下: 1.叉子 2.添加CefRequestHandler::GetOv