DirectCloud-BOXのAPI連携の肝とpythonモジュール作成

# 前段
DirectCloud-BOXという、Dropboxを更に企業向けにして、FireStorageみたいにも使えるっぽいツールを使ってみた。
使った理由は、APIが充実していて、WEBGUIを使わずに共有とかができそうで、上手く活用すれば
顧客とのファイル受け渡しが楽になるかもなーと思いました。
あと、pythonのAPIモジュール製作の練習も兼ねて。requests便利だよ、requests。

# APIについて
DirectCloud-BOXのAPIは、このサービスで出来ることは一通り揃っており、
ユーザの立場で使うものと、管理者の立場で使うものの２種類があります。
リファレンスはこちら。
https://directcloud.jp/api_reference

今回はユーザ向けのものしか触っていません。理由としては管理者の方は正直、画面で操作したほうが
UI的にも操作性は悪くないので、いいのかなと思いました。車輪の再発明はしたくない。

# DirectCloud-BOXのAPI接続をするまで

## DirectCloud-BOXの開始
まず、フリー版へ登録しましょう。
https://directcloud.jp/freeplan
フリー版でもAPIはすべて使える上、5GBのストレージ容量とユーザ数無制限で利用可能です。
ちょっとだけ有料版と差はあるものの、検証するにはなんの問題もありませんでした。

## 登録後にやること
会社ID、ユーザID、パスワードが発行されるとメールで通知されるので、管理者の管理画面にログインします。
ログインしたら、ユーザの管理など出来ることが色々ありますが、一目散に左メニューの「全機能一覧」を押して
共有 > DirectCloud-BOX API を使用するに設定し、APIのServiceとServiceKeyを作成します。

![スクリーンショット 2021-08-21 14.23.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42110/ae2dd4ae-d24b-183b-665d-fe885a180ad1.png)

↓全機能一覧から、使用する設定リンクを押した先の画面
![スクリーンショット 2021-08-21 14.25.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42110/37f83f13-e6fe-f9bd-f945-28eb676ec2ea.png)

ここまでに出てきた、会社ID、ユーザID、パスワード、Service、ServiceKey すべてこの後利用するのでメモしておきます。

## API接続

上記にも書いたとおり、APIは会社ID、ユーザID、パスワード、Service、ServiceKey を使ってAccessTokenを取得し、AccessTokenを利用してデータの取得や登録を行います。
（ちょっとパラメータが過剰すぎやしないかな・・・パスワード変更したらAPIを書き換えないといけないって疎結合してる意味が無い。）

さてこれら情報を取得したら、AccessToken取ってみましょう。
ここでなんと、APIリファレンスにAPIのドメインが記載されていません。これは問い合わせをするしか知る方法はありませんでした。
公開しても良い情報とのことでしたのでAPIのドメインは

```
https://api.directcloud.jp
```
です。なのでAccessTokenを取得するには

```
https://api.directcloud.jp/openapi/jauth/token
```
に対してパラメータ

```
"service": service,
"service_key": service_key,
"code": code,
"id": id,
"password": password,
```
を送信すれば取得できるようです。

## その他APIの取得
AccessTokenを取得したら他のAPIはAccessTokenをヘッダーに付けてAPIを叩くだけでした。
この辺りは非常にシンプルなのでソースコードもきれいに書けたと思います。


# 作ったpythonモジュール
gihubに公開しています。

https://github.com/tentatsu/direct_cloud_box

## 使い方
使い方は単純でcloneした後、pythonの環境が整ってあれば、.envを作成して

```
pip install -r requirements.txt
python index.py
```
すればいい感じに動くと思います。

## .env設定内容
.envの中身はこんな感じで作成します。
※SERVICE、SERVICE_KEYは管理者用APIを使いたかったら設定して下さい。

```
SERVICE="pddlhm*******"
SERVICE_KEY="9f1cee41*****************************"

USER_SERVICE="pddl****"
USER_SERVICE_KEY="b2595***************"

COMPANY_CODE="pdd*****"
USER_ID="bdm*****"
PASSWORD="*******"
```

## 実際に動作させたいくつかの情報
フリーの猫動画をアップロードして、ダウンロードリンクの作成を行ってみました。

```python
from direct_cloud_box.api import directCloudBox
import os
from os.path import join, dirname
from dotenv import load_dotenv

dotenv_path = join(dirname(__file__), '.env')
load_dotenv(dotenv_path)

USER_SERVICE = os.environ.get("SERVICE")
USER_SERVICE_KEY = os.environ.get("SERVICE_KEY")
COMPANY_CODE = os.environ.get("COMPANY_CODE")
USER_ID = os.environ.get("USER_ID")
PASSWORD = os.environ.get("PASSWORD")

user_api = directCloudBox(
    USER_SERVICE,
    USER_SERVICE_KEY,
    COMPANY_CODE,
    USER_ID,
    PASSWORD
    )
try:
    print(user_api.fileUpload("./sample_file/sample_movie.mp4", "1"))
    print(user_api.fileGet("1"))    
    print(user_api.fileDownloadUrl("1", "285389469"))
finally:
    user_api.tokenExpire()
```

すると、このようなURLが発行されます。
https://cdn.directcloud.jp/pddlhmwn/bdmnbqjc/20210820131811322883?response-content-disposition=attachment%3B%20filename%3D%22sample_movie.mp4%22%3B%20filename%2A%3DUTF-8%27%27sample_movie.mp4&response-content-type=video%2Fmp4&Expires=1629524543&Signature=iFvJTMV38gJwQjtjQX~EIbSE5OWvk~anw9JJQzKZX0NYDm33ohJe05oH1SEdKuVNR5eDNJJIQe6QnnN9YViPKcRNDw7SaoQXsa9zc26RoaVPYUby8OIrYC9J~Bazr3EyY4qGYsPq~IAP7bx0uLN~3zRiqezLUUIJP~hlGcPXh3W6c85N4amW4lYec-sHKMPLWy4ub5-ZbZSEjSA0apvu0bI3Z3aZfjFy63ry2k0edl4iNK6zIHxgd8koZUWJguqwld7BX1cVJKI-ZvJZUcso4CLZgjacxAuOV9Dy7FWnEsOgYt6cX0Vfhk~i2atUDJkL8kZnjnpYODtxascfFpBxXA__&Key-Pair-Id=APKAJV43NA6KHFLMBOQQ

これで猫動画が見れましたね。にゃー。

他にAPIからはパスワード付きシェアURLや、アップロード可能フォルダの共有、あとプレビュー表示URLなんかも
APIから作れるようですが、なぜかAPIがすべてエラーが返却されます。
ちょっと一人では解決できなさそうなので、今回はここまで。