Zaim.jsをAPI ver2.xが使えるように改良してみた

前提

  • NodeによるZaimAPIの利用 の続き
  • 内部を書き換えるだけなので、基本的な使い方は上記記事と同様
  • 元のモジュール(Zaim.js)がMITライセンスなのでそれに準ずる

概要

npmでインストールできる、zaim.jsは、Zaim API ver1を前提としているため、ver2の機能を利用することができない。
そこで、zaim.jsのソースコードをベースに、API ver2を利用できるように改変する。

OAuth用URLの差し替え

OAuthで認証してzaimオブジェクトを作成する部分の、認証用URLをver2のURLに差し替え

変更前

this.client = new oauth.OAuth(
  'https://api.zaim.net/v1/auth/request',
  'https://api.zaim.net/v1/auth/access',
  this.consumerKey,
  this.consumerSecret,
  '1.0',
  this.callback,
  "HMAC-SHA1"
);

変更後

this.client = new oauth.OAuth(
  'https://api.zaim.net/v2/auth/request',
  'https://api.zaim.net/v2/auth/access',
  this.consumerKey,
  this.consumerSecret,
  '1.0',
  this.callback,
  "HMAC-SHA1"
);

リクエストトークン取得用のURLを差し替える

変更前

this.client.getOAuthRequestToken(function(err, token, secret) {
  that.token = token;
  that.secret = secret;
  callback('https://www.zaim.net/users/auth?oauth_token=' + that.token);
});

変更後

this.client.getOAuthRequestToken(function(err, token, secret) {
  that.token = token;
  that.secret = secret;
  callback('https://auth.zaim.net/users/auth?oauth_token=' + that.token);
});

入力データ取得用APIのURLを差し替える

ver1ではPOSTだったが、ver2ではGETになるため、それについても書き換える
変更前

Zaim.prototype.getMoney = function(params, callback) {
  var url = "https://api.zaim.net/v1/money/index.json";
  if (arguments.length === 1) {
    callback = params;
    params = {};
  }
  this._httpPost(url, params, callback);
};

変更後

Zaim.prototype.getMoney = function(params, callback) {
  var url = "https://api.zaim.net/v2/home/money";
  if (arguments.length === 1) {
    callback = params;
    params = {};
  }
  this._httpGet(url, params, callback);
};

httpGetメソッドで、パラメータを付与できるように改変する

オリジナルのhttpGetメソッドは、パラメータの付与に対応していなかったので、対応できるように修正する
変更前

Zaim.prototype._httpGet = function(url, callback) {
  if (!this.token || !this.secret) {
    throw new Error("accessToken and tokenSecret must be configured.");
  }
  this.client.get(url, this.token, this.secret, function(err, data) {
    if (err) {
      throw err;
    } else {
      callback(typeof data === 'string' ? JSON.parse(data) : data);
    }
  });
};

変更後

Zaim.prototype._httpGet = function(url, params , callback) {
  url += '?';
  Object.keys(params).forEach(function(key) {
    url += key + '=' + params[key] + '&';
  });
  if (!this.token || !this.secret) {
    throw new Error("accessToken and tokenSecret must be configured.");
  }
  this.client.get(url, this.token, this.secret, function(err, data) {
    if (err) {
      throw err;
    } else {
      callback(typeof data === 'string' ? JSON.parse(data) : data);
    }
  });
};

Zaim API ver2特有の機能を使ってみる

ここまでで、getMoneyメソッドに関してはver2のAPIを呼び出せるようになったので、ver2でしか利用できない機能を使ってみる。
下記コードは、2017年にAmazonで購入した商品の一覧を取得する。

ソースコード

zaim.getMoney({
  place: 'Amazon',
  start_date: '2017-01-01'
} , function(data) {
  console.log(data.money.map(function(m) {
    return [m.date , m.place , m.amount , m.comment];
  }));
});

実行結果

$ node zaim.js
[ [ '2017-02-12', 'Amazon', 1976, 'コーディングを支える技術' ],
  [ '2017-02-04', 'amazon', 2597, 'かじり木、チモシー、ペレット、消臭、砂' ],
  [ '2017-02-04', 'Amazon', 702, 'リンゴ酢' ],
  [ '2017-02-01', 'Amazon', 980, 'Kindle Unlimited 201702' ],
  [ '2017-01-14', 'Amazon', 1734, '野菜ジュース12本セット' ],
  [ '2017-01-09', 'Amazon', 258, '応用情報技術者の本中古' ],
  [ '2017-01-04', 'Amazon', 2880, 'データベーススペシャリスト教科書' ],
  [ '2017-01-01', 'Amazon', 18820, 'FIRE HDとそのカバーとその保証' ],
  [ '2017-01-01', 'Amazon', 980, 'Kindle Unlimited 201701' ] ]
$

購入店舗に関する情報はver2から追加された機能で、ver1ではできなかった、店舗によるフィルタリングができたことがわかる。また、ver1では支出額は負数だったが、ver2では収支に関わらず正数となっている。

また、上記実行結果には関係ないが、ver1では最大取得件数が100件だったのに対し、ver2では無制限となっており汎用性も高まっている。

他のメソッドについて

同様に他のメソッドについても、APIのURLをver1のURLからver2のURLに差し替えることで使用可能となるが、
個人的にgetMoneyメソッドさえ使えれば今は困らないのでコレ以上の改変は必要に応じて行うことにする。

参考

NodeによるZaimAPIの利用 と同様

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です