Node.jsでZendesk APIを叩いてみた

# はじめに

Zendeskはデンマーク発のカスタマーソフトウェアです。
主に問い合わせ等の管理で使うらしいです。(あまりわかっていませんｗ)

ただ、日本ではちょいちょい **技術サイト** として利用しているところを見かけます。

* cybozu developer network
    * https://developer.cybozu.io/hc/ja
* DataSpider Technical Network
    * https://dstn.appresso.com/hc/ja
* SORACOM Developers
    * https://dev.soracom.io/jp/
* コラボフローサポート
    * https://collaboflow.zendesk.com/hc/ja

そんなZendeskですが、REST APIが搭載されているので、
いろいろとデータを抜き出したりできます。
https://developer.zendesk.com/rest_api

# やりたいこと

Node.js (のツール/モジュール) を使って、Zendeskの **ユーザー数 (アカウント数)** を取得したいと思います

# ツール

Zendeskの [こちらのサイト](https://developer.zendesk.com/rest_api/docs/api-clients/nodejs) に、いろいろな言語に対応したツールがありました。
Node.jsも2種類あります。

ただ、このツールは外部の方？が作っており、リファレンスが多いとはなかなか言えません。。
(GitHubのREAD MEぐらい)
なのでいざ使おうとなるとコード読んだりしてなかなか大変です
※ 今回は [node-zendesk](https://github.com/blakmatrix/node-zendesk) というツールを使います。

# インストール

ここから先は  [node-zendesk](https://github.com/blakmatrix/node-zendesk) を使った説明になります！！

npmで用意されているので、普通に

``` bash
$ npm install node-zendesk
```

で良いです。基本プロジェクトごとのインストールになると思うので `-g` はなくて良いと思います。

# コード

コードは大きく

* 認証部分
* 実行部分

に分けられます

## 認証部分

API Token による認証と OAuth による認証が用意されています。
※ 今回は API Token を利用します。

```javascript
const client = zendesk.createClient({
  username:  'username', // Your Email Address
  token:     'token', // Your API Token
  remoteUri: 'https://<XXXX>.zendesk.com/api/v2' // Your Zendesk URI
});
```

まぁ、READ MEにあるそのままですね。

で、ここからREAD MEに書いてないことも出てくるのですが、
もし **Proxy** を通したい場合は、

```javascript
const client = zendesk.createClient({
  username:  'username', // Your Email Address
  token:     'token', // Your API Token
  remoteUri: 'https://<XXXX>.zendesk.com/api/v2', // Your Zendesk URI
  proxy: 'http://xxxx.proxy' // Your Proxy Server URL
});
```

と、記述すると出来ました。
他にもオプションがあるので、もしかするとこの方法で使えるかもしれません(Proxy以外試していませんm(_ _)m )
https://github.com/blakmatrix/node-zendesk#command-line-options-for-scripts


## 実行部分

認証部分で定義した`client`を利用します。

```javascript
// ユーザー数を取得する場合
client.users.list((err, req, result) => {
  if (err) {
    console.log(err);
    return;
  }
  console.log(result)
});

// View数を取得する場合
client.view.list((err, req, result) => {
  if (err) {
    console.log(err);
    return;
  }
  console.log(result)
});
```

client.`メソッド`.`アクション` という組み合わせになります！
(ここに気づくまでに時間がかかった。。)

それぞれのメソッドでどんなアクションができるかは、GitHubのREAD MEに書いてあります！

# 発展

Zendeskからユーザー数を取得してkintoneへ登録するプログラムを作ってみました。

```javascript
// zendeskからユーザー数を取得する関数
const getZenUsers = () => {
  // 同期処理のためにPromise化
  return new Promise((resolve, reject) => {
    const zendesk = require('node-zendesk');

    const client = zendesk.createClient({
      username:  'username', // Your Email Address
      token:     'token', // Your API Token
      remoteUri: 'https://<XXXX>.zendesk.com/api/v2', // Your Zendesk URI
      proxy: 'http://xxxx.proxy' // Your Proxy Server URL
    });

    client.user.list((err, req, result) => {
      if (err) {
        console.log(err);
        reject(null);
      }
      resolve(result.length);
    });
  });
};

// kintoneへ登録
const posKintone = data => {
  if (!data) {
    return;
  }
  const kintone = require('kintone-nodejs-sdk');
  const common = {
    Domain: '<Your subdomain>.cybozu.com',
    AppID: '<Your App ID>',
    APIToken: '<Your API Token>',
    Record: {
      '<Field Code>': {
        value: data
      }
    }
  };
  const kintoneAuth = new kintone.Auth();
  kintoneAuth.setApiToken(common.APIToken);
  const kintoneConnection = new kintone.Connection(common.Domain, kintoneAuth);
  const kintoneRecord = new kintone.Record(kintoneConnection);
  kintoneRecord.addRecord(common.AppID, common.Record)
    .then(resp => {
      console.log('kintoneのアプリにデータを登録しました');
      return resp;
    });
};

// 実行：成功時のみ
getZenUsers()
  .then(resp => {
    posKintone(resp);
  });

```

# このモジュールを使った理由

通常、Zendeskのユーザー取得APIは **100** 件までしか一括で取得できないのですが、
このnode-zendeskは裏側で再帰処理がされているらしく、

**<font color="red">何も意識しなくてもごそっと全件取得できました！！ </font>**
↑ この楽さ、ものすごい重要！

# おわりに

モジュールがあるともろもろの記述が省略できて便利ですが、
リファレンスが整っているとは限らないので、**トライ&エラー**が大切です！！

それでは！≧(+･` ཀ･´)≦