艦これのバトル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 のダウンロード機能とかつける予定。