家庭内の定期的なタスクについてもWunderlistで管理したい(その３)

## 〇前回まで
・[家庭内の定期的なタスクについてもWunderlistで管理したい(その１)](https://qiita.com/ryo_naka/items/f9fb74a7b442640fbe70)
→メール送信による登録を調査

・[家庭内の定期的なタスクについてもWunderlistで管理したい(その２)](https://qiita.com/ryo_naka/items/86fbf6d54176b9e7aeee)
→設定した情報に合わせての登録処理を実装

## 〇今回の概要
・APIが存在した！
メールでしか登録できないのかと思ってたWunderListだけど、
いろいろと調べてたらAPIが存在してた。
ということで、メールではなくこっちで登録してみることにした。



## 〇WunderListにはAPIが存在した！

前回でメールからの登録でなんとなく我が家の運用に耐えられそうかなと思った後に
いろいろと調べてたらどうやらWunderListにもAPIが存在してそうということが判明。
どう考えてもこっちのほうがいろいろできそうなので、試してみることに。


### 参考
https://qiita.com/nori4k/items/d0ee6a287105410a353c
https://qiita.com/okkunokkun18/items/17583979ef3859d4337a


### 言語を変えてみる
最初に自動登録の延長線上でC#で書いてみたけど、認証周りがめんどくさそうだったので
Requests-Oauthlib があるpythonでやってみることにした。



### jupyter notebookでWunderList APIを試してみる
管理者でAnacondaコンソールを起動させて以下を入力
>pip install requests requests_oauthlib

#### ・共通情報

APIドキュメント
https://developer.wunderlist.com/documentation

    from requests_oauthlib import OAuth2Session
    import json
    
    client_id = "your client id"
    access_token = "token"
    params = {}
    
    wunderlist = OAuth2Session()
    wunderlist.headers['X-Client-ID'] = client_id
    wunderlist.headers['X-Access-Token'] = access_token

認証周りはこれだけでOK。簡単だ。


#### ・ユーザ情報を取得：担当を割り振るためにユーザIDを取得

    url = "https://a.wunderlist.com/api/v1/user"
    params = {}
    req = wunderlist.get(url, params=params)
    if req.status_code == 200:
        user = json.loads(req.text)
        print(user['id'],user['name'] )
    else:
        print("Error: %d" % req.status_code)

→これだとサインイン(認証対象)しているユーザ情報しか取得できない。
※今回は自分以外の担当のユーザIDも必要なので足りない

#### ・タスクを登録する前にどこのリストに登録するかを調べるためにリスト一覧を取得

    url = "https://a.wunderlist.com/api/v1/lists"
    params = {}
    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"])
    else:
        print ("Error: %d" % req.status_code)
    
→変わるものではないので一回取得して確認しておけばOK



#### ・リストに対するメンバーを取得
各リストを共有しているメンバーの情報が取得できるのかと思って実行。

    import pprint
    url = "https://a.wunderlist.com/api/v1/memberships"
    params = {}
    req = wunderlist.get(url, params=params)
    if req.status_code == 200:
        lists = json.loads(req.text)
        pprint.pprint(lists)
        for list in lists:
            print(list["id"], list["title"])
    else:
        print ("Error: %d" % req.status_code)
    
→なんか思ってたのと違う情報が取得。
　雰囲気的にはリストの作成情報とかが取得できているような感じ。


#### ・ユーザ一覧取得
公式のAPIドキュメントには載っていなかったのだが、いろいろと探してたらGitHubにあった
https://github.com/wunderlist/api/issues/49

    import pprint
    url = "https://a.wunderlist.com/api/v1/users"
    params = {}
    req = wunderlist.get(url, params=params)
    if req.status_code == 200:
        lists = json.loads(req.text)
        pprint.pprint(lists)
    else:
        print ("Error: %d" % req.status_code)
    
→これで自分と共有対象になっているユーザIDが取得できる。

**対象リストのIDと共有対象のユーザIDが取得できたので登録の準備ができた。**

#### ・タスクを登録
    url = "https://a.wunderlist.com/api/v1/tasks"
    params = {
        "list_id": リストID, #integer
        "title": "トイレットペーパー", #string
        "assignee_id": ユーザID, #integer
        "due_date": "2018-03-18", # 期限
    }
    req = wunderlist.post(url, json=params)
    if req.status_code == 201:
        print("New task was successfully created.")
    else:
        print ("Error: %d" % req.status_code)

これで登録できることが確認できた。
メールだとできない担当や期限の設定も簡単にできた。
※問い合わせたときにこれを教えてくれりゃあよかったのに。。


## 〇結果
結果不思議な構造の処理になってしまった。

判定＋データアクセス部分：C#
データの保存先：ファイル(JSON)
送信部分：python