👻

GoogleDriveからresource_keyつきでファイル情報を取得する

2021/10/11に公開

前提

Ruby on Railsを利用
google-api-client gemを利用

ユースケース

Googleドライブの共有用URLをユーザーが入力する
システムは共有用URLをparseし、GoogleAPI経由でファイルの情報を取得する

サンプルコード

service = Google::Apis::DriveV3::DriveService.new
service.authorization = Google::Auth::ServiceAccountCredentials.make_creds(json_key_io: StringIO.new(SAMPLE_CREDENTIALS), scope: [SAMPLE_SCOPE])

resource keyなしの場合

file = service.get_file(GoogleドライブのファイルID)

resource keyありの場合

file = service.get_file(GoogleドライブのファイルID, options: { header: { 'X-Goog-Drive-Resource-Keys' => リソースキー } })

参考ドキュメント

X-Goog-Drive-Resource-Keys というtypoくさい文字列を使っている点が、私は非常に気に食わない

GoogleドライブのファイルIDについて

以下の3条件を満たす

  • 0ないし1始まりである
  • 28桁ないし33桁である
  • 使われる文字は正規表現で表現すると
%r{[~\-=\w]} # RFC-3986に基づく

今回はユーザーから入力されたURLを入力とすることから、ユーザーの入力文面からString#scanを用いて正規表現で抽出することを前提としている。
URIの形で渡される場合と、URLパラメータとして id=... の形で渡される場合がある

resource_keyについて

以下の2条件を満たす

  • 0-始まりの24桁である(あまり確信がない)
  • URLパラメータとして resourcekey=... の形で渡される。
  • スネークケースでもキャメルケースでもないのが非常に気持ち悪い

Googleドライブの共有URLについて

知る限り4パターンくらいある。
ファイルの配置場所がマイドライブかそれ以外かで異なる。
フォルダの場合パターンが変わる場合もある。

Google DriveのフォルダID命名規則(勝手に見つけた法則) がいうよりおそらくURLのパターンは多いように感じられる・・・。

なので正規表現で頑張って抜き出すしかない。

Discussion