こんにちは。スタメンでバックエンドエンジニアをしております、永井です。 入社して半年ほど経ちますが、任される業務の幅や深さが広がっていき、毎日わくわくしながら働いています。
この前、Rubyで生成したファイルを直接、RubyのGem 「google-drive-ruby」を使用して、社内で使っているGoogle Driveにフォルダ指定してアップロード(ダウンロード)する方法を勉強しました。 今回はその詳しい内容と方法を紹介したいと思います。
目次
- 「google-drive-ruby」とは?
- Google Driveの設定
- 「google-drive-ruby」でアップロードする
- おわりに
「google-drive-ruby」とは?
「google-drive-ruby」とは、Google Driveにあるファイルやスプレッドシートに対して、書き込みや読み込みを行ったり、ファイルをアップロードしたりすることができる、RubyのGemです。 公式ドキュメントはこちらです。
Google Driveの設定
「google-drive-ruby」を使って、Google Driveにファイルをアップロードするには、アップロード先のGoogle Driveから認証情報を取得しなければいけません。
ログインをするための認証情報には、「OAuth クライアント ID」と「サービス アカウント キー」の2種類がありますが、前者の「OAuth クライアント ID」を使用した認証方法は、手動で認証ボタンをクリックする必要があります。そのため、capybaraやwheneverを使った自動化処理、定期処理には向きません。今回はRubyの方で自動化処理をしたかったため、後者の「サービス アカウント キー」を使用して、Google Driveへログインします。
ちなみにサービスアカウントとは、人間ではない仮想的なアカウントであり、アプリケーションなどのシステムが使用します。詳しくは公式ドキュメントを御覧ください。
それでは、まずサービスアカウントを作成するところから始めます。
1. GCP(Google Cloud Platform)にログインします。
2. 左タブの「APIとサービス」から「認証情報」のページに飛びます。
3. 「認証情報を作成」というプルダウンから、「サービス アカウント キー」を選んで、認証情報をダウンロードします。
アップロードする前の準備として、認証情報で得たJSONファイル内のprivate_emailというメールアドレスを、アップロードしたいフォルダの共有に加えて、サービスアカウントに権限を付与する必要があります。
1. アップロード先のフォルダから共有を選択
2. 先程のメールアドレスを入力
これで、アップロード先を指定することができます。
「google-drive-ruby」でアップロードする
まず、「google-drive-ruby」をインストールします。
Gemfileに以下を記述。
gem 'google_drive'
bundle installを実行。
$ bundle install --path vendor/bundle
これでGemがインストールされました。
ここから、Rubyでアップロードをする処理に移っていきたいと思います。
private_key = OpenSSL::PKey::RSA.new(Rails.application.secrets.google_drive_private_key) client = Signet::OAuth2::Client.new( token_credential_uri: Rails.application.secrets.google_drive_token_uri, audience: Rails.application.secrets.google_drive_token_uri, scope: %w( https://www.googleapis.com/auth/drive https://docs.google.com/feeds/ https://docs.googleusercontent.com/ https://spreadsheets.google.com/feeds/ ), issuer: Rails.application.secrets.google_drive_client_email, signing_key: private_key ) client.fetch_access_token! GoogleDrive.login_with_oauth(client.access_token)
ここでは、先程ダウンロードした、認証情報が含まれるファイル読み込んで、ログインするまでの処理を行っています。 client.fetch_access_token!ではGoogleサーバーから、アクセストークンを取得してきます。そのアクセストークンをlogin_with_authメソッドの引数に渡して、Google Driveにログインしています。
次に、フォルダを指定してファイルをアップロードしていきたいと思います。
# Google Driveにログイン session = GoogleDrive.login_with_oauth(client.access_token) # 適当にファイルを作成 file = File.open("test.txt", "w+") # アップロードしたいフォルダを指定 folder = session.file_by_title("sample_folder") # ファイルを指定して、sample_forlerにアップロード folder.upload_from_file(file, "hoge.pdf", convert: false)
ログインした後、まずアップロードする先のフォルダをfile_by_titleでフォルダ名を指定して探します。もし指定したフォルダ名が存在しないければ、nilが返ってきます。
そのフォルダに対して、upload_from_fileメソッドでアップロードを行います。第1引数にアップロードしたいファイル、第2引数に自由なタイトルを指定します。
ちなみに、第3引数にconvert: falseを指定すると、Google Driveへアップロードした後に、Google Driveの方でフォーマットを変更されずに保存されます。
アップロードが完了して、Google Driveの指定のフォルダを見てみると、ちゃんとアップロードされていますね。
ダウンロードも同様に行うことができます。
# Google Driveにログイン session = GoogleDrive.login_with_oauth(client.access_token) file = session.file_by_title("test.txt") # 引数にダウンロード先のパスを指定 file.download_to_file(path)
file = session.file_by_title("test.txt")でダウンロードしたいファイル名を指定します。そして、file.download_to_file(path)でダウンロード処理を実行します。
おわりに
Rubyのgemである「google-drive-ruby」を使えば、簡単に指定のGoogle Driveフォルダにアップロードができました。今回はGoogle Drive APIの知識を深めることができましたが、今後は、その他のG Suiteや、GCPに関する知識も付けていきたいと思います。
最後に、株式会社スタメンでは一緒に働くエンジニアを募集しています。ご興味のある方はぜひエンジニア採用サイトをご覧ください。 CPに関する知識も付けていきたいと思います。
最後に、株式会社スタメンでは一緒に働くエンジニアを募集しています。ご興味のある方はぜひエンジニア採用サイトをご覧ください。