最近、Web ブラウザー コントロール内のすべての通信を傍受して分析する必要がありました。私が使ったテクニックはあなたを助けることができると思います。
何が必要 :
私が Awesomium を使用することにしたのは、すぐに使用できる Web ブラウザー コントロールよりも多くの機能を提供するためです。私の場合、システム全体の設定の代わりに使用するプロキシを定義できます。
Fiddler Core は、通信を傍受するために使用されます。その API は、リクエストが発行されたときにインターセプト/改ざん/... する方法を提供します。私の場合、私はビジネスクラスに応答本文を転送するだけでしたが、あなたの場合、MIME タイプでフィルタリングして、HTML DOM を変更する ( HtmlAgility パックを使用する!!!!! ) か、200 以外を返すことができるはずです。画像の http ステータス。
これが私が使用したコードです。私のアプリは WPF ですが、わずかな労力で winform に適応させることができます:
public partial class App : Application
{
static App()
{
// First, we set up the internal proxy
SetupInternalProxy();
// The we set up the awesomium engine
SetupBrowser();
}
private static void SetupInternalProxy()
{
// My requirement is to get response content, so I use this event.
// You may use other handlers if you have to tamper data.
FiddlerApplication.AfterSessionComplete += FiddlerApplication_AfterSessionComplete;
FiddlerApplication.Log.OnLogString += (o, s) => Debug.WriteLine(s);
FiddlerCoreStartupFlags oFCSF = FiddlerCoreStartupFlags.Default;
//this line is important as it will avoid changing the proxy for the whole system.
oFCSF = (oFCSF & ~FiddlerCoreStartupFlags.RegisterAsSystemProxy);
FiddlerApplication.Startup(0, oFCSF);
}
private static void SetupBrowser()
{
// We may be a new window in the same process.
if (!WebCore.IsRunning)
{
// Setup WebCore with plugins enabled.
WebCoreConfig config = new WebCoreConfig
{
// Here we plug the internal proxy to the awesomium engine
ProxyServer = "http://127.0.0.1:" + FiddlerApplication.oProxy.ListenPort.ToString(),
// Adapt others options related to your needs
EnablePlugins = true,
SaveCacheAndCookies = true,
UserDataPath = Environment.ExpandEnvironmentVariables(@"%APPDATA%\MyApp"),
};
WebCore.Initialize(config);
}
else
{
throw new InvalidOperationException("WebCore should be already running");
}
}
// Here is the handler where I intercept the response
private static void FiddlerApplication_AfterSessionComplete(Session oSession)
{
// Send to business objects
DoSomethingWith(
oSession.PathAndQuery,
oSession.ResponseBody,
oSession["Response", "Content-Type"]
);
}
}
コメントで述べたように、AfterSessionComplete という別のイベント ハンドラーを使用することもできます。要件によって異なります (ヘルプを得るには、fiddler コア SDK を参照してください)。
最後に、このコードは app クラス (Winform の Program クラスに相当) から実行されます。Windows クラスで結果を使用するには、メッセージング システムを使用するか、グローバル イベントを発行する必要がある場合があります (メモリ リークに注意してください)。また、AfterSessionComplete イベントが複数のスレッドから、場合によっては同時に発生することにも注意する必要があります。UI スレッドで作業するには、ある種の Invoking を使用します。