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