PowershellでWunderListのAPIを触ってみる(新刊.netのRSS Feedを利用して本をWunderListに登録する)

環境

Invoke-RestMethod と ConvertTo-Json が必要なのでPowershell v3.0以降で動くはず

前準備

Authorization | Wunderlist Developerに従って以下のことをしておく

  1. WunderListへのアプリケーションの登録
  2. Web Server Application Integrationに従って、アカウントの認証設定のうえ、codeを入手しておく

実際にやってみる

今回は新刊.netrssフィードを利用して、ほしい本(とその著者)をWunderListのInboxに投入する。 ConfigとBookList Feedには環境に応じた値を入れること。

# Config
$conf=@{client_id = "CLIENT ID"; client_secret = "SECRET"; code = "CODE"}
$list_id=ID # Inbox id (integer) 

# Object to convert to json for create task api
$task=@{list_id = $list_id ; title = "";}

# BookList Feed
$source = "http://sinkan.net/?action_rss=true&uid=12345&mode=schedule&key=hogehoge";

# Get access token
$headers = @{"X-Access-Token"=""; "X-Client-ID"=$conf.client_id; "Content-Type"="application/json" }
$body = $conf | ConvertTo-Json
$headers.'X-Access-Token' = $(Invoke-RestMethod -Method Post -Uri "https://www.wunderlist.com/oauth/access_token" -Body $body -Headers $headers).access_token

#Get NewBookList and Create tasks into Inbox
Invoke-RestMethod $source | % { 
    $task.title = $($_.title.'#cdata-section' +  "/" + $_.creator.'#cdata-section') ; $task } | % {
      ConvertTo-Json $_ } | % {
        $body=[System.Text.Encoding]::UTF8.GetBytes($_); $_ } | % { 
          Invoke-RestMethod -method POST -Uri "a.wunderlist.com/api/v1/tasks" -Headers $headers -Body $body } 

メモ

  • 自分ひとりで使うなら、登録時のアプリのURLやリダイレクトURLはテキトーで良い。
  • リクエストのヘッダの仕様などはAuthorization | Wunderlist Developer参照
  • Invoke-RestMethodさえ使えればあまり難しくはない、かと思いきや日本語の書名が文字化けしてとても苦労した。結局、せっかくだからおれはこのInvoke-RestMethodをつかうぜ | たっぷす庵を参考にさせてもらって、JSONごとByte配列にしてリクエストに突っ込んだがもっとうまい方法はあると思う。
  • JSONをByteにするところで、パイプの入力オブジェクトを出力しているのは、後続のパイプでもともとの入力だった$taskの数だけ後続の処理をするため。これをしないとByte配列の要素数分、後続のパイプの処理が実行されてしまう。
  • 上記のコードはAPIを呼び出す部分と、API用のパラメータを作る部分に関数なりで分割した方がきれいなのだと思うが、かき捨てのコードなのでそこまでしてはいない
  • はじめて認証付きのAPIを触ったのだが、意外と簡単だった。
  • パイプを多用したので、ErrorActionをうまく使ってtry-catchなりtrapしてやらないとエラーが拾えなさそう。
  • list_idは以下のようなAPIで取得できる
Invoke-RestMethod -method GET -uri "a.wunderlist.com/api/v1/lists" -Headers $headers