続きです。
とりあえず前回のコードをメソッド Login() にまとめてしまいます。
クラスの名前は「GoogleReader」とでもしておくことに。
コードの変更点として、SIDとLSIDをクラスのプライベートなプロパティへ。
(C#にはグローバル変数という言葉はないらしい・・・)
public class GoogleReader { private string SID; private string LSID;
これでログイン処理が成功すれば内部から
- this.SID
- this.LSID
てな感じで使える筈。
さて、フィードを取りにいってみませう。
ますは HttpWebRequest を作成。
HttpWebRequest request = (HttpWebRequest)WebRequest.Create( @"https://www.google.com/reader/atom/user/-/state/com.google/reading-list");
今回は「すべてのアイテム」を見に行ってます。
(https://www.google.com/reader/atom/user/-/state/com.google/reading-list)
とりあえずGETパラメータはなくても取得できますが、デフォルトでアイテム数が20になります。
変更したい場合は次のように。(例:200個)
HttpWebRequest request = (HttpWebRequest)WebRequest.Create( @"https://www.google.com/reader/atom/user/-/state/com.google/reading-list?n=200 ");
詳しくは前回同様下記サイト様を参考にしてみてください。
非公式:Google Reader API(グーグルリーダーAPI)(翻訳)
次にクッキーをぶちこみます。
request.CookieContainer = new CookieContainer(); request.CookieContainer.Add(new Cookie("SID", this.SID, "/", @"www.google.com")); request.CookieContainer.Add(new Cookie("LSID", this.LSID, "/", @"www.google.com"));
SIDだけでも良いという情報が多々ありましたが、試したところLSIDも一緒にぶちこんでやらんとダメのようです。
GoogleでAPI仕様の変更でもあったのでしょう。
あとは HttpWebResponce → ResponceStream → XmlReader といった感じでセオリー通りに進み、取得したXMLをパースしてあげます。
以下、コード全文。
using System; using System.Text; using System.IO; using System.Net; using System.ServiceModel.Syndication; using System.Text.RegularExpressions; using System.Xml; namespace GoogleReader { public class GoogleReader { public SyndicationFeed Feed; private string SID; private string LSID; public void GetFeed() { // ログイン処理 Login(); // HTTPリクエストを作成 HttpWebRequest request = (HttpWebRequest)WebRequest.Create( @"https://www.google.com/reader/atom/user/-/state/com.google/reading-list"); // クッキーをぶち込む request.CookieContainer = new CookieContainer(); request.CookieContainer.Add(new Cookie("SID", this.SID, "/", @"www.google.com")); request.CookieContainer.Add(new Cookie("LSID", this.LSID, "/", @"www.google.com")); // HTTPレスポンスを取得 HttpWebResponse responce = (HttpWebResponse)request.GetResponse(); // レスポンスのストリームを取得 using (Stream responcestream = responce.GetResponseStream()) // XMLリーダーを作成 using (XmlReader reader = XmlReader.Create(responcestream)) { // フィードを読込 this.Feed = SyndicationFeed.Load(reader); // XMLリーダーを閉じる reader.Close(); // ストリームを閉じる responcestream.Close(); // HTTPレスポンスを閉じる responce.Close(); } } private void Login() { // POSTするパラメータの文字列 string post_string = string.Format("Email={0}&Passwd={1}", "hogehoge@gmail.com", "password"); // バイト配列に変換(Encoding.ASCII使ってるので日本語とか入れないように) byte[] postbytes = Encoding.ASCII.GetBytes(post_string); // HTTPリクエストを作成 HttpWebRequest request = (HttpWebRequest)WebRequest.Create(@"https://www.google.com/accounts/ClientLogin"); // メソッドはPOST request.Method = "POST"; // POSTの時のお決まり(フォームデータセット) request.ContentType = "application/x-www-form-urlencoded"; // データ長をセット request.ContentLength = postbytes.Length; // リクエスト用のストリームを作成 using (Stream requeststream = request.GetRequestStream()) { // ストリームにPOST文字列を変換したバイト配列をぶっこむ requeststream.Write(postbytes, 0, postbytes.Length); // ストリームを閉じる requeststream.Close(); // HTTPレスポンスを取得 HttpWebResponse responce = (HttpWebResponse)request.GetResponse(); // レスポンスのストリームを取得 using (Stream responcestream = responce.GetResponseStream()) // ストリームリーダーを作成 using (StreamReader reader = new StreamReader(responcestream)) { // ストリームの中身を全部読み込む string result = reader.ReadToEnd(); // ストリームリーダーを閉じる reader.Close(); // ストリームを閉じる responcestream.Close(); // HTTPレスポンスを閉じる responce.Close(); // SIDとLSIDを取得 Regex regex = new Regex(@"([^=]+)=(.+)", RegexOptions.Compiled); foreach (string item in result.Split('\n')) { if (regex.IsMatch(item)) { Match match = regex.Match(item); switch (match.Groups[1].Value) { case "SID": this.SID = match.Groups[2].Value; break; case "LSID": this.LSID = match.Groups[2].Value; break; } } } } } } } }
ご覧の通り例外処理なんぞしておりませんので、適宜処理願います・・・・
ちなみに「RSSを取得する」と言いながら、実際取得してるのは Atom1.0 です。
ここでは SyndicationFeed を使っているので、.NET Framework 3.5 が必須 & 参照設定に System.ServiceModelWeb を追加する必要があります。
XmlDocument や XmlNode を使って自前でゴリゴリやるのも楽しいかもしれませんw
取得した SyndicationFeed は下のようにぶんわましてあげれば宜しいかと。
// エントリをまわしてタイトルを表示させるテスト foreach (SyndicationItem item in Feed.Items) { Console.WriteLine(item.Title.Text); }
とりあえずこんな感じでGoogleリーダーの購読RSSは一応取得できました。
FirefoxプラグインのFireBugでXHRの挙動を観察してみたところ、他にもイロイロな隠しAPI(!?)がありそうな雰囲気。
でも英文苦手なので仕様を把握するのはとても面倒。。。
まあ素人の遊びということで大目にみてくださいw