mixiにログインすると、「最新情報」という欄があり、そこで「マイミクシィ最新日記」や「コミュニティ最新書き込み」などのサイト内の最新情報を確認することができます。
しかしこれが使いにくく、できればRSSリーダで他のサイトの情報と一緒に確認したいと思って調べ、見付けたのが以前紹介したmixipressというソフト。
そして、その後の調べで、mixi2rssというソフトも見付けました。
しかしこれらのソフトはどちらもCGIとして動かす物であり、動かすにはウェブサーバが必要になります。
それがどうも気に入らない。
ローカルで動かすソフトで同じようなことが出来ないかなと、前から思っていたのですが、今回はC#でmixiからHTMLを持ってくるプログラムを試しに作ってみましたので、その方法を紹介します。
IEでmixiを閲覧したときに生成されたCookieを利用し、mixiからHTMLデータを取ってくるプログラムです。
using System; using System.Runtime.InteropServices; using System.Net; [DllImport("wininet.dll", CharSet = CharSet.Auto, SetLastError = true)] private static extern bool InternetGetCookie(string lpszUrlName, string lpszCookieName, StringBuilder lpszCookieData, ref int lpdwSize); public static string GetMixiPage(Uri uri) { // サーバにリクエストを送るためのHttpWebRequestを作成 HttpWebRequest webreq = (HttpWebRequest)WebRequest.Create(uri); // Cookieを読み込む StringBuilder buf = new StringBuilder(new String('\0', 2048), 2048); int size = buf.Length; if (InternetGetCookie(uri.ToString(), null, buf, ref size) != false) { if (webreq.CookieContainer == null) webreq.CookieContainer = new CookieContainer(); webreq.CookieContainer.SetCookies(uri, buf.ToString().Replace(';', ',')); } else return "err!"; // サーバーからの応答を受信するためのHttpWebResponseを取得 HttpWebResponse webres = (HttpWebResponse)webreq.GetResponse(); // 文字コード(EUC)を指定する System.Text.Encoding enc = System.Text.Encoding.GetEncoding("euc-jp"); System.IO.Stream st = webres.GetResponseStream(); System.IO.StreamReader sr = new System.IO.StreamReader(st, enc); string data = sr.ReadToEnd(); webres.Close(); return data; }
(見れば分かると思いますが、namespaceやclassの定義部分などは省略しています)
wininetの InternetGetCookie というAPIを使ってIEがキャッシュしたCookieを取得しています。
.NET FrameworkにもCookie取得のためのAPIがあるのかもしれませんが、今回調べた限りでは見付かりませんでした。
DllImportの際のオプションの指定の仕方と、アンマネージドなAPIにバッファを渡して文字列を受け取る方法がイマイチよく理解できていないのですが、とりあえずコピペで動いたのでそれでやってます。
特に後者の方ですが、
- ref stringまたはout stringとする方法。
- 今回のようにStringBuilderを使う方法。
- MarshalクラスのAllocHGlobal/FreeHGlobalとPtrToStringAnsiを使う方法。
など、人によって様々です。
( ̄へ ̄|||) ウーム