gspread の認証済み API セッションと認証情報更新リクエストのトランスポートの両方を、どちらかがプロキシを必要とする場合に設定します:

import requests
import gspread
from google.auth.transport.requests import AuthorizedSession, Request

routes = {
    'http': 'http://proxy.example:8080',
    'https': 'http://proxy.example:8080',
}
token_session = requests.Session()
token_session.proxies.update(routes)

session = AuthorizedSession(
    credentials,
    auth_request=Request(session=token_session),
)
session.proxies.update(routes)
client = gspread.Client(auth=credentials, session=session)

これは gspread 6 の Client インターフェースを、渡したセッションとアプリケーション既存の認証情報で使います。設定するのはトランスポートであり、スプレッドシートの権限や OAuth スコープではありません。許可された公開経路上の公開 API とトークンのエンドポイントには、ルート表のためにHTTP プロキシ一覧から未認証の HTTP 候補を選びます。中継を切り替えるときは、両方のセッションに保存済みのプロキシ アカウントを残さないでください。

AuthorizedSession は API リクエストに認証情報を追加し、更新もできます。auth_request がない場合、google-auth はその通信のために別の Requests セッションを作成することがあります。認証済みセッションのプロキシ既定値は、独立して作成されたセッションを設定しません。

上記の Request アダプターは、その 2 本目の経路を意図的に用意します。使用中は両方のセッションを保持し、アプリケーションのスコープの終わりに外部所有のセッションを閉じます。

これらは Session の既定値なので、Requests の環境マージが引き続き影響します。固定の経路が必要なときは継承されたプロキシ入力を考慮してください。

失敗した URL を使って、スプレッドシートの拒否、プロキシの要求、認証情報エンドポイントの障害を区別します。キャッシュされたアクセス トークンがあると、更新をまったく実行せずに API 呼び出しが成功することがあります。

関連記事