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

空談録

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

OneNote APIのアップデート その3

個人的にはすごいタイムリーな話題が飛んできました
(ブログの流れ的に)
当ブログではOneNote開発を応援しています!(突然のなんたら)

OneNote APIについて今までMSDN上のリファレンスページが存在するだけでしたが、今回アップデートされてかっこいいDeveloper Centerが追加されました
ついでにRESTでリラックスも消えてしまった…

また、betaのほうにGET /pages/{id}/content が追加されました。これでついに使える子に…!

よく見たらOneNote service APIからOneNote APIになった気がします

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

OneNote Developer Center

そもそもOneNoteの開発ってOnetasticみたいなのを除けば闇(しかも2013で使えるのかいまだ不明)なのしかないので当然といえば当然ですがDeveloper CenterではOneNote APIのみが扱われます

現状、API ReferenceはMSDNのリファレンスと違い、英語のみ?となります(日本語はとりあえずない)
ただし、betaなどの情報や、パラメータの詳細の情報なども詳しく載っている点、モックサーバーから返されるデータをサンプルとして閲覧できるので、かなり使いやすくなったと思います
特にパラメータの情報はかなり詳細なのでこのあたりを使う人は便利になったかなと

GET /pages/{id}/content

ついに来ましたページの内容取得!

今までページのID、Title、pageUrlだけしか取れず、なんとも残念な状態だったのですが、今回の変更でついに暗黒のCOM経由xml操作が不要になります
こっちのバージョンもbetaのみで取得可能です。v1.0はダメかと
scopeはcreateを除くのすべてで対応します
createはわかりません

レスポンスの中身はHTMLが返ってきます
OneNoteをブログとして使える日も近そう

ただしレスポンスは多少残念感があります。こんな感じで

<html xmlns="http://www.w3.org/1999/xhtml" lang="en-us">
  <head>
    <title>hoge</title>
    <meta name="created" content="2014-05-05T14:56:00.0000000" />
  </head>
  <body>
    <div data-structure="outline" style="position:absolute;width:705.900009155273px;height:28.8000011444092px;left:48px;top:139.200004577637px">
      <p style="font-family:メイリオ;font-size:10px">
        <span lang="ja-JP">もげもげ</span>
      </p>
      <br />
      <p style="font-family:メイリオ;font-size:10px;text-align:left">
        <span lang="ja-JP">ふが</span>
      </p>
      <table style="border:1px">...</table>
    </div>
  </body>
</html>

コンセプトはおそらくone:タグのHTMLへの変換だと思われますが…うーん…
one:の時もそうですがstyleがすさまじい状態になります

一応比較としてCOM経由のデータも出しておきます
(容量削減のために一部削ったり整形されてます)

<?xml version="1.0" encoding="utf-8"?>
<Page xmlns:one="http://schemas.microsoft.com/office/onenote/2013/onenote" ID="{ID}" name="hoge" dateTime="2014-05-05T05:56:21.000Z" lastModifiedTime="2014-09-20T07:06:30.000Z" pageLevel="1" isCurrentlyViewed="true" lang="ja">
  <QuickStyleDef index="0" name="PageTitle" fontColor="automatic" highlightColor="automatic" font="メイリオ" fontSize="20.0" spaceBefore="0.0" spaceAfter="0.0" />
  <QuickStyleDef index="1" name="p" fontColor="automatic" highlightColor="automatic" font="メイリオ" fontSize="10.0" spaceBefore="0.0" spaceAfter="0.0" />
  <PageSettings RTL="false" color="automatic">
    <PageSize>
      <Automatic />
    </PageSize>
    <RuleLines visible="false" />
  </PageSettings>
  <Title lang="ja">
    <OE author="azusa minamori" authorInitials="am" authorResolutionID="&lt;resolutionId provider=&quot;Windows Live&quot; hash=&quot;{!hash!}&quot;&gt;&lt;localId cid=&quot;{!cid!}&quot;/&gt;&lt;/resolutionId&gt;" lastModifiedBy="azusa minamori" lastModifiedByInitials="am" lastModifiedByResolutionID="&lt;resolutionId provider=&quot;Windows Live&quot; hash=&quot;{!hash!}&quot;&gt;&lt;localId cid=&quot;{!cid!}&quot;/&gt;&lt;/resolutionId&gt;" creationTime="2014-05-05T05:56:23.000Z" lastModifiedTime="2014-05-05T05:56:29.000Z" objectID="{09C29020-A557-4B80-B0B7-7FD721F28857}{15}{B0}" alignment="left" quickStyleIndex="0">
      <T><![CDATA[hoge]]></T>
    </OE>
  </Title>
  <Outline author="azusa minamori" authorInitials="am" lastModifiedBy="azusa minamori" lastModifiedByInitials="am" lastModifiedTime="2014-05-05T06:07:30.000Z" objectID="{09C29020-A557-4B80-B0B7-7FD721F28857}{31}{B0}">
    <Position x="36.0" y="104.400001525879" z="0" />
    <Size width="539.75" height="946.6051635742187" />
    <OEChildren>
      <OE authorResolutionID="&lt;resolutionId provider=&quot;Windows Live&quot; hash=&quot;{!hash!}&quot;&gt;&lt;localId cid=&quot;{!cid!}&quot;/&gt;&lt;/resolutionId&gt;" lastModifiedByResolutionID="&lt;resolutionId provider=&quot;Windows Live&quot; hash=&quot;{!hash!}&quot;&gt;&lt;localId cid=&quot;{!cid!}&quot;/&gt;&lt;/resolutionId&gt;" creationTime="2014-05-05T05:56:31.000Z" lastModifiedTime="2014-05-05T05:56:38.000Z" objectID="{09C29020-A557-4B80-B0B7-7FD721F28857}{32}{B0}" alignment="left" quickStyleIndex="1">
        <T><![CDATA[もげもげ]]></T>
      </OE>
      <OE authorResolutionID="&lt;resolutionId provider=&quot;Windows Live&quot; hash=&quot;{!hash!}&quot;&gt;&lt;localId cid=&quot;{!cid!}&quot;/&gt;&lt;/resolutionId&gt;" lastModifiedByResolutionID="&lt;resolutionId provider=&quot;Windows Live&quot; hash=&quot;{!hash!}&quot;&gt;&lt;localId cid=&quot;{!cid!}&quot;/&gt;&lt;/resolutionId&gt;" creationTime="2014-05-05T05:56:39.000Z" lastModifiedTime="2014-05-05T05:56:39.000Z" objectID="{09C29020-A557-4B80-B0B7-7FD721F28857}{36}{B0}" alignment="left" quickStyleIndex="1">
        <T><![CDATA[]]></T>
      </OE>
      <OE authorResolutionID="&lt;resolutionId provider=&quot;Windows Live&quot; hash=&quot;{!hash!}&quot;&gt;&lt;localId cid=&quot;{!cid!}&quot;/&gt;&lt;/resolutionId&gt;" lastModifiedByResolutionID="&lt;resolutionId provider=&quot;Windows Live&quot; hash=&quot;{!hash!}&quot;&gt;&lt;localId cid=&quot;{!cid!}&quot;/&gt;&lt;/resolutionId&gt;" creationTime="2014-05-05T05:58:12.000Z" lastModifiedTime="2014-05-05T05:58:13.000Z" objectID="{09C29020-A557-4B80-B0B7-7FD721F28857}{34}{B0}" alignment="left" quickStyleIndex="1">
        <T><![CDATA[ふが]]></T>
      </OE>
      <OE authorResolutionID="&lt;resolutionId provider=&quot;Windows Live&quot; hash=&quot;{!hash!}&quot;&gt;&lt;localId cid=&quot;{!cid!}&quot;/&gt;&lt;/resolutionId&gt;" lastModifiedByResolutionID="&lt;resolutionId provider=&quot;Windows Live&quot; hash=&quot;{!hash!}&quot;&gt;&lt;localId cid=&quot;{!cid!}&quot;/&gt;&lt;/resolutionId&gt;" creationTime="2014-05-05T05:58:14.000Z" lastModifiedTime="2014-05-05T05:58:14.000Z" objectID="{09C29020-A557-4B80-B0B7-7FD721F28857}{41}{B0}" alignment="left">
        <Table bordersVisible="true" hasHeaderRow="true" lastModifiedTime="2014-05-05T05:58:14.000Z" objectID="{09C29020-A557-4B80-B0B7-7FD721F28857}{42}{B0}">
          <Columns>
            <Column index="0" width="119.4888153076172" />
            <Column index="1" width="37.30574798583984" />
            <Column index="2" width="37.11000061035156" />
            <Column index="3" width="37.67102432250976" />
            <Column index="4" width="45.16913223266601" />
          </Columns>
        <!-- ... -->
        </Table>
      </OE>
    </OEChildren>
  </Outline>
</Page>

このすべてのタグにone:とつければ大体元通りです
(XElementに読ませるうえで問題となるところは変更されてます)

OEのすさまじいことになってる属性群は消えてますがスタイルがすごい細かいのはそもそものデータがものすごい細かいからという…

CSS的な概念はないのでmshtmlで出したときとほぼ同等の素晴らしいHTMLが返ってきます。通信量などという概念はない

ちなみに画像のページはこんなレスポンスになります

<html xmlns="http://www.w3.org/1999/xhtml" lang="en-us">
  <head>
    <title></title>
    <meta name="created" content="2014-07-29T20:52:00.0000000" />
  </head>
  <body style="font-family:Calibri;font-size:11px">
    <div data-structure="outline" style="position:absolute;width:624px;height:0px;left:48px;top:124.799995422363px">
      <br />
      <br />
      <img width="1024" height="4000" data-extracted-text="H 価 ー 司 A—tEgyptI 
Sail Along History" src="https://www.onenote.com/api/beta/resources/{ID}baba!{ID}/$value" data-fullres-src="https://www.onenote.com/api/beta/resources/{ID}baba!{ID}/$value" />
      <cite style="font-size:9px;color:#595959">クリップ元:</cite>
    </div>
  </body>
</html>

この中のURLで画像も取れます
ただしこれもAPI叩く必要があるので注意が必要です。いったん画像をAPI経由で取得してそのストリームをBitmapImageなりにしないと表示できません。ついでにいうとこれをそのままWebブラウザに表示しても出ません

画像もだいぶ扱いやすくなったと思いますがAPI経由なのでURL回収しないといけないのが手間になる可能性が大きいですね
しかしまあ上のXMLに比べれば…

あとdata-extracted-textにはOCRで読み取った画像の文字が入ってます。画像の大きさにもよりますがたいてい未知の言語が大量に入ってるので扱う上ではここも工夫はしたいところ


というわけでまとまってませんがこんな感じです

GET /pages/contentが来たのでOneNote→HTMLへの変換なんていうことをしなくてよくなったのがすごい大きいですね
手直しは必要な感じですが

なんにせよOneNote APIがだいぶ使いやすくなったのでこれでOneNote開発もだいぶとっつきやすくなったと思われます
COM経由でやってたことがWeb経由になっただけじゃねっていうのは気のせいです、きっと

ちなみに今回の記事の内容は MSDN BlogsMSDN Blogs を見ていただければ正しく理解できるかなと

あとレスポンスのHTML改行してありますが本来は1行で返ってきます

後はDeleteとかUpdateとかつけばOneNoteのクライアントとか作れそうですね
今ので十分便利ですが

とりあえずこの辺で