内蔵 WebBrowser を Fiddler でトラップする方法

艦これのバトルJSONを再解析(祥鳳改小破編) | Moonmile Solutions Blog
http://www.moonmile.net/blog/archives/5517

の続きで、ブラウザの通信をトラップするのに InternetSetOption を使っていたのですが、URLMonInterop.SetProxyInProcess を使ってもできるよ、という話があったので試しに。InternetSetOption 関数自体は結構古くからある方法で定番のようです。たぶん、内部的にも同じことをやっているのかなと。

private void Window_Loaded(object sender, RoutedEventArgs e)
{
    FiddlerApplication.Startup(PROXY_PORT, false, true);
    // SetIESettings("localhost:" + PROXY_PORT);
    URLMonInterop.SetProxyInProcess("127.0.0.1:" + PROXY_PORT.ToString(), "");
    FiddlerApplication.AfterSessionComplete += FiddlerApplication_AfterSessionComplete;
    this.wb.Navigate(URL_LOGIN);
}

こんな感じで1行で済みます。ちなみに InternetSetOption 関数を使った場合はこんな感じ。

internal struct INTERNET_PROXY_INFO
{
    public int dwAccessType;
    public IntPtr proxy;
    public IntPtr proxyBypass;
}
[DllImport("wininet.dll", SetLastError = true)]
public static extern bool InternetSetOption(IntPtr hInternet, int dwOption, IntPtr lpBuffer, int lpdwBufferLength);

private void SetIESettings(string proxyUri)
{
    const int INTERNET_OPTION_PROXY = 38;
    const int INTERNET_OPEN_TYPE_PROXY = 3;

    INTERNET_PROXY_INFO proxyInfo;
    proxyInfo.dwAccessType = INTERNET_OPEN_TYPE_PROXY;
    proxyInfo.proxy = Marshal.StringToHGlobalAnsi(proxyUri);
    proxyInfo.proxyBypass = Marshal.StringToHGlobalAnsi("local");

    var proxyInfoSize = Marshal.SizeOf(proxyInfo);
    var proxyInfoPtr = Marshal.AllocCoTaskMem(proxyInfoSize);
    Marshal.StructureToPtr(proxyInfo, proxyInfoPtr, true);
    InternetSetOption(IntPtr.Zero, INTERNET_OPTION_PROXY, proxyInfoPtr, proxyInfoSize);
}

サンプルはこんな感じ

https://github.com/moonmile/KcAgent/tree/master/KcAgentBrowser

F12キーを押すとデバッグ用のウィンドウを開きます。そのうち、JSON 解析と swf/mp3 のダウンロード機能とかつける予定。

カテゴリー: 開発, 艦これ パーマリンク