数日前から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変更のアナウンスは見つけづらいッス。。。

コメント
サンプルを使ってjavaでプログラミングをしてみていますが、
java.io.FileNotFounfException :http://google.com/
というエラーでポストした後にゲットできません。
何か注意点などがありましたら、ご教授お願いします。
@ゆゆ
コメントありがとうございます。
>ポストした後にゲットできません。
フィードが取得できないということでしょうか?
javaは詳しくないのですが、まずは認証時のレスポンスが
SID=xxxxxxxxxxxxxxxxxxxxxxxxxx
LSID=xxxxxxxxxxxxxxxxxxxxxxxxx
Auth=xxxxxxxxxxxxxxxxxxxxxxxxx
のように正しく取得できいるか確認してみてください。
ちなみに061行目のリクエストを送るURLは
https://www.google.com/accounts/ClientLogin
です。
chromeだと正しく表示されないようなので・・・
遅くなりましたが、認証周りは正しくできました。ありがとうございます。
しかし、もう一つつまずいてしまったのですが、聞いていただけますか?
未読の記事を既読に変更したいです。
自分なりに調べたのですがうまくいかず、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を使って送信内容を見たりもしているのですが。。。。
うまくいきません。
何か知っている事がありましたら教えてください。お願いします。
@ゆゆ
認証うまくいって良かったですね(^ ^)
既読処理についてですが、私が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を使うことになると思います。
助かりました。
GETとPOSTで勘違いしていた所がありました。
URLの?~がすべてデータを送信するPOSTだと思っていました。しかし、それはGETでPOSTはURLとは別にデータをp送信するのですね。
完全に勉強不足でした。でもこれでHTTPヘッダーの見方もよくわかったので、なんとかやっていけそうです。
本当にありがとうございました。
@ゆゆ
どういたしまして。
頑張ってくださいね!