Sinatra と jpstock を使って簡単なAPIをつくる

  • 6
    いいね
  • 0
    コメント
この記事は最終更新日から1年以上が経過しています。

既存のサービスとかであるかもしれないが、株価をjsonで取得できるAPIが欲しくて適当に作成

1.構成

サーバー : CentOS6.7
Ruby : 2.3
sinatra : 1.4.7
jpstock : 0.6.7
working directory : /root/api_stock

2. 準備

データを取得するやつ

tool.rb
#!/usr/bin/ruby
# coding: utf-8

require 'jpstock'
require 'curses'
require 'holiday_japan'
require 'json'

## calculate businness days

class Date
  def business_days(i)
    date = self
    i.times.each do |j|
      date -= 1
      date -= 1 while (date.wday <= 0 || date.wday >= 6) or (date.national_holiday?)
    end
    date
  end
end

## get share price

class Stock
  def  initialize(scode)
    @scode = scode
  end

  def get_code(scode)
    stocks = scode
    stock = JpStock.price(:code => stocks )
    name = JpStock.sector(:code => stocks )
      hstocks = JpStock.historical_prices(
      :code => stocks,
      :start_date => Date.today.business_days(24),
      :end_date => Date.today
     )
    last_day = hstocks[0].close
    this_day = stock.close
    rate = ((this_day - last_day)/last_day * 100).round(2)
    company =  "#{name.company_name}"
    price = "#{stock.close}"
    ration = "#{rate}"
   shash = {"会社名":company, "現在値": price, "前日比": ration}
   shash.to_json
  end

end

動かすやつ(GETのみ)

s_api.rb
#!/usr/bin/ruby
# coding: utf-8

require 'sinatra'
require 'sinatra/reloader'
require 'json'
require_relative 'tool'

## set bind IP adress
set :bind, '192.168.0.1'
set :show_exceptions, false

## Get share info

get '/share/:id' do

   content_type :json
   num = params['id']
   sprice = Stock.new(num.to_i)
   astock = sprice.get_code(num.to_i)
  return astock

end

error do

  "Sorry!\s No exist share code number!!\n"

end

3.デーモン化

thinを利用

config.ru
config.ru

ENV['RACK_ENV'] = "production"

require File.expand_path '/root/api_stock/s_api.rb', __FILE__

run Sinatra::Application
config.ym
 environment: production
 chdir: /root/api_stock
 address: 192.168.0.1
 user: root
 group: root
 port: 4567
 pid: /root/api_stock/thin.pid
 rackup: /root/api_stock/config.ru
 log: /root/api_stock/thin.log
 max_conns: 1024
 timeout: 30
 max_persistent_conns: 512
 daemonize: true

起動

#thin -s 2 -C config.yml -R config.ru start

確認

#curl 'http://192.168.0.1:4567/share/7974' | jq '.'

結果


{
  "前日比": "9.69",
  "現在値": "23945.0",
  "会社名": "任天堂(株)"
}