見出し画像

初心者がseleniumを使ってInstagramをエゴサするBotを作るお話(shreadsheetAPI編)

・はじめに

前回の記事の続きです。SheetAPIを利用してスクレイピングしたデータを記入する、seleniumクラスに渡すために前に書き込んだデータを取得するということをします。

・実装

require 'google/apis/sheets_v4'
require 'googleauth'
require 'googleauth/stores/file_token_store'
require 'fileutils'

class GoogleSpreadsheet
  OOB_URI = 'urn:ietf:wg:oauth:2.0:oob'.freeze
  APPLICATION_NAME = 'InstaBot'.freeze
  CREDENTIALS_PATH = 'credentials.json'.freeze
  TOKEN_PATH = 'token.yaml'.freeze
  SCOPE = Google::Apis::SheetsV4::AUTH_SPREADSHEETS

  def initialize(spreadsheet_id,range_name)
    @spreadsheet_id = spreadsheet_id
    @range_name = range_name
    @service = Google::Apis::SheetsV4::SheetsService.new
    @service.client_options.application_name = APPLICATION_NAME
    @service.authorization = authorize
  end

  def authorize
    authorization = Google::Auth::UserRefreshCredentials.new(client_id: CLIENT_ID,
                                                         client_secret: CLIENT_SECRET,
                                                         refresh_token: REFRESH_TOKEN)
    authorization
  end

  # def authorize
  #   client_id = Google::Auth::ClientId.from_file(CREDENTIALS_PATH)
  #   token_store = Google::Auth::Stores::FileTokenStore.new(file: TOKEN_PATH)
  #   authorizer = Google::Auth::UserAuthorizer.new(client_id, SCOPE, token_store)
  #   user_id = 'default'
  #   credentials = authorizer.get_credentials(user_id)
  #   if credentials.nil?
  #     url = authorizer.get_authorization_url(base_url: OOB_URI)
  #     puts 'Open the following URL in the browser and enter the ' \
  #          "resulting code after authorization:\n" + url
  #     code = gets
  #     credentials = authorizer.get_and_store_credentials_from_code(
  #       user_id: user_id, code: code, base_url: OOB_URI
  #     )
  #   end
  #   credentials
  # end

  def append(input_values)
    values = input_values
    value_range = Google::Apis::SheetsV4::ValueRange.new(values: values)
    value_input_option = "USER_ENTERED"
    @service.append_spreadsheet_value(@spreadsheet_id,
                                      @range_name,
                                      value_range,
                                      value_input_option: value_input_option)
  end

  def get_lastpost_date
    result = @service.get_spreadsheet_values(@spreadsheet_id,@range_name)
    Time.parse(result.values[-1][5])
  end
end

いろいろググりつつも最終的に参考にしたのは公式のガイドとgemのソースコードです。

・解説

。前半のInitializeとauthorizeはquick start guideの通りです。簡単に認証することができました。後は用意されているメソッドでパパっと書くだけです。gemのソースコードを見るとどのメソッドがどのAPIに対応しているのかがわかります。今回はvalues.getとvalues.appendを利用したいので、使うのはget_spreadsheet_valuesとappend_spreadsheet_valueです。わかりにくい……

 後にLambdaにアップロードすると、Lambdaの機能上token.yamlを書き換えることができずに認証できない!となって困りました。幸いrefresh tokenだけで認証する方法があったので、そちらに書き換えたら問題なく認証することができました。小並感……

・感想

ぱっと調べて出てくるのが、google-api-clientでないgemを使っているものだったりで困惑したのですが、google謹製ということでこれを使うことにしました。gemのソースコードを読んだのは初めてでした、いい経験?になりました。

公式のガイドやリファレンスがかなり充実しているが、なぜかかなり迷ってしまったりして時間かかってしまった。コードを書いてみないで調べるばっかり、みたいなことも多いのでサクサク書いてバンバン試すように変えていきたい。

この記事が気に入ったらサポートをしてみませんか?