C#でGoogleリーダーのRSSを取得する2

続きです。

とりあえず前回のコードをメソッド 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

スポンサーリンク

シェアする

  • このエントリーをはてなブックマークに追加

フォローする

スポンサーリンク