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

数日前からGoogleリーダーの認証まわりに変更があったようで、
以前投稿した内容ではRSS(というかAtom)が取得できなくなっていた(T T)

残念ながら英語のドキュメントを細部まで把握できる読解力がないので諦めていたが、
早々に日本語で解説されている方がいらっしゃったので参考にさせて頂きました。

http://intre.net/item_6712.html

要するに、、、

  • クッキーが不要になった(SID・LSID)
  • HTTPヘッダにAuthトークンが必要になった

ということらしい。

C#でGoogleリーダーのRSSを取得する2の変更点としては↓の感じ。

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;
        // SIDは不要になりますた
        // private string SID;
        // LSIDは不要になりますた
        // private string LSID;
        private string Auth;

        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ヘッダにAuthをぶち込む
			request.Headers.Add(@"Authorization", @"GoogleLogin auth=" + this.Auth);
            // 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は放置してAuthを取得
                    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)
                            {
                                // SIDは不要になりますた
                                // case "SID":
                                //     this.SID = match.Groups[2].Value;
                                //     break;
                                // LSIDは不要になりますた
                                // case "LSID":
                                //     this.LSID = match.Groups[2].Value;
                                //     break;
                                case "Auth":
                                     this.Auth = match.Groups[2].Value;
                                     break;
                            }
                        }
                    }
                }
            }
        }
    }
}

テストしてみたところ、今までどおりフィードの取得に成功しました。

しかしGoogleのAPI変更のアナウンスは見つけづらいッス。。。

スポンサーリンク

シェアする

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

フォローする

スポンサーリンク

コメント

  1. ゆゆ より:

    サンプルを使ってjavaでプログラミングをしてみていますが、
    java.io.FileNotFounfException :http://google.com/
    というエラーでポストした後にゲットできません。
    何か注意点などがありましたら、ご教授お願いします。

  2. ぬっき~ より:

    @ゆゆ

    コメントありがとうございます。

    >ポストした後にゲットできません。

    フィードが取得できないということでしょうか?

    javaは詳しくないのですが、まずは認証時のレスポンスが
    SID=xxxxxxxxxxxxxxxxxxxxxxxxxx
    LSID=xxxxxxxxxxxxxxxxxxxxxxxxx
    Auth=xxxxxxxxxxxxxxxxxxxxxxxxx
    のように正しく取得できいるか確認してみてください。

    ちなみに061行目のリクエストを送るURLは
    https://www.google.com/accounts/ClientLogin
    です。

    chromeだと正しく表示されないようなので・・・

  3. ゆゆ より:

    遅くなりましたが、認証周りは正しくできました。ありがとうございます。
    しかし、もう一つつまずいてしまったのですが、聞いていただけますか?
    未読の記事を既読に変更したいです。
    自分なりに調べたのですがうまくいかず、400.That’s an error.と返ってきてしまいます。
    送信した内容は以下のものです。
    http://www.google.com/reader/api/0/edit-tag?
    client=-&
    a=user/-/state/com.google/read&
    s=feed/http://rss.yomiuri.co.jp/rss/yol/topstories&
    i=tag:google.com,2005:reader/item/d97b11e1a30de5ee&
    T=*******
    自分なりにFireFoxのHTTPheaderを使って送信内容を見たりもしているのですが。。。。
    うまくいきません。
    何か知っている事がありましたら教えてください。お願いします。

  4. ぬっき~ より:

    @ゆゆ

    認証うまくいって良かったですね(^ ^)

    既読処理についてですが、私がC#で動作確認した時のポイントです。

    ①アクセスURL
    http://www.google.com/reader/api/0/edit-tag?client=CLIENT
    CLIENT : 任意のクライアント名

    ②POSTデータ
    i=ENTRY&a=user/-/state/com.google/read&T=TOKEN
    ENTRY : 既読にしたいエントリのID
    (tag:google.com,2005:reader/item/xxxxxxxxxxxxxxxx)
    TOKEN : 取得したトークン

    ③HTTPヘッダに認証を追加(フィード取得時と同様)
    Authorization:GoogleLogin auth=xxxxxxxxxxxxxxxxxxxxxxxxxx

    ちなみに、

    追加は a=
    削除は r=
    既読は user/-/state/com.google/read
    スターは user/-/state/com.google/starred
    共有は user/-/state/com.google/broadcast

    で、それぞれ同じやり方です。

    なお、 edit-tag は(たぶん)エントリ毎の処理ですので、
    一括で処理する場合は別のAPIを使うことになると思います。

  5. ゆゆ より:

    助かりました。
    GETとPOSTで勘違いしていた所がありました。
    URLの?~がすべてデータを送信するPOSTだと思っていました。しかし、それはGETでPOSTはURLとは別にデータをp送信するのですね。
    完全に勉強不足でした。でもこれでHTTPヘッダーの見方もよくわかったので、なんとかやっていけそうです。
    本当にありがとうございました。

  6. ぬっき~ より:

    @ゆゆ

    どういたしまして。

    頑張ってくださいね!