どくぴーの備忘録

真面目なことを書こうとするクソメガネのブログ。いつ投げ捨てられるのかは不明

写真を自動でアップロードする技術 〜Google Photos API編〜

アブストラク

2018年のGoogle I/O直前にて公開されたGoogle Photos APIを使って一眼レフカメラで撮った写真をよしなに自動でアップロードするための手法録になります。

高専カンファレンスで大慌てで話していた発表を丁寧に焼き直そうとした感じになっています。

e10dokup.hateblo.jp

本記事ではGoogle Photos APIについてまとめます。スライド中で触れられている他の要素については別記事にて…。

Google Photos API

Google Photos APIs  |  Google Developers

我々(主語拡大)は君をずっと待っていた。

これまで名前だけになってしまったPicasa APIを使ってGoogle Photosへの画像アップロード(容量無制限無制限・16MPへの画像縮小制約あり)ができる環境はあったが、Google Photosにオリジナルサイズの画像の投稿が可能になったGoogle Photos APIがついにロンチされました。

トップページから入れるガイドページの概要を見る限りがっさりとした仕様では

  • OAuth 2.0による認証
  • Library
    • ユーザのGoogle Photosアカウントに保存されるメディアについての操作ができるぞ!
  • Albums
    • ほかユーザと共有するためのアルバムに関する操作ができるぞ!
  • Media Items
    • Google Photosにおけるメディア(画像、動画)についての操作ができるぞ!
    • 写真のアップロード自体はここに含まれる
  • Share
    • 自アカウントのメディアを他の人に共有するぞ!

と普通にGoogle Photosを使っている上での通り一遍の操作はできそうな印象があります。

というわけで今回は特に僕が達成したい「画像のGoogle Photos上へのアップロード」について記していきましょう。

というわけで本題。

Google Photos APIを使えるようにする。

いつものMaps等のGoogle APIsを使えるようにするプロセスとほぼ一緒ですね。まず、Google Cloud PlatformのコンソールからAPIの有効化を選び、API ライブラリ上でPhotos Library APIを検索すると、お目当てのPhotos Library APIが出てくるので有効化します。

f:id:e10dokup:20180816204339p:plain

有効化した後に「APIとサービス」のページに移動し、左ペインの認証情報を選んでから新規の認証情報としてOAuthクライアントIDを選択して作ればGoogle Cloud Platformのコンソールでの準備はOKです。僕は今回はAndroidAndroid Things)からアップロードを試みていたので、この中でdebug.keystoreのようなkeystoreファイルのSHA1キーやApplication IDを入れたりしています。

f:id:e10dokup:20180816204511p:plain

Google Photos APIに画像を投稿してみる。

Google Photos APIhttps://photoslibrary.googleapis.com )における画像投稿は以下のようなシーケンスになっています。

  1. クライアントからGoogle Photos APIPOST /v1/uploads に対して画像を application/octet-stream で送信する
  2. Google Photos APIからレスポンスとしてアップロードトークンが返却される
  3. 返却されたアップロードトークンを含めてGoogle Photos APIPOST /v1/mediaItems:batchCreateJSONを送信する
  4. Google Photos APIから送信したJSONGoogle Photos API内での情報が追加されレスポンスとして返却される = アップロード完了

ひとつずつ追っていきましょう。

1. 画像データの送信

なんてことはなく、/v1/uploads に以下の内容のPOSTリクエストを送るだけです。

<Header>
Authorization: Bearer <Token>
Content-Type: application/octet-stream
X-Goog-Upload-File-Name: <ファイル名>

<Body>
画像のバイナリ

POSTが成功すると次のようなレスポンスが特に何かに包まれてるわけでもなく返却されます。この返却されている文字列がアップロードトークンになります。

CAIS6QIApKFirX.....

2. メディアアイテムを登録する

/v1/mediaItems:batchCreate に先程手に入れたアップロードトークンを含めた次のjsonをbodyにしてPOSTリクエストを送ります。

<Header>
Authorization: Bearer <Token>
Content-Type: application/json

<Body>
{“newMediaItems”:[
  {
    “simpleMediaItem":{
      “uploadToken":"CAIS6QIApKFirX....."
    }
  }
]}

POSTが成功すると送ったjsonのパラメータにメタデータ等が肉付けされる感じで返却されます。この時点でGoogle Photosを確認するとアップロードされた写真が登録されているのが確認できます。

f:id:e10dokup:20180916145859p:plain

これで写真の投稿は完了です。この辺に関してはカメラで撮った写真とかに全く関係がないので写真によらない要素でも使えそうな気がします。アルバムとかの操作もできるのですが、それはまた別の機会に…。