Home About Contact
Node.js

box.com の API を使った(覚え書き)

box.com の個人アカウントで OAuth2 を使って、ファイルをアップロードして新規作成/更新/ファイルリストの取得を試した。 言語は Node.js、もう非推奨らしい。(詳細はこちら https://github.com/box/box-node-sdk

box.com といえば基本企業が対象なのだろう。個人アカウントの場合での情報が見つからず四苦八苦した。 とくに、ネットにある情報をみると「管理者に承認してもらうためにリクエストを出す」というプロセスの説明が出てくるのだが、 個人アカウントの場合、管理者へのリクエストとか出せない。 そして結論としては、そのプロセスは(個人アカウントでは)不要。 自分の個人アカウントで管理しているクラウドファイルストレージにAPIアクセスするのだから、 たしかに承認とかいらない。 個人アカウントと企業アカウントでできることが異なるようなのだが、その違いも良くわからなかった。 個人ユーザーとか端から相手にしていないのだろう。

そもそも OAuth2 で認証する場合は、管理者への承認プロセスとかはもともと不要だった気がする。

box.com の API を使うには開発者コンソール https://app.box.com/developers/consoleにアクセスすればよい。 開発者アカウントとかいった概念があるらしいのだが、良くわからない。 普通に個人(Indivisual)アカウントのままでも、ファイルをアップロードして作成したり/更新したり/ファイルリストを得ることはできる。

ステップ1

box.com の開発者コンソールへいき、新規アプリをつくる。 選択する項目があるが適当に。認証は OAuth2 で。

ステップ2

今つくったアプリの設定画面で、次の3つの情報を得る。

Developer Token は(たしか)1時間程度で期限切れになる。 (APIを試す上では問題はない。)

Client Secret は box.com のアカウントが二段階認証設定している必要があるので、設定していない場合は設定しよう。

ステップ3

Node.js でコードを書く。

$ mkdir mybox
$ cd mybox
$ npm init -y
$ npm install box-node-sdk
$ touch index.js
$ touch hello.txt

see https://www.npmjs.com/package/box-node-sdk

hello.txt はテストで今回アップロードするためのファイルです。適当に内容を入れておきます。 Hello, World! とか?

index.js にコードを書く。

const fs = require('fs');
const BoxSDK = require('box-node-sdk');

// これらが環境変数に設定してあるとして...
const devToken = process.env.DEVELOPER_TOKEN;
const clientId = process.env.CLIENT_ID;
const clientSecret = process.env.CLIENT_SECRET;

const sdk = new BoxSDK({
  clientID: clientId,
  clientSecret: clientSecret
});

const client = sdk.getBasicClient(devToken);

client が取得できたら、あとは使うだけです。 ブラウザでbox.com のUIに戻り、アップロード先のフォルダを新規追加して用意します。 そして、そのフォルダにブラウザで遷移すると フォルダID がわかるので、メモしておきます。 ここではそれが 227774439500 だったとして話を進めます。

カレントディレクトリにある hello.txt を box.com の先ほど用意したフォルダにアップロードするコード。

const boxFolderId = '227774439500';
const boxFileName = 'hello.txt';
const helloStream = fs.createReadStream('./hello.txt');
client.files.uploadFile(boxFolderId, boxFileName, helloStream).then(file => {
    console.log(file);
});

boxFileName を別のファイル名、たとえば hello-world.txt にすれば、そのファイル名で box.com の該当フォルダにファイルが作成されます。

実行。

$ node index.js

これで box.com の該当フォルダ内に hello.txt がアップロードされます。 ちなみに、再度 node index.js するとエラーになります。 既存のファイルが存在している場合、この方法で更新(上書き)することはできません。

更新するには、次のようにします。

const helloStream2 = fs.createReadStream('./hello.txt');
const fileId = '1114737362820';
client.files.uploadNewFileVersion(fileId, helloStream2).then(file => {
    console.log(file);
});

uploadNewFileVersion 関数の最初の引数の値: 1114737362820 これは、 更新対象となる hello.txt の fileId になります。

なお、fileId は、次のように フォルダ内のファイル一覧を取得する API を使って調べることもできます。

const params = {
    usemarker: 'false',
    fields: 'name',
    offset: 0,
    limit: 25
};

client.folders.getItems(boxFolderId, params).then(items => {
    console.log(items)
});

まとめ

認証の部分さえ解決できればあとは簡単でした。APIのドキュメントも充実しているし。 ただ個人アカウントでは制限があるし、 もうこれ以上調査する気にはなれない。