| Remember The Milk API | 2008/02/23時点 |
|---|---|
| .NET Framework | 2.0 |
| C# | 2.0 |
| Visual Studio | 2005 |
| 名前空間 | RTMdotNET |
*1 : そもそもHTTP接続にcurlを使っているぐらいで,Windows上ではコンパイルすらできない
*2 : C#使いにしかわかりにくいような機能はほとんどあるいは全く使っていない筈なので,一般のオブジェクト指向言語使いの方なら大抵理解できると思います
2008/02/24: 公開
ライブラリAにリンクしたプログラムBを配布する場合、Bのライセンスにリバースエンジニアリングを禁止する条項を含めてはならない。(LGPLv2-6、LGPLv3-4)リンクしたプログラムの方に制限を加えたくないので.
*3 : 線引きが難しいので……
| 定数 | 意味 |
|---|---|
| API_KEY | API Key |
| SHARED_SECRET | Shared Secret |
| TOKEN | 有効な認証用Token |
Milk myMilk = new Milk(API_KEY, SHARED_SECRET);
// このfrobは後で使うので保持しておく
string frob = myMilk.GetFrob();
// 権限はread/write/deleteのいずれか
string url = myMilk.GenerateAuthUrl("delete", frob);
次に,このURLをユーザに提示してブラウザにアクセスしてもらい*4,API_KEYを使ったアプリケーションがユーザのデータを操作することを承認して貰います.Milk myMilk = new Milk(API_KEY, SHARED_SECRET); MilkAuth auth = myMilk.GetToken(frob); string TOKEN = auth.token;実際は恐らくGUIアプリケーションで,次のような流れになるのではないでしょうか.
Milk myMilk = new Milk(API_KEY, SHARED_SECRET);
MilkParameter myParameter = new MilkParameter();
myParameter.AddParameter("method", "rtm.test.echo");
MilkResponse myResponse = myMilk.CallMethod(myParameter);
例に挙げているメソッド「rtm.test.echo」のリファレンスを見るとわかりますが,リファレンスのAregumentsとは渡しているパラメータが異なっています.
Milk myMilk = new Milk(API_KEY, SHARED_SECRET);
myMilk.token = TOKEN;
MilkParameter myParameter = new MilkParameter();
myParameter.AddParameter("method", "rtm.lists.add");
myParameter.AddParameter("timeline", "19417052");
myParameter.AddParameter("name", "新規リスト");
MilkResponse myResponse = myMilk.CallAuthedMethod(myParameter);
Milkオブジェクトのtokenフィールドに認証用の文字列であるTOKENを渡し,Milk myMilk = this.GetMilk(); MilkResponse myResponse = myMilk.rtm_test_echo();認証が必要なメソッドでも,次のように書けます.
Milk myMilk = new Milk(API_KEY, SHARED_SECRET);
myMilk.token = TOKEN;
MilkResponse myResponse = myMilk.rtm_lists_add("19417052", "新規リスト", null);
rtm.lists.addメソッドを公式リファレンスで見るとArgumentsのfilterがOptional(省略可)になっていますが,このようなパラメータは,nullを渡すことで省略できます.Milk myMilk = new Milk(API_KEY, SHARED_SECRET); myMilk.token = TOKEN; MilkResponse myResponse = myMilk.rtm_lists_getList();これの実体が次のXMLドキュメントだとします*7.
<?xml version="1.0" encoding="UTF-8"?> <rsp stat="ok"> <lists> <list id="4321841" name="Inbox" deleted="0" locked="1" archived="0" position="-1" smart="0" sort_order="0"/> <list id="4321842" name="いつかやる" deleted="0" locked="0" archived="0" position="0" smart="0" sort_order="0"/> <list id="4321843" name="プロジェクト" deleted="0" locked="0" archived="0" position="0" smart="0" sort_order="0"/> </lists> </rsp>この場合,例えばリスト名をリストアップするなら次のようにします.
MilkResponse myResponse = myMilk.rtm_lists_getList();
List<string> ListNames = new List<string>();
System.Xml.XmlDocument xDoc = myResponse.ToXML();
System.Xml.XmlNodeList xList = xDoc.SelectNodes("/rsp/lists/list");
foreach(System.Xml.XmlNode xNode in xList){
string name = xNode.SelectSingleNode("./@name").InnerText;
ListNames.Add(name);
}
Remember The Milk APIの公式リファレンスでは,例えば上記のrtm.lists.getListメソッドだと,
<lists>
<list id="100653" name="Inbox"
deleted="0" locked="1" archived="0" position="-1" smart="0" />
<list id="387549" name="High Priority"
deleted="0" locked="0" archived="0" position="0" smart="1">
<filter>(priority:1)</filter>
</list>
...
</lists>
といったようにルートノードがlistsとして表記されていますが,実際はrspノードがルートノードである点は注意が必要です.
MilkResponse myResponse = myMilk.rtm_lists_getList();
System.Xml.XmlNode xRoot = myResponse.ToResponseRootNode();
System.Xml.XmlNodeList xList = xRoot.SelectNodes("./list");
このようにToResponseRootNodeメソッドによりrspノードの次のノードを取得することもできます.
Milk myMilk = new Milk(API_KEY, SHARED_SECRET);
myMilk.token = TOKEN;
MilkResponse myResponse = myMilk.rtm_lists_add("19417052", "新規リスト", null);
このレスポンスが次のXMLドキュメントだとします.<?xml version="1.0" encoding="UTF-8"?> <rsp stat="ok"> <transaction id="2115266848" undoable="0"/> <list id="2650052" name="新規リスト" deleted="0" locked="0" archived="0" position="0" smart="0" sort_order="0"/> </rsp>これに対して,MilkResponseオブジェクトを通じて次の操作が可能です.
Milk myMilk = new Milk(API_KEY, SHARED_SECRET);
myMilk.token = TOKEN;
// timeline作成
string timeline = myMilk.CreateTimeline();
MilkResponse myResponse = myMilk.rtm_lists_add(timeline, "新規リスト", null);
// トランザクションノードを持つかどうかの判断
if (myResponse.IsTransaction){
// Undoできるかどうかの判断
if (myResponse.IsUndoable){
// トランザクションIDの取得
string transactionId = myResponse.GetTransactionId();
// Undo
myMilk.Undo(timeline, transactionId);
}
}
Milk myMilk = new Milk(API_KEY, SHARED_SECRET);
myMilk.token = TOKEN;
try{
MilkResponse myResponse = myMilk.rtm_lists_add("19417052", "新規リスト", null);
} catch(MilkResponseErrorException ex) {
if (ex.ResponseDetail.icode == 300){
Console.WriteLine("タイムラインが不正です");
} else {
Console.WriteLine(ex.ToString());
}
}
| メソッド | 概要 |
|---|---|
| Milk(string apikey, string sharedsecret) | API KeyとShared Secretを設定して初期化 |
| Milk() | 何も設定しないで初期化(後で設定する必要有り) |
| MilkResponse CallMethod(MilkParameter parameter) | parameterの値にapi_key,api_sigを追加しリクエストを発行 |
| MilkResponse CallAuthedMethod(MilkParameter parameter) | parameterの値にauth_token, api_key, api_sigを追加してリクエストを発行 |
| string GetFrob() | frob文字列を取得 |
| string GenerateAuthUrl(string perms, string frob) | read/write/deleteの権限文字列とfrob文字列から認証用URLを生成 |
| MilkAuth GetToken(string frob) | frob文字列から認証用tokenを取得 |
| MilkAuth CheckToken(string userToken) | 認証用tokenが有効かチェック(戻り値がnullなら認証失敗) |
| string CreateTimeline() | 新規timeline作成 |
| bool Undo(string timeline, string transaction) | timelineとtransaction idを使ってUndoを試行.正否をTrue/Falseで返す |
| rtm_* | Remember The Milk APIの呼び出し.パラメータはインテリセンスもしくはRemember The API公式リファレンスの各メソッドの項目を参照 |
| フィールド | 概要 |
|---|---|
| API_KEY | API Key.コンストラクタで初期化していない場合直接値を設定する |
| SHARED_SECRET | Shared Secret.コンストラクタで初期化していない場合直接値を設定する |
| proxy | WebProxyオブジェクト.プロキシを設定する場合は直接値を設定する.nullの場合*8は,プロキシを設定しない |
| timeout | タイムアウト時間をミリ秒で指定.0の場合*8は,タイムアウト時間を設定しない |
| token | 認証用token.認証が必要なメソッドを使う前には必ず設定しなければならない |
| メソッド | 概要 |
|---|---|
| string ToString() | レスポンスをそのままの形で返す |
| XmlDocument ToXML() | レスポンスをXMLオブジェクトに変換して返す |
| XmlNode ToResponseRootNode() | レスポンスをXMLオブジェクトに変換し,rsp以下のノードを返す |
| string GetTransactionId() | Transaction Idがある場合はそれを返す.無い場合はnullを返す |
| フィールド | 概要 |
|---|---|
| IsTransaction | レスポンスがTransactionを持つかどうか |
| IsUndoable | レスポンスがUndo可能かどうか |
| フィールド | 概要 |
|---|---|
| string token | 認証用token |
| string perms | tokenの権限 |
| string id | ユーザのユニークID |
| string username | ユーザのログイン用名前 |
| string fullname | ユーザのフルネーム |
| フィールド | 概要 |
|---|---|
| code | エラーコード |
| icode | エラーコードをint型にParseしたもの.parse失敗時は-1が返る |
| msg | エラーメッセージ |
| メソッド | 概要 |
|---|---|
| string ToString() | エラーコードとエラーメッセージを一行にまとめて文字列化 |
| フィールド | 概要 |
|---|---|
| MilkError ResponseDetail | エラーの内容を表すオブジェクト |
*4 : アプリケーション内にブラウザを埋め込んで表示するとか標準のブラウザにURLを渡して起動するとか何でもいいですが
*5 : ただし,あらかじめMilkオブジェクトのtokenフィールドに適切な値を設定する必要はあります
*6 : 50個あるので全部試したわけではありません
*7 : idなどは架空です
*8 : デフォルト
*9 : 実装方法とかバグとか著作権侵害とか
*10 : トップページにアドレスを掲載しています