電気代を毎日連絡してくれるLINEbotを作る(3):graphql-clientを使って、RailsからオクトパスエナジーのGraphQL APIを叩く

Tech

これまでのあらすじはこちらから↑

今回はRailsからオクトパスエナジーのAPIを叩いて電気代を取得します!備忘録です

オクトパスエナジーのAPIを叩くためのトークンを取得する

データを取得するためにトークンを取得します。

説明のとおりにメールとパスワードをinputに入力すると必要なトークンが返ってきます。

トークンを使ってクエリを叩いてみる

Railsから叩く前にGrapiQLから叩いてみます。

リクエストヘッダーに先程取得したtokenを入力してリクエストを送ることで、実際に電力情報を取得できることが確認できました

dotenv-railsを使って環境変数を管理する

オクトパスエナジーのトークンを取得するためにはIDとパスワードが必要です。これらの情報をソースコードに埋め込むわけには行かないので環境変数を使って対応していきます。

Render側で環境変数を設定する

Render上で環境変数を設定します。これでコード上でIDとパスワードを呼び出すことができるようになりました

graphql-clientを使ってRailsからオクトパスエナジーの情報を取得する

GitHub - github/graphql-client: A Ruby library for declaring, composing and executing GraphQL queries
A Ruby library for declaring, composing and executing GraphQL queries - GitHub - github/graphql-client: A Ruby library f...

トークンを取得する

トークンを取得するサービスクラスを作ります

require "graphql/client"
require "graphql/client/http"

class GetOctopusTokenService
  HTTP = GraphQL::Client::HTTP.new("https://api.oejp-kraken.energy/v1/graphql/")
  Schema = GraphQL::Client.load_schema(HTTP)
  Client = GraphQL::Client.new(schema: Schema, execute: HTTP)
  LOGIN_QUERY = Client.parse <<~'GRAPHQL'
    mutation Login($input: ObtainJSONWebTokenInput!) {
      obtainKrakenToken(input: $input) {
        token
        refreshToken
      }
    }
  GRAPHQL

  def perform
    res = Client.query(LOGIN_QUERY::Login, variables: {
      "input": {
        "email": ENV['OCTOPUS_EMAIL'],
        "password": ENV['OCTOPUS_PASSWORD']
      }
    })
    res.original_hash.dig("data", "obtainKrakenToken", "token")
  end

end

Clientを作る

OctopusGraphqlモジュールを作ります。

require "graphql/client"
require "graphql/client/http"

module OctopusGraphql
  # Configure GraphQL endpoint using the basic HTTP network adapter.
  HTTP = GraphQL::Client::HTTP.new("https://api.oejp-kraken.energy/v1/graphql/") do
    def headers(context)
      { "Authorization": GetOctopusTokenService.new.perform }
    end
  end
  # Fetch latest schema on init, this will make a network request
  Schema = GraphQL::Client.load_schema(HTTP)
  Client = GraphQL::Client.new(schema: Schema, execute: HTTP)
end

/octopus/indexにアクセスしたらAPIを叩くようにする

/octopus/indexにアクセスしたらAPIを叩いて結果をviewに出力するようにしました

class OctopusController < ApplicationController

  QUERY = OctopusGraphql::Client.parse <<~'GRAPHQL'
    query HalfHourlyReadings($accountNumber: String!, $fromDatetime: DateTime, $toDatetime: DateTime) {
      account(accountNumber: $accountNumber) {
        properties {
          electricitySupplyPoints {
            halfHourlyReadings(fromDatetime: $fromDatetime, toDatetime: $toDatetime) {
              startAt
              endAt
              version
              value
              costEstimate
            }
          }
        }
      }
    }
  GRAPHQL

  def index
    res = OctopusGraphql::Client.query(QUERY::HalfHourlyReadings, variables: {
      accountNumber: ENV['OCTOPUS_ACCOUNT_NUMBER'],
      fromDatetime: Date.yesterday.beginning_of_day.iso8601,
      toDatetime: Date.yesterday.end_of_day.iso8601
    })
    properties = res.original_hash.dig("data", "account", "properties")
    electricitySupplyPoints = properties.first["electricitySupplyPoints"]
    halfHourlyReadings = electricitySupplyPoints.first["halfHourlyReadings"]
    @start_at = halfHourlyReadings.pluck("startAt").min.to_time.localtime.strftime("%Y/%m/%d %H:%M")
    @end_at = halfHourlyReadings.pluck("endAt").max.to_time.localtime.strftime("%Y/%m/%d %H:%M")
    @kwh = halfHourlyReadings.pluck("value").map(&:to_f).sum
    @cost = halfHourlyReadings.pluck("costEstimate").map(&:to_i).sum
  end
end

/octopus/indexにアクセスすると、前日の電力消費情報が表示されます。

取得するタイミング(日付が変わった直後等)によっては、十分なデータが提供されないことがありました。

RailsからGraphQL APIを叩くことができた

今回は、graphql-clientを使って、RailsからオクトパスエナジーのGraphQL APIを叩くことができました!

普段の業務ではRailsからGraphQLを叩くことがなく、自分にとって初めての取り組みでしたが無事目的を達成することができました!

続き

電気を見直してみませんか?

最後に、オクトパスエナジーの紹介をします!

オクトパスエナジーの電力量料金(1kWhあたりの料金)は、東京電力と比較して安く設定されています!電気代は毎月必ず来るものなので、少しでもオトクなところと契約したいですよね。

電力消費量東京電力
従量電灯B
オクトパスエナジー
グリーンオクトパス
120kWhまで19.88円19.68円
120kWh超えて300kWhまで26.48円24.35円
300kWh超える30.57円26.50円
電力量料金の比較(30A)

さらに、こちらのリンクから契約すると、あなたと私、それぞれに5000円のボーナスが貰えます!一緒にお得になりましょう٩( ‘ω’ )و

タイトルとURLをコピーしました