24
miyake
2025/06/17
0
D3の三宅です.Google Photos API が今年の4月から仕様変更されたことをご存知でしたか?
今回は仕様変更に翻弄されながらも,なんとか対処を行った話をしていこうと思います.
問題発生と原因
この仕様変更を端的にまとめると,すべての写真を取得する API が,そのアプリからアップロードした写真しか取得できなくなったというものです.
参考: https://developers.googleblog.com/ja/google-photos-picker-api-launch-and-library-api-updates/
おそらく,Google 側としては,一覧取得API の代わりとして,ユーザに写真を選択させるAPI (Picker API) を使わせることで,悪意のあるアプリによる写真の無差別一括取得を防ぎ,セキュリティ向上を狙ったのだと思います.
しかし,この写真の一括取得ができなくなる,ということが研究室にとっては大打撃でした.
というのも,この仕様変更に気づいたのは以下の問題が発生するようになったためです.
- このブログ (nomnichi) の記事を執筆するときに,記事に入れるために選別する写真が見られなくなった.
具体的にはには,記事作成時に Google Photos から写真の一覧を取得し,その中から必要な画像を選別するのですが,その一覧が全く表示されなくなっていました.
なお,実際に記事に写真を入れるとキャッシュサーバである pinatra に保存さるので,今までの記事の写真は問題なく表示されています.
(pinatra は,まさにこういったバックの写真提供サーバの変更を吸収することが目的のサーバなので,このサーバを開発した先輩方には頭がらないですね.) - Slack ボット swimmy が写真のアップロードに失敗するようになった.
各メンバがスマホで撮った写真を乃村研の Google Photos にアップロードする際に,全員が研究室 Google アカウントにログインするのはセキュリティ上よろしくないですよね.
そこで,乃村研ではSlack 上に写真をアップロードすると,自動的に swimmy が Google Photos にアップロードしてくれていたのですが,これが失敗するようになってしまいました.
これらの問題の原因を調べている中で,上記の API 仕様変更を知りました.
これらの問題が,API 仕様変更のどの部分に起因しているかというと,
- すべての写真を取得できなくなったこと
最初に書いた通り,一覧取得の API は,そのアプリからアップロードした写真しか取得できなくなりました.
このため,pinatra がアップロードしたファイルは存在しないので,何も取得できなくなっているということでした. - scope が変更されたこと
OAuth の scope 名が変更されたため,以前の scope 名で認可したクライアントでは API のリクエストが弾かれるようになっています.
このため,写真のアップロードに失敗しているということでした.
対処
では,この問題に対処しなければならないわけですが,研究室内で議論した結果,以下のような結論になりました.
- scope を変更して,再度認可を行う.
これは読んだ通りですね.
といっても,認可用のスクリプトが OAuth の仕様変更で使えなくなっていたりと,想定より大変な作業になってしまいました. - 写真をすべて同じアプリ (client_id) からアップロードするようにする.
同じアプリからアップロードした写真しか取得できない,という話ですが,実は少しだけ抜け道があります.
というのは,アプリを見分けるのに使っているのが,アプリ (OAuth のクライアント) の ID (client_id) であるということです.
つまり,別々のアプリでも同じ client_id を共有していれば,あるアプリで写真をアップロードし,別のアプリで取得するといったことができるのです.
そこで,写真を取得するアプリ (pinatra) とアップロードするアプリ (swimmy) で同じ client_id を使うことで,写真の一覧が取得できるようになるというわけです.
すこし抜け穴をついたような解決法ですが,背に腹は代えられないということで,しばらくはこの運用でやっていこうと思います.
それにしても,アプリを開発することより,メンテすることの方が大変というのがよく分かる体験になりました.
No comment