クラウドサインAPIを試してみた

#はじめに
はんこレスが流行りそうな感じだったので資料多めで触りやすそうなクラウドサインで試してみました。

#想定環境と前提
私は以下の環境で試しました。
OS：Windows10
Python：Python3.8
事前準備として管理サイトにてクライアントIDを取得する必要があります。

公式サイトにあった以下の流れを試してみました。
1.アクセストークンの取得
2.書類の作成
3.ファイルの追加
4.宛先の追加
5.書類の送信

#実際のコード
###アクセストークンの取得
何をやるにもアクセストークンが必要になるため最初に取得します。

```python:main.py
def token_post(url,client_id):
    url_api = url + '/token'
    headers = {}
    post_params = {}
    headers['Content-Type'] = 'application/x-www-form-urlencoded'
    headers['Accept'] = 'application/json'
    post_params['client_id'] = client_id 
    http = urllib3.PoolManager()
    resp = http.request('POST', url_api,fields=post_params,encode_multipart=False,headers=headers)
    resp_data = resp.data.decode('utf-8')
    return json.loads(resp_data)

if __name__ == '__main__':
    url = '<クラウドサインAPIのURL>'
    client_id = '<取得したクライアントID>'
    token_post(url,client_id)
```

###書類の作成
対象となる書類を作成します。
ここから取得したトークンを利用して接続を行います。

```python:main.py
def doc_craete(url,token):
    url_api = url + '/documents'
    headers = {}
    post_params = {}
    headers['Content-Type'] = 'application/x-www-form-urlencoded'
    headers['Accept'] = 'application/json'
    headers['Authorization'] = token
    post_params['title'] = 'ドキュメントのタイトル'
    post_params['note'] = 'メモ'
    post_params['message'] = 'メッセージ'
    post_params['template_id'] = ''
    post_params['can_transfer'] = ''
    post_params['private'] = ''
    http = urllib3.PoolManager()
    resp = http.request('POST', url_api,fields=post_params,encode_multipart=False,headers=headers)
    resp_data = resp.data.decode('utf-8')
    return json.loads(resp_data)

if __name__ == '__main__':
    url = '<クラウドサインAPIのURL>'
    token = '<取得したトークン情報>'
    doc_craete(url,token)
```

###ファイルの追加
作成した書類に対し実際に押印とかしてもらうドキュメントファイルを追加します。
PDFでのみ動作確認しています。
ここで必要となるドキュメントIDは作成した時のレスポンスに含まれています。

```python:main.py
def file_attachment(url,token,document_id):
    url_api = url + '/documents/' + document_id + '/files'
    headers = {}
    post_params = []
    headers['Accept'] = 'application/json'
    headers['Authorization'] = token
    post_params.append(('name','attachment_test.pdf'))
    with open('C:\\cloudsign\\test\\sample.pdf', 'rb') as f:
        filename = os.path.basename(f.name)
        filedata = f.read()
        mimetype = (mimetypes.guess_type(filename)[0] or 'application/octet-stream')
    post_params.append(tuple(['uploadfile',tuple([filename,filedata,mimetype])]))
    http = urllib3.PoolManager()
    resp = http.request('POST', url_api,fields=post_params,encode_multipart=True,headers=headers)
    resp_data = resp.data.decode('utf-8')
    return json.loads(resp_data)

if __name__ == '__main__':
    url = '<クラウドサインAPIのURL>'
    token = '<取得したトークン情報>'
    document_id = '<作成したドキュメントのドキュメントID>'
    def file_attachment(url,token,document_id):
```

###宛先の追加
作成した書類に対し送る人の宛先を追加します。

```python:main.py
def file_participants(url,token,document_id):
    url_api = url + '/documents/' + document_id + '/participants'
    headers = {}
    post_params = []
    headers['Accept'] = 'application/x-www-form-urlencoded'
    headers['Authorization'] = token
    post_params['email'] = '<メールアドレス>'
    post_params['name'] = '<名前>'
    http = urllib3.PoolManager()
    resp = http.request('POST', url_api,fields=post_params,encode_multipart=False,headers=headers)
    resp_data = resp.data.decode('utf-8')
    return json.loads(resp_data)

if __name__ == '__main__':
    url = '<クラウドサインAPIのURL>'
    token = '<取得したトークン情報>'
    document_id = '<作成したドキュメントのドキュメントID>'
    def file_participants(url,token,document_id):
```

###書類の送信
登録した宛先に対して通知メールを送ります。

```python:main.py
def document_send(url,token,document_id):
    url_api = url + '/documents/' + document_id
    headers = {}
    post_params = []
    headers['Accept'] = 'application/x-www-form-urlencoded'
    headers['Authorization'] = token
    http = urllib3.PoolManager()
    resp = http.request('POST', url_api,fields=post_params,encode_multipart=False,headers=headers)
    resp_data = resp.data.decode('utf-8')
    return json.loads(resp_data)

if __name__ == '__main__':
    url = '<クラウドサインAPIのURL>'
    token = '<取得したトークン情報>'
    document_id = '<作成したドキュメントのドキュメントID>'
    def document_send(url,token,document_id):
```

#おわりに
動作を試すために公開されているAPI仕様書を参考にしました。
[クラウドサイン Web API 仕様書](https://app.swaggerhub.com/apis/CloudSign/cloudsign-web_api/0.16.1)
仕様書通りに大体は進んだので良かったですが、ファイルの追加のみAPI仕様書の書き方を
そのままやるとできなかったのでクラウドサイン Web API 仕様書のサイトにあるSDKを確認し
真似ることで上手くいきました。
※ファイル名、MIME、ファイル内容をtupleで送る必要あり。

色々と検証した結果、登録時にファイル名を登録するようなのですが拡張子がなかったり
間違っていたりしたときに変更されるのでそこで使うためかな、と想定しています。

レスポンスは全てJsonで返ってきますので上手く処理をして必要になるパラメータを取得してください。