Niedawno miałem obowiązek przechwytywać i analizować WSZYSTKIE komunikaty w kontrolce przeglądarki. Myślę, że technika, której użyłem, może ci pomóc.
Co trzeba:
- Awesomium.Net: kontrola oparta na silniku Chromium NET
- Fiddler Core: HTTP proxy w pamięci, który pozwala na monitorowanie komunikacji HTTP.
- HtmlAgility pack: w zależności od wybranego rozwiązania, HAP może pomóc dynamicznie zmieniać DOM treści HTML, w sposób FAR WIĘKSZY NIEZAWODNY niż regex.
Wybieram korzystanie z Awesomium, ponieważ zapewnia znacznie więcej funkcji niż po wyjęciu z pudełka kontroli przeglądarki. W moim przypadku pozwala mi to zdefiniować proxy zamiast całego systemu.
Fiddler Core służy do przechwytywania komunikacji. Interfejs API zapewnia sposoby przechwytywania/manipulowania/... po wysłaniu żądania. W moim przypadku przesyłałem tylko odpowiedzi do moich klas biznesowych, ale w twoim przypadku powinieneś być w stanie filtrować na typie MIME, aby zmienić HTML DOM (Użyj pakietu HtmlAgility !!!!!) lub zwróć brak statusu http dla obrazów.
Oto kod, którego użyłem. Moja aplikacja jest WPF, ale można ją dostosować do winform z kilku działań:
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"]
);
}
}
Jak powiedział w komentarzu, można użyć innego programu obsługi zdarzeń, która AfterSessionComplete. Będzie to zależało od twoich wymagań (przeczytaj klucz SDK fiddlera, aby uzyskać pomoc).
Ostatnie słowo: ten kod jest uruchamiany z klasy aplikacji (odpowiednik klasy Program w Winform). Może być konieczne użycie systemu przesyłania komunikatów lub opublikowanie zdarzenia globalnego (uwaga na wyciek pamięci) w celu użycia wyniku w klasie okna. Musisz także pamiętać, że zdarzenie AfterSessionComplete jest uruchamiane z wielu wątków, czasami jednocześnie. Użyjesz jakiegoś rodzaju wywoływania do pracy w wątku interfejsu użytkownika.
Może chcesz nie-chciwy +? Kwantyfikator: '" "' –
AKX
Ahhh! Parsowanie HTML za pomocą Regex! http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags – annonymously