2017-08-22 2 views
1

Ich versuche CefSharp zu verwenden, um eine URL zu besuchen und bestimmte Ressourcen zu erfassen, die während des Ladens einer bestimmten Seite abgerufen werden. Vermutlich als Stream oder Byte-Array pro Ressource.Verwenden von CefSharp zum Erfassen von Ressourcenantwortdaten (Text)

CefSharp stellt die Schnittstelle IRequestHandler zur Verfügung. Sie können eine Klasse erstellen, die diese Schnittstelle implementiert, um auf Request/Response-Ereignisse zu antworten, aber den Antworttextkörper in keiner Weise enthält.

Antwort

1

Werfen Sie einen Blick auf GetResourceResponseFilter in Ihrer Implementierung von IRequestHandler. GetResourceResponseFilter gibt eine IResponseFilter zurück, die Ihnen die Möglichkeit bietet, alle Antworten zu erfassen. Sie müssen Ihre eigenen IResponseFilter implementieren, zum Glück gibt es reichlich Beispiele.

ExampleIResponseFilter Implementierung aus dem GitHub-Projekt CefSharp übernommen.

public class MemoryStreamResponseFilter : IResponseFilter 
{ 
     private MemoryStream memoryStream; 

     bool IResponseFilter.InitFilter() 
     { 
      //NOTE: We could initialize this earlier, just one possible use of InitFilter 
      memoryStream = new MemoryStream(); 

      return true; 
     } 

     FilterStatus IResponseFilter.Filter(Stream dataIn, out long dataInRead, Stream dataOut, out long dataOutWritten) 
     { 
      if (dataIn == null) 
      { 
       dataInRead = 0; 
       dataOutWritten = 0; 

       return FilterStatus.Done; 
      } 

      dataInRead = dataIn.Length; 
      dataOutWritten = Math.Min(dataInRead, dataOut.Length); 

      //Important we copy dataIn to dataOut 
      dataIn.CopyTo(dataOut); 

      //Copy data to stream 
      dataIn.Position = 0; 
      dataIn.CopyTo(memoryStream); 

      return FilterStatus.Done; 
     } 

     void IDisposable.Dispose() 
     { 
      memoryStream.Dispose(); 
      memoryStream = null; 
     } 

     public byte[] Data 
     { 
      get { return memoryStream.ToArray(); } 
     } 
    } 

Jetzt in Ihrem GetResourceResponseFilter Methode:

private Dictionary<ulong, MemoryStreamResponseFilter> responseDictionary = new Dictionary<ulong, MemoryStreamResponseFilter>(); 
public IResponseFilter GetResourceResponseFilter(IWebBrowser browserControl, IBrowser browser, IFrame frame, IRequest request, IResponse response) 
{ 
     var dataFilter = new MemoryStreamResponseFilter(); 
     responseDictionary.Add(request.Identifier, dataFilter); 
     return dataFilter; 
} 

Dann in OnResourceLoadComplete

public void OnResourceLoadComplete(IWebBrowser browserControl, IBrowser browser, IFrame frame, IRequest request, IResponse response, UrlRequestStatus status, long receivedContentLength) 
{  
    MemoryStreamResponseFilter filter; 
    if (responseDictionary.TryGetValue(request.Identifier, out filter)) 
    { 
     var data = filter.Data; //This returns a byte[] 
     //File.WriteAllBytes("c:/save/path", data); 
    } 
} 

Sie können die Eigenschaften innerhalb der IRequest und IResponse Parameter verwenden, um zu beurteilen, was Sie filtern möchten.

+0

Danke für die Rückmeldung und Beispiele TEK. Ich bin jetzt viel näher an meiner endgültigen Lösung. Ich hatte die IResponseFilter-Klasse bereit, wusste aber nicht, wie/wo ich sie verwenden sollte. Ich frage mich nur, warum die bestimmte Ressource, nach der ich suche, niemals im OnResourceLoadComplete-Ereignis auftaucht. Ich vermute, es ist ein Javascript-Post auf dem Server. Irgendwelche speziellen benötigt, um diese zu erfassen? Ich kann sie alle in den Chrome-Entwicklertools beim Surfen auf der Website sehen. –

+0

@FritsDonkerbroek Es sollte alles erfassen. Sie können versuchen, ein einfaches 'if (response.ResourceType == ResourceType.Xhr)' hinzuzufügen, das die 'XMLHttpRequest' (die ich vermute, was Sie wollen) fangen sollte. Wenn dies der Fall ist, müssen Sie das "responseDictionary" regelmäßig abfragen, da 'OnResourceLoadComplete' jedes Mal ausgelöst wird, wenn eine Ressource geladen wird (einschließlich einer dynamischen' Xhr'). Sie können auch auf "response.ResponseHeaders" schauen und sehen, ob Sie zu Ihnen zurückkommen. – TEK

+0

Ja, es sind Xhr-Daten, nach denen ich suche. Ich habe die URLs für die Xhr-Anfragen protokolliert und sehe einige von denen, die ich in Chrome Dev Tools sehe, aber nicht die, nach denen ich suche. Bis heute ist das einzige, was ich gefunden habe, das diese speziellen Daten erfasst, SlimerJs, was nicht ideal ist. Ich werde weiter herum graben, aber ich vermute, dass dies eine verlorene Sache ist. Danke nochmal für die Hilfe. –

Verwandte Themen