Dockerコンテナからwebbrowser.errorを回避してflow.run_local_serverを実行する方法(Google OAuth)
エラー
上記で実行できていたflow.run_local_serverがうごかない。2023/09/27に動かなくなったことを確認。
具体的には「webbrowser.error could not locate runnable browser」とエラーが出て、ブラウザを実行できないようす。
YouTube Data APIを使うのにブラウザからのOAuth認証が必須なので、これは解消しときたい。
解決に向けた分析
エラー文言からするとどうもブラウザが実行できないというか、見つからないらしい。
実行すべきブラウザのパスがわからないらしいので明示的に指定してやればいいという情報がネット上で見つかるものの問題が。
いま、Docker上でプログラム(Pythonスクリプト)を実行しているのだ。
Dockerコンテナにはブラウザをインストールしていないから、指定すべきブラウザは存在しない。
じゃあこれまで実行できていたのがなぜなのか疑問が残る。これまではホスト側のChromeが既定ブラウザとして起動できていたのに急にできなくなったのはなぜなのか?
- Dockerの更新・仕様変更
- Pythonライブラリ(google-auth-library-python-oauthlib)の更新
- Chromeの更新
まえに実行できていたタイミング以降、それぞれ更新したかどうかもわからないが原因追及の道のりはありそう。だけど…更新履歴を探るような面倒なことは避けたい。
解決方法
幸い、OAuth認証の機会はそう頻繁じゃない。だから、
- 自動的にブラウザを起動させるのをやめる
- アクセスすべきURL文字列をDockerとHostでやり取りする
- Host側のChromeを手動で立ち上げ、OAuth認証をする
という方針でエラーを回避しよう。
方法は簡単だ。
flow.run_local_serverのキーワード引数にopen_browser=Falseを渡す
以上。
これで下記ソースコード上のエラー送出箇所を回避できる。
現況
これまで自動的に立ち上がっていたブラウザが立ち上がらなくなった。
上記対策によりVSCodeのプロンプト上に認証用のURLが表示されるようになった。
これをダブルクリックすると既定ブラウザであるChromeが立ち上がり、認証フローを進められた。
前回記事で示した通り、ホスト側からDockerへリダイレクトを通すこともできている。