読者です 読者をやめる 読者になる 読者になる

空談録

http://artfulplace.net/blogs/ からひっこしつつ

すごい今更だけどOneNote service APIがアップデートされてた

アナウンスありましたっけこれ…とRSS読み返してますけど謎
実は私が知らなかっただけ…!?

というわけでQuick Notebookに追加できてただけの使い道不明のOneNote service APIと思っていたまま半年ほど経過しましたが2か月くらい前にGETとかできるようになってたみたいです
Office Lensとかもこのあたりの影響でアップデートしてただけだったのか…

そして実際に試してみてPOSTはまだしもGETはクールすぎて笑うしかできないAPIなのでありました

というわけでとりあえず見ていきましょう

APIリファレンスの変更点とか

OneNote API リファレンスにある通りnotebooks, sectiongroups, sectionsの3つが増えています
notebooksはそのままでユーザーに関連付けられてるノートブックの取得、sectiongroupsはノートブック内のセクショングループ、sectionsはセクションですね
初期はPOST /v1.0/pagesだけだったのでだいぶ増えたなぁと
まあCOMで見てても大して変わりませんけど

どうでもいいですがMSDNのリファレンスがそれなりにまともな日本語です。この手のやつで日本語対応してるの久々です
えっ? /pagesのGETがリンクじゃないって? 踏み込んじゃならねぇ領域に(以下略)
英語でもリンクじゃないです。サイドバーが死んでるのはいつものことなのでその辺は英語で見ると吉

それとOAuthのスコープが増えました。っていうより複雑怪奇になった気が…
当初はoffice.onenote_createだけだったのですがさらにoffice.onenote、office.onenote_update_by_app、office.onenote_updateの3つが増えています
個人的にはonenote_update_by_appの存在意義が不明ですがきっと禁則事項なのでしょう

それぞれのスコープはこんな感じです
・office.onenote : 読み取り専用。ノートブックとかセクションの情報は取れるけど変更できない
・office.onenote_update_by_app : そのアプリで作成したページだけに読み取り、変更が許可される
・office.onenote_update : 存在するノートブックやセクションに対しすべての操作が許可される
・office.onenote_create : すべての読み取り + 新規ページ、ノートブックの作成が可能

update_by_appはそもそもcreateがない限りセクション作成も何もできないので必然的に作成するためにはcreateのスコープが必要です
しかしcreateのスコープは現状すべてのリクエストが行えるのでupdate_by_appが要らない子に
もしや2つやると制約が…?
おそらくcreateのスコープの読み取り権限消したいんでしょうけどこれじゃさすがに…

ちなみにupdateについてもそもそも変更するPOSTリクエストが存在しないので現状読み取り専用と大差ないです
(ここまでもこの後も2014/09/10現在)
うーん…v1.1なりでスコープ分ければよかったんじゃないですかね…

とりあえずレスポンス拾ってみた

とはいっても公開できる感じでもないしなーという
MSDNのリファレンスのExampleと同じJSONを返してくれるので、返ってくるレスポンスだけが頼りな某APIとかとは比べ物にならないほど実装も楽です
ちなみにodata.contextで返してくれるのは.edmxファイルっていうEntity Frameworkのスキーマみたいなものらしいです(詳しく知らないで書いているけど大丈夫なのか)

valueは複数ノートブックがあればその分だけ返してくれると思います
あと各レスポンスにその子要素を取得するためのURLが含まれているのでIDからいちいち生成しなくてもいい感じです
たとえば/notebooksのsectionsUrlとsectionGroupsUrlはその中身をリクエストすることで返してくれます

linksのoneNoteClientUrlはそれを実行するとアプリケーションのほうで開いてoneNoteWebUrlはOneNote Web Appが開くと思われます
またselfのURLはそのオブジェクトが取得できるURLが入っています

そしてここからが厳しいところ
さっきURLになってないと言ったGET /pagesですけど、実は/sectionsのレスポンスの中にそのセクションのページを取得すると思われるpagesUrlが含まれています
で、このURLでリクエストService Unavailableと帰ってきます
レスポンスの中身は
code : 10002,
message : The service is currently unavailable. Please try again later.
@api.url : http://go.microsoft.com/fwlink/?LinkID=400805

ふむ、現在利用できないから後で試せと
いつつかえるのかもわからない機能を追加するアプリもないとは思いますけども
たたけないなら返さなきゃいいのにとものすごく思うのですが私だけでしょうか
フィールドの変更があれなら空文字でもいい気が…

まあそういうことで、つまるところGETはノートブックの名前とセクション名とセクショングループが取れるよ!くらいしか使えるようになっていないのでありました

ああでもPOSTは/pagesでセクション選べますし、ノートブックの作成もセクションの作成もできるのでページの追加の幅は確実に広がったと思います
POST周りの実装は面倒なのでやりません


あと書いてませんけど$orderbyとかがsectionsで使えるらしいのですがおそらくリンクじゃない"OneNote supported OData query operators for GET pages"のところだと思うので追加されたらまた調べます
containsとかselectとか言われてもまったく記法がわかりません

ところでこれアップデートされたことをどうやって知ればいいんでしょうか
って思って調べたらOneNote Dev Blog - Site Home - MSDN Blogsを見ればいいらしいですね
とりあえず追っておきます…

pagesとか取れればOneNoteのデータ使って~とかもできそうなんですけどねー
JSONなので地獄のとかを見なくてよさそうだし早く来ないかなぁという
COMも楽しかったような気がしますが使いにくさがやばい

この辺で