最近,我需要拦截和分析网络浏览器控件中的所有通信。我认为我使用的技术可以帮助你。
你需要什么:
我选择使用 Awesomium 是因为它提供了比开箱即用的 Web 浏览器控件更多的功能。就我而言,它允许我定义要使用的代理而不是系统范围的设置。
Fiddler Core 用于拦截通信。它的 API 提供了在发出请求时拦截/篡改/...的方法。在我的情况下,我只是将响应正文转发到我的业务类,但在你的情况下,你应该能够过滤 mime-type 以更改 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 的另一个事件处理程序。这取决于您的要求(阅读提琴手核心 SDK 以获得帮助)。
最后一句话:此代码从应用程序类(相当于 Winform 中的 Program 类)运行。为了在 windows 类中使用结果,您可能需要使用消息传递系统或发布全局事件(注意内存泄漏)。您还必须知道 AfterSessionComplete 事件是从多个线程触发的,有时是同时触发的。您将使用某种 Invoking 在 UI 线程中工作。