Help us understand the problem. What is going on with this article?

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

More than 1 year has passed since last update.

はじめに

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

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

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

やりたいこと

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

ツール

Zendeskの こちらのサイト に、いろいろな言語に対応したツールがありました。
Node.jsも2種類あります。

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

インストール

ここから先は node-zendesk を使った説明になります!!

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

$ npm install node-zendesk

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

コード

コードは大きく

  • 認証部分
  • 実行部分

に分けられます

認証部分

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

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 を通したい場合は、

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を利用します。

// ユーザー数を取得する場合
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へ登録するプログラムを作ってみました。

// 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は裏側で再帰処理がされているらしく、

何も意識しなくてもごそっと全件取得できました!!
↑ この楽さ、ものすごい重要!

おわりに

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

それでは!≧(+・` ཀ・´)≦

RyBB
サイボウズ テクニカルエバンジェリスト / kintone認定 カスタマイズスペシャリスト、アプリデザインスペシャリスト
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away