Edited at

RubyでZaim APIを利用する

More than 3 years have passed since last update.


RubyでZaim APIを利用する

クレジットカード連携していてかつAPIを公開している家計簿サイトを探していたんだけど、MoneyForwardとかMoneyTreeは無理だった。

ZaimができそうなのでAPI叩くメモ

Gemがあったけど使えなかったのでOauthでアクセスする方法を記載する


手順


  1. Zaim Developers Centerでの登録

  2. OAuthのトークンを取得

  3. APIを叩く


1.Zaim Developers Centerにアクセスしてアプリケーションを作る

Zaim Developers Centerにアクセス

ログインすると下記の画面が出るので、新しいアプリケーションを追加を選択

スクリーンショット 2015-10-15 00.52.50.png

名称とか組織とかサービスのURLは適当で良いっぽい?

スクリーンショット 2015-10-15 00.54.39.png

この後出てくるConsumer Key, Consumer Secretなどをメモっておく


2. OAuthのトークンを取得

require 'oauth'

CONSUMER_KEY = '1で取得したConsumer Key'
CONSUMER_SECRET = '1で取得したConsumer Secret'

consumer = OAuth::Consumer.new(CONSUMER_KEY, CONSUMER_SECRET,
site: 'https://api.zaim.net',
request_token_path: '/v2/auth/request',
authorize_url: 'https://auth.zaim.net/users/auth',
access_token_path: '/v2/auth/access')
request_token = consumer.get_request_token(oauth_callback: 'http://google.com')
system('open', request_token.authorize_url)
print "Verifierを入力してください:"
oauth_verifier = gets.chomp.strip
access_token = request_token.get_access_token(:oauth_verifier => oauth_verifier)
p access_token.token
p access_token.secret

これを実行するとブラウザが開きます。

ログインボタンを押して認証してください

ただ、なぜか下記のようなログイン完了画面が出ますがどんだけ待っても移動しません

スクリーンショット 2015-10-15 01.03.38.png

ここで右クリック→ページのソースの表示でソースを見ます。

そこでverifyで検索してください。すると何やらトークンのようなものが見つかるはずです。

それをコンソールにコピペしてください。(上記のプログラムを実行すると入力待ちになっているはず)

すると、2行文字列が表示されます。

上の文字列がACCESS TOKEN、下の文字列がACCESS TOKEN SECREETです。これもメモリます


3. APIを叩く

下記のようなプログラムを作ってみました。

require 'oauth'

require 'json'

CONSUMER_KEY = '1で取得したCONSUMER KEY'
CONSUMER_SECRET = '1で取得したCONSUMER SECRET'
ACCESS_TOKEN = '2で取得したACCESS TOKEN'
ACCESS_TOKEN_SECRET = '2で取得したACCESS TOKEN SECRET'
API_URL = 'https://api.zaim.net/v2/'

consumer = OAuth::Consumer.new(CONSUMER_KEY, CONSUMER_SECRET,
site: 'https://api.zaim.net',
request_token_path: '/v2/auth/request',
authorize_url: 'https://auth.zaim.net/users/auth',
access_token_path: '/v2/auth/access')
access_token = OAuth::AccessToken.new(consumer, ACCESS_TOKEN, ACCESS_TOKEN_SECRET)

# 認証できているかを確認
verify = access_token.get("#{API_URL}home/user/verify")
p JSON.parse(verify.body)

# カテゴリの取得
categories = access_token.get("#{API_URL}home/category")
p JSON.parse(categories.body)

# ジャンルの取得
genres = access_token.get("#{API_URL}home/genre")
p JSON.parse(genres.body)

# 出金(食料品)
access_token.post("#{API_URL}home/money/payment", category_id: 101, genre_id: 10101, amount: 12345)

APIリファレンスを元に作れば色々やれそうです。

おわり


参考にしたサイト

http://webcache.googleusercontent.com/search?q=cache:EFodIPiebBwJ:debulog.com/%3Fp%3D64+&cd=4&hl=ja&ct=clnk&gl=jp

http://webcache.googleusercontent.com/search?q=cache:qxrk9yuIAA4J:hatamon.blogspot.com/2014/04/oinknotezaim.html+&cd=1&hl=ja&ct=clnk&gl=jp