![見出し画像](https://assets.st-note.com/production/uploads/images/9916569/rectangle_large_type_2_cb7813bfc9a39ff171f6abed9fd7721c.png?width=1200)
初心者が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のソースコードを読んだのは初めてでした、いい経験?になりました。
公式のガイドやリファレンスがかなり充実しているが、なぜかかなり迷ってしまったりして時間かかってしまった。コードを書いてみないで調べるばっかり、みたいなことも多いのでサクサク書いてバンバン試すように変えていきたい。