EveOnline Authenticated Crestを使ってThirdPartyアプリを作ってみる その3


前回はCrestを使用してCharacter情報取得まで行った。

今回は、Crestを使ってマーケットデータ取得を行っていく。

その前に、前回のプログラムを若干修正する。
まずは、マーケットデータを取るためにはOAuth のスコープを空から publicData に 広げる必要がある。
そのため、gem側(omniauth-eveonline/lib/strategies/eveonline.rb)を改良して、Scopeを設定できるようにする。
また、あわせて 認証後はCharacter情報等をついでに取得して返してもらうようにした。

omniauth-eveonline/lib/strategies/eveonline.rb

require 'omniauth-oauth2'
require 'multi_json'
require 'logger'

module OmniAuth
  module Strategies
    class EveOnline < OmniAuth::Strategies::OAuth2
      option :name, 'eve_online'

      option :client_options, {:site => "https://login.eveonline.com",
                               :authorize_url => '/oauth/authorize',
                               :token_url => '/oauth/token'}

      def authorize_params
        super.tap do |params|
          %w[scope].each do |k|
            if request.params[k]
              params[k.to_sym] = request.params[k]
            end
          end
        end
      end

      uid { raw_info['CharacterID'] }

      info do
        {
            :character_id => raw_info['CharacterID'],
            :character_name => raw_info['CharacterName'],
            :expires_on => raw_info['ExpiresOn']
            :token_type => @raw_info['TokenType']
        }
      end

      extra do
        {
        }
      end

      def request_phase
        super
      end

      def callback_phase
        super
      end

      def raw_info
        @raw_info ||= access_token.get("https://login.eveonline.com/oauth/verify").parsed
      end
    end
  end
end

また、クライアント側はScopeを設定する。

config/initializers/omniauth.rb

Rails.application.config.middleware.use OmniAuth::Builder do
  provider :eve_online, '取得したClient ID', '取得した Secret Key',
           scope: 'publicData'
end

これでログインしようとすると ちょっと前回とかわる

スクリーンショット 2014-12-28 22.07.01

さて、これで下準備はできたので マーケットデータを取ってみる。

app/controllers/markets_controller.rb

  def index
    #create access token
    client = OAuth2::Client.new(session[:client_id],session[:client_secret])
    token = session[:access_token]
    access_token = OAuth2::AccessToken.new(client,token)
    #get Market Sell Order
    json = access_token.get("https://crest-tq.eveonline.com/market/10000002/orders/sell/?type=https://api-sisi.testeveonline.com/types/683/")
    @markets = ActiveSupport::JSON.decode(json.response.env.body)
    logger.debug json.response.env.body
  end

Sell Order 取得のサンプルは 次の公式ページに書いてある。
NOM NOM TASTY MARKET DATA!

Sell Order 取るときのURL は次の形式

https://crest-tq.eveonline.com/market/<region_id>/orders/sell/?type=https://api-sisi.testeveonline.com/types/<type_id>/

上記例の場合 region_id = 10000002 = The Forge, type_id = 683 = Bantam Blueprint を取得する。
ちなみに Region_id,type_id両方指定しないと エラーになる。

これで取得した結果が次のような感じになる。

{"totalCount_str": "21", 
"items": [{"volume_str": "8", "buy": false, "issued": "2014-10-19T11:07:17",
"price": 2550000.0, "minVolume": 1, "volume": 8, "range": "region",
"href": "https://crest-tq.eveonline.com/market/10000002/orders/911270698/",
"duration_str": "365", 
"location": {"href": "https://crest-tq.eveonline.com/universe/locations/60004234/",
"name": "Sirseshin VIII - Moon 3 - Spacelane Patrol Assembly Plant"},
"duration": 365, "minVolume_str": "1", 
"type": {"href": "https://crest-tq.eveonline.com/types/683/", "name": "Bantam Blueprint"}},
(・・・中略・・・)
, {"volume_str": "8", "buy": false, "issued": "2014-10-04T11:07:08", "price": 2550000.0, "minVolume": 1, 
"volume": 8, "range": "region", 
"href": "https://crest-tq.eveonline.com/market/10000002/orders/911270690/",
"duration_str": "365", 
"location": {"href": "https://crest-tq.eveonline.com/universe/locations/60004210/",
"name": "Olo II - Moon 3 - Spacelane Patrol Assembly Plant"}, 
"duration": 365, "minVolume_str": "1", 
"type": {"href": "https://crest-tq.eveonline.com/types/683/", "name": "Bantam Blueprint"}}],
"pageCount": 1,
"pageCount_str": "1",
"totalCount": 21}

これを加工して画面表示すると次のようになる。

スクリーンショット 2014-12-28 22.40.19

こんな感じでほかの情報もとれそうである。
また追っ手確認する予定。

コメントはまだありません

コメントを残す

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

AWS
Docker
ECS+ALBの動的ポートマッピングでダウンタイムのないデプロイを試してみた

はじめに 少し前に個人で作成しているWebサービスのインフラにDockerを使い始めました。 複数台 …

スクリーンショット 2016-08-16 0.43.10
AngularJS
クライアントAngularJS サーバーサイドRails5 におけるOmniauth 認証を試してみる

去年にEOPESを公開してから1年半。 初めての外部公開サービスだったが、ソースは結構ごり押し部分も …

スクリーンショット 2016-01-09 20.02.08
Ruby on Rails
Capistrano3を利用してBitbucketプライベートリポジトリにあるRailsアプリをデプロイしてみた

Railsアプリを配置する際、毎回手作業で頑張って配置してきたが、そろそろ自動デプロイを・・・ とい …