Python で Wunderlist API を使ってみる

*タスク管理、してますか？*

タスク管理アプリケーションとして有名な Wunderlist の API に Python で触ってみました。API の [Document](https://developer.wunderlist.com/documentation/) もしっかり書いてあるので扱いやすい API だと思います。認証は OAuth2 が使われています。

#1. 下準備
自分の Wunderlist のアカウントがあるのが最低条件です。
まず、自分のアカウントを使って下記ページにログインします。
https://developer.wunderlist.com/

その後、REGISTER YOUR APP をクリック
<img width="1278" alt="スクリーンショット 2015-11-13 15.17.05.png" src="https://qiita-image-store.s3.amazonaws.com/0/91302/f744fef6-bfe2-6715-031a-f5b119ab4f58.png">

登録画面が出てくるので、必要事項を入力し、SAVEをクリック。後からでも変更できますが、NAME、APP URL、AUTH CALLBACK URL は入力必須です。
<img width="887" alt="スクリーンショット 2015-11-13 15.21.26.png" src="https://qiita-image-store.s3.amazonaws.com/0/91302/95ac293c-4b66-40e5-a211-c0b3a161c7a0.png">

すると CLIENT ID と CLIENT SECRET が取得できます。
<img width="989" alt="スクリーンショット 2015-11-13 15.21.52.png" src="https://qiita-image-store.s3.amazonaws.com/0/91302/892af235-76f8-b05e-e58a-4353c3c04cba.png">

今回は簡略化のために、自分のアカウントに対する ACCESS TOKEN を取得します。CREATE ACCESS TOKEN をクリックしましょう。
<img width="1192" alt="スクリーンショット 2015-11-13 15.32.46.png" src="https://qiita-image-store.s3.amazonaws.com/0/91302/27bf9af4-f42f-36de-edb8-b40bc892581c.png">


自分のアカウント情報を取得するのに必要なのは CLIENT ID と ACCESS TOKEN の２つです。必要な情報が取得できたので、早速ユーザー情報を取得してみます。

oauth2 認証には [Requests-Oauthlib](https://github.com/requests/requests-oauthlib) というライブラリを使用させてもらいました。
認証の詳細は [ここ](https://developer.wunderlist.com/documentation/concepts/authorization) に書いてあります。リクエストするヘッダー情報に X-Client-ID と X-Access-Token をつければOK。

```py

from requests_oauthlib import OAuth2Session
import json

client_id = "YOUR CLIENT ID"
access_token = "YOUR ACCESS TOKEN"
url = "https://a.wunderlist.com/api/v1/user"
params = {}

wunderlist = OAuth2Session()
wunderlist.headers['X-Client-ID'] = client_id
wunderlist.headers['X-Access-Token'] = access_token
req = wunderlist.get(url, params=params)

if req.status_code == 200:
    user = json.loads(req.text)
    print user['name']
else:
    print ("Error: %d" % req.status_code)
```

無事、自分のユーザー名が表示されたでしょうか？

#2. API に触ってみる

## a. リストの一覧を取得してみる
https://developer.wunderlist.com/documentation/endpoints/list

url を変更

```py
url = "https://a.wunderlist.com/api/v1/lists"
```

リストの id はタスクを CRUD するのに使います。

```py
req = wunderlist.get(url, params=params)

if req.status_code == 200:
    lists = json.loads(req.text)
    for list in lists:
        print list["id"], list["title"].encode('utf-8')
else:
    print ("Error: %d" % req.status_code)
```

## b. タスクを作成する

url と params を変更します。ちなみに買い物リストで一番書かれることが多いのはトイレットペーパーだそうで。（本社の人の情報なので間違いないです。）

```py
url = "https://a.wunderlist.com/api/v1/tasks"
params = {
    "list_id": "買い物リストのID", #integer
    "title": "トイレットペーパー", #string
}
```

今度は GET ではなく POST ですね。status_code も変わります。

```py
req = wunderlist.post(url, json=params)

if req.status_code == 201:
    print "New task was successfully created."
else:
    print ("Error: %d" % req.status_code)

```

自分の Wunderlist を見て、買い物リストにトイレットペーパーが追加されていればOKです。

## c. タスクを完了する

タスクのアップデートに当たります。さっき追加したトイレットペーパーを買ったことにしましょう。

url と params を変更します。


```py
url = "https://a.wunderlist.com/api/v1/tasks/"
params = {
    "revision": 1, # 基本は1で大丈夫
    "completed": True,
}
task_id = "トイレットペーパーのID"
url += task_id
```

PATCH という関数を使います。

```py
req = wunderlist.patch(url, json=params)

if req.status_code == 200:
    print "Task was successfully completed."
else:
    print ("Error: %d" % req.status_code)
```

Wunderlist を確認してトイレットペーパーのタスクが完了していることを確かめましょう。


タスクやリストの id は Web版の Wunderlist の url を見れば一目瞭然だと思います。