簡體   English   中英

在Delphi中使用IHTMLDocument2靜默阻止cookie警告

[英]Silently block cookies warning with IHTMLDocument2 in Delphi

我正在使用IHTMLDocument2來抓取一組網站。 我正在創建IHTMLDocument2實例:

    var
      myDownload : TDownLoadURL;
      doc: OleVariant;
    (...)
      myDownload:= TDownLoadURL.Create(nil);
      with myDownload do
      begin
        URL:=myURL;
        Filename:= GetTempDirectory+'temp_download_url_complete2.txt';
        ExecuteTarget(nil);
      end;
(...)
      doc := coHTMLDocument.Create as IHTMLDocument2;
      doc.write(html);
      doc.close;
(...)

有一個特定的網站彈出一條消息:

允許本網站為您提供個性化信息,您是否允許它在您的計算機上放置一個小文件(稱為cookie)?

我已經改變了OS(Windows 2008 SE)Internet選項以在沒有提示的情況下阻止cookie,但是消息不斷出現。 如何在靜默模式下創建IHTMLDocument2?

如果需要禁止IHTMLDocument用戶界面或用戶通知,則需要實現IOleClientSite和定義為DISPID_AMBIENT_DLCONTROL的環境屬性。
從文檔“下載控制”

主機可以通過實現IOleClientSite和定義為DISPID_AMBIENT_DLCONTROL的環境屬性來控制下載幀,圖像,Java等的某些方面。 當調用主機的IDispatch :: Invoke方法並將dispidMember設置為DISPID_AMBIENT_DLCONTROL時,它應該在pvarResult中放置零或以下值的組合。

在這種情況下,您需要的標志是DLCTL_SILENT (也可能是DLCTL_NO_SCRIPTS )。

如前所述,主機也應該實現IDispatch.Invoke )和可選 IPropertyNotifySink (或其他COM事件接收對象),如果你想從文件(如獲取事件通知DISPID_READYSTATE為例)。

看看EmbeddedWB源代碼,看看它是如何實現的。 特別是IEParser.pasUI_Less.pas 它確實已經完全符合您的需求。


這是一個基於UI_Less的簡化演示(沒有實現IPropertyNotifySink ):

uses ..., ActiveX, MSHTML;

const
  DISPID_AMBIENT_DLCONTROL = (-5512);

type
  TUILess = class(TComponent, IUnknown, IDispatch, IOleClientSite)
    protected
    // IDispatch
    function Invoke(DispID: Integer; const IID: TGUID; LocaleID: Integer;
      Flags: Word; var Params; VarResult, ExcepInfo, ArgErr: Pointer): HRESULT; stdcall;
    // IOleClientSite
    function SaveObject: HRESULT; stdcall;
    function GetMoniker(dwAssign: Longint; dwWhichMoniker: Longint;
      out mk: IMoniker): HRESULT; stdcall;
    function GetContainer(out container: IOleContainer): HRESULT; stdcall;
    function ShowObject: HRESULT; stdcall;
    function OnShowWindow(fShow: BOOL): HRESULT; stdcall;
    function RequestNewObjectLayout: HRESULT; stdcall;
  end;

implementation

function TUILess.Invoke(DispID: Integer; const IID: TGUID; LocaleID: Integer;
  Flags: Word; var Params; VarResult, ExcepInfo, ArgErr: Pointer): HRESULT;
const
  DLCTL_NO_SCRIPTS = $00000080;
  DLCTL_NO_JAVA = $00000100;
  DLCTL_NO_RUNACTIVEXCTLS = $00000200;
  DLCTL_NO_DLACTIVEXCTLS = $00000400;
  DLCTL_DOWNLOADONLY = $00000800;
  DLCTL_SILENT = $40000000;
var
  I: Integer;
begin
  if DISPID_AMBIENT_DLCONTROL = DispID then
  begin
    I := DLCTL_DOWNLOADONLY + DLCTL_NO_SCRIPTS +
      DLCTL_NO_JAVA + DLCTL_NO_DLACTIVEXCTLS +
      DLCTL_NO_RUNACTIVEXCTLS +
      DLCTL_SILENT;
    PVariant(VarResult)^ := I;
    Result := S_OK;
  end
  else
    Result := DISP_E_MEMBERNOTFOUND;
end;

function TUILess.SaveObject: HRESULT;
begin
  Result := E_NOTIMPL;
end;

function TUILess.GetMoniker(dwAssign: Longint; dwWhichMoniker: Longint;
  out mk: IMoniker): HRESULT;
begin
  Result := E_NOTIMPL;
end;

function TUILess.GetContainer(out container: IOleContainer): HRESULT;
begin
  Result := E_NOTIMPL;
end;

function TUILess.ShowObject: HRESULT;
begin
  Result := E_NOTIMPL;
end;

function TUILess.OnShowWindow(fShow: BOOL): HRESULT;
begin
  Result := E_NOTIMPL;
end;

function TUILess.RequestNewObjectLayout: HRESULT;
begin
  Result := E_NOTIMPL;
end;

procedure TForm1.Button1Click(Sender: TObject);
const
  cHTML: WideString = '<b>test</b><script>alert("boo")</script>';
var
  Doc: IHTMLDocument2;
  DocClientSite: TUILess;
begin
  DocClientSite := TUILess.Create(nil);
  try
    Doc := coHTMLDocument.Create as IHTMLDocument2;
    try
      (Doc as IOleObject).SetClientSite(DocClientSite);
      (Doc as IOleControl).OnAmbientPropertyChange(DISPID_AMBIENT_DLCONTROL); // Invoke
      OleVariant(Doc).write(cHTML);
      Doc.close;
      ShowMessage(Doc.body.innerHtml); // Test
    finally
      (Doc as IOleObject).SetClientSite(nil);
      Doc := nil;
    end;
  finally
    DocClientSite.Free;
  end;
end;

我擔心你無法輕易隱藏這條消息。 為什么?

首先,您需要了解該消息甚至在該特定網站上顯示的原因。 簡短的回答是處理過歐盟有時在今年開始使用的cookie的新法律回合(不確定何時):

http://ico.org.uk/for_organisations/privacy_and_electronic_communications/the_guide/cookies?hidecookiesbanner=true

然后你需要意識到顯示的消息不是任何標准的彈出消息,而是硬編碼到網站中。 更糟糕的是,每個網站所有者都使用自己的方法來做到這一點。

BTW在您的網絡瀏覽器中禁用cookie不會阻止該消息顯示。 為什么? 如果網站想要查看是否有cookie,則必須向客戶端計算機發送cookie。 但是法律要求用戶在將任何cookie發送到客戶端計算機之前就會被警告使用cookie。

因此,單擊我接受使用cokies一次可能更容易,並且該消息可能不會顯示agina。 為什么? 因此,webite會創建一個永久性cookie,用於存儲您已同意使用cookie的信息。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM