Feed on
Posts
Comments

実作業時間2時間くらい
真面目にAPI叩くまでしかやってないのでそれ以上は誰かよろしくお願いします

というわけでOneNote service APIを.NET 4.5.1のWPF+RESTで使ってみました
コードはちょこちょことしか載せませんが頑張ってください

・アプリの登録
まずLive Connect デベロッパー センターでアプリケーションを追加します
ここの”マイアプリ”を選択してcreate applicationします
名前は適当でいいです

作ったら設定のAPI Settingsを設定してください
とりあえずMobile or desktop client appをYesにしてRedirect URLsを設定します
私の場合こんな感じになります
fspic140318

ここまでやったらClient IDとClient Secretを控えて終了です

・Live Connectへの認証
モバイル アプリと Windows デスクトップ アプリ (Live Connect)を見ながら適当に実装します
実に素晴らしいことにトラップが一箇所あるのでそこだけ回避すればつまるところはないと思います

どこかというと”アプリの概要”のこの部分

メモ

モバイル アプリでクライアント側のアプリのフローを使う場合は、この認証 URL の末尾に &display=touch を追加する必要があります。

この URL では、Live Connect の標準のサインイン ページが表示されます。前のセクションで説明したデスクトップ アプリ用の Live Connect URL を redirect_uri パラメーターで指定していることに注意してください。リダイレクト Uniform Resource Identifier (URI) を指定する必要がある場合は、常にこの URL を使います。また、response_type パラメーターと scope パラメーターも必要です。response_type パラメーターの値は、code に設定する必要があります。

ユーザーの同意が得られると、Live Connect API から認証コードを含む URI が返されます。この URI の例を次に示します。

https://login.live.com/oauth20_desktop.srf#code=AUTHORIZATION_CODE

ヒント wl.offline_access スコープを指定した場合は、リフレッシュ トークンも返されます。

#code=AUTHORIZATION_CODE って二段階の取得じゃなくて一段階の取得の戻り値ですよね…
確かgrant_type=authorization_tokenで取得するときの戻り値が#code=だったはず
request_type=tokenのときです

追記:OAuth 2.0 (Live Connect)の暗黙的な付与フローがサンプルの認証ですね
含めないでくださいって書いてあるのになぜかリフレッシュトークンも返されますとは…
下の認証方法を利用したほうが大体幸せです

しかしあんな使えない認証使ってもしょうがないうえ、そこまでのサンプルはgrant_type=authorization_code request_type=codeなので戻り値のサンプルは

REDIRECT_URL?code=AUTHORIZATION_CODE

のパターンとなります
ちなみにAUTHORIZATION_CODEはGUIDが返ってきます

(authorization_tokenだとRefreshTokenが取れなかったのでどうしてもauthorization_codeにする必要があった気がします)

ちなみにOneNote service APIを使うためのscopeはoffice.onenote_createです

あとは適当に頑張って取得します。Redirect_Urlは指定した奴にする必要がありますがそれ以外はそのまま流れに従ってやっていきます
とりあえずaccess_tokenまで取得したら認証完了です

・OneNote service APIへの送信
認証できたらあとは楽勝です

HttpClientのAuthorizationヘッダーにBearer ACCESS_TOKENを指定してPostAsyncをするだけです
Authorizationヘッダーだけ謎でしたがAuthenticate the user for the OneNote service API見てたらサンプルにあったのでそれを利用しました

こんな感じのコードで送れます

private async void Button_Click(object sender, RoutedEventArgs e)
{
    var text = "<html><head><title>{0}</title></head><body><img data-render-src=\"{1}\" /><a href=\"{1}\">{1}</a></body></html>";
    text = string.Format(text, TitleTextBox.Text, UrlTextBox.Text);
    HttpStatusCode code;
    using (var cli = new HttpClient())
    {
        cli.DefaultRequestHeaders.Authorization = new System.Net.Http.Headers.AuthenticationHeaderValue("Bearer", WindowsLiveInfo.AccessToken);
        var resp = await cli.PostAsync("https://www.onenote.com/api/v1.0/pages",new StringContent(text,System.Text.Encoding.UTF8,"text/html"));
        code = resp.StatusCode;
    }
    if (code == HttpStatusCode.Created)
    {
        MessageBox.Show("投稿完了しました");
    }
}

すさまじい適当さ
textの中身がOneNoteに送る本体です。これをいじるといろいろ変えれます
今回は単純に指定したタイトルでWebページのキャプチャ画像張り付けたページ作るだけのことしかしてません

HttpClientのPostAsyncではStringContentを送り付けます
EncodingとContent-Typeだけ別に指定しておけばきっとうまくいくと信じます

そのあとの処理が雑すぎますがこれでも投稿できるので今回はこれでいいです

・実行するとこんな感じ
というわけで実行してみます

適当にブラウザでサインインすると、初回時にこんなページが出て許可するかどうかを聞かれます
fspic140318-2

今回は一応wl.offline_accessをscopeに追加してますがなければ下のだけが出ると思います
これで”はい”を選択すると指定したリダイレクト先にコード付きで飛ばされます
内蔵ブラウザならNavigatingあたりでコードを拾ってそのまま認証を進めます

認証が終了したらこんな感じで値を入れて送ります
fspic140318-3

いつも通りのKUSO=UIすぎてやばいですが投稿できればどうということもないのでこれで送ります
送信ボタンのClickはさっきのコードです

これで送信が終了したらOneNoteを開いて確認してみます
OneNote Onlineで見るとこんな感じです
fspic140318-4

ちゃんと追加されてますね
imgタグのheightとwidthを指定してないせいで画像がすさまじくでかいですが(1024*ページ全部?)指定すればもっとマシになると思います


ということでとりあえずここまでやってみました
RESTでもちゃんと扱えるのでLive Connect SDKがなくても最悪生きていけます
というよりLive Connect SDKはどうも認証にしか使ってないようです?

ちなみにwl.offline_accessがない場合refresh_tokenが取れないので1時間ごとに認証しなおす必要があります
個人的にはめんどくさすぎるのであんまりお勧めはしません

ずっと前に扱ったLive Connect周りのコードがこんなところで役に立つとは思ってませんでした

この辺で

追記:そういえばOneNote デベロッパー センター – OneNote に統合できるアプリの作成のこれ何なんでしょうね
fspic140318-5

REST でリラックス!
英語でもRelax With RESTです

これやってて少なくとも暗黒界よりマシですけどリラックスできた気がしないですね

いや言いたいことはわかるんですけど完全にネタにしか見えません…

One Response to “気軽にOneNote service API v1.0を使ってみた”

  1. […] Power Queryのリボンと関数の対応表 気軽にOneNote service API v1.0を使ってみた […]