TeamGantのWEBAPIを利用する手順(python使用)

# TeamGantとは

* [TeamGant](https://www.teamgantt.com/)は、その名のとおりチームメンバーでガントチャートを共有できるサービスです。
* タスク管理等もできます
* ブラウザで利用できます。専用のスマホアプリもあるようです。

# 今回紹介すること

* TeamGantのWEB APIを利用するための手順を紹介します。
* Pythonを使用した例を紹介します。
* 今回は __基本的なアクセス方法の紹介のみ__ とします。

# 何ができるようになるの？
* 日々の進捗チェックをブラウザ操作でポチポチらずにスクリプト化できます。

https://support.teamgantt.com/article/132-teamgantt-api

# はじめ方
1. まず、[TeamGant](https://www.teamgantt.com/)のアカウントを作ります。(Free版もあり)
2. プロジェクトを立てて工程を作る
3. __ベアラートークン__ を発行
4. __ユーザートークン__ と __APIキー__ をゲット
5. APIリファレンスのページでコマンド単体のテストをします
6. Pythonでコーディングします。

※今回は__WEB API__　の説明なので、 __3.ベアラートークンの発行__ から説明します。

# ベアラートークンの発行方法
1. TeamGantの[App Tokens](https://app.teamgantt.com/admin/app-tokens)のページに行きます。
1. __New App Name__ に適当な名前を入力して　__Save__ を押す。
2. __Token__ のとこにトークン(長い文字列)が返ってくるので、コピーする。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/204268/a568291f-5c84-000c-b1df-228d79dab56d.png)

# ユーザートークン と APIキー の発行

* TeamGantの[APIドキュメントページ](https://teamgantt.docs.apiary.io/#)へ行く。
* 「Authentication」⇒「Create Session」の順にポチる。
*　右側にAPIを試せるウインドウがあるので、ベアラートークン(デフォルトだと"Bearer ABC123" って入力されている)に先ほど取得したベアラートークンを入力する。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/204268/8c9ac75b-483e-130a-83e6-0272d517426f.png)
※　ベアラートークンの先頭は、"Bearer "が必要なので注意！（スペース1文字入ります）

* __Body__ タブを押して、userとpass を自分のものに書き換えます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/204268/ec9a4f80-24ce-0120-dda8-9412d182324a.png)


* __Call Resource__ ボタンを押す

成功すると　__Response__ が 200番台になります。　400番台の場合はエラーなので設定を見直してください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/204268/3796b421-4594-26c1-5a26-25456e151168.png)

__Response Body__ のところに　__api_key__ と　__user_token__ の文字列が返ってきていますので、これをメモっておきます。

# APIリファレンスページでの練習
APIリファレンスのページにAPIのテストができます。タスクに関するAPIの __GetList__ を例として、自分の当日のタスクリストを取得する手順を紹介します。

## コマンド選択
左側の見出しから __Task__ ⇒ __Tasks__ を選択し、　__Get List__ を押します。
右側のウインドウが　__/tasks?today__ コマンドを試す状態になります。

次に　__ベアラートークン,ユーザートークン,APIキー__ をURLヘッダに付加します。

__Headers__ を押して、__Add new header__ を押すとアイテム名と値が入力可能になります。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/204268/6f215be1-51e0-ba80-a713-e7ded6dd3fd9.png)


アイテム|入力するアイテム名|入力する値の説明
-----|--------|---------
ベアラートークン|TG-Authorization|取得したベアラートークンの先頭に"Bearer "を付加
APIキー|TG-Api-Key|Create Sessionで取得したAPIキー
ユーザートークン|TG-User-Token|Create Sessionで取得したユーザートークン

上記３つをHeaderに設定した状態が↓のような画面になります。
Call Resource を押して　Response　200番台が返ってくれば、OKです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/204268/e438f3ec-0194-d9e1-d80e-08e2446ab82a.png)


以上の手順でAPIドキュメントにあるAPIをブラウザ上でトライできます。

__APIヘッダはピン止めができます！__
入力ボックスの右側にマウスカーソルを持っていくとピン止めができます。
ピン止めしておくと、APIコマンドを変えたときに毎回ヘッダを入力しなくてもOKになり楽です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/204268/b9e9ed65-5e9c-2b38-9ff0-e3ba8d93f990.png)


# Pythonを使用した例

TeamGantのAPIドキュメントにもPythonのExampleは載っています。
私が試した例を紹介します。

* WEB_APIのアクセスはurllib を使用しています。
* 受け取ったレスポンスはjsonライブラリを利用してJSONにして解釈し辞書型にします。
* GETしたjsonをファイルに書き出しています。

```python

# -*- coding: utf-8 -*-
import urllib.request
import codecs
import json
########################################################################
# TeamGant
########################################################################
class TeamGant():
    '''
    コンストラクタ
    '''
    def __init__(self):
        self.APIheader={'TG-Authorization':'Bearer <自身のベアラートークン>'
                       ,'TG-Api-Key'      :'<自身のAPIキー>'
                       ,'TG-User-Token'   :'<自身のユーザートークン>'
                       }
        self.UrlBase = 'https://api.teamgantt.com/v1/'
    '''
    TeamGantにリクエストを投げて
        引数　ApiCmd　　　　：APIコマンド(必須)
        引数　iSaveName　　：結果をjsonファイルに書き出したいとき指定するファイル名Body
    '''
    def _gatTGjson(self, ApiCmd="",iSaveName=""):
        __request = urllib.request.Request(self.UrlBase + ApiCmd, headers=self.APIheader)
        __response = urllib.request.urlopen(__request)
        __json = __response.read().decode("utf-8")
        if not len(iSaveName) == 0:
            print(__json, file=codecs.open('./' + iSaveName + '.json' , mode='w')) #書き出し
        return __json
    '''
    今日のタスクを取得
    '''
    def GetTodayTask(self):
        cmd='tasks?today'       #今日のタスク
        return self._gatTGjson(cmd, 'TaskToday')

########################################################################
# Main関数
########################################################################
if __name__ == '__main__':
    tg = TeamGant()             #TeamGantのクラスを作る
    js = tg.GetTodayTask()      #今日のタスクを取得するメソッドを実行してjsonを受け取る
    json_dict = json.loads(js)  #受け取ったｊsonを辞書型にする

```