首页 > 解决方案 > googleapi python如何获取/刷新访问令牌

问题描述

我正在尝试将 Google Analytics 设置到我的博客网站之一。我正在使用 google api 客户端库。如果我从站点手动获取访问令牌,则代码可以正常工作:https://developers.google.com/oauthplayground/。我发现刷新 access_token 很困难。有人可以指导我吗,因为我对 Google Analytics 很陌生。请分享python代码片段。

import httplib2
import httplib2 as lib2
import google.oauth2.credentials
# from google.auth.transport import requests
import requests
from google_auth_httplib2 import AuthorizedHttp
from oauth2client import client, GOOGLE_TOKEN_URI

from googleapiclient.discovery import build as google_build

# This is consistent for all Google services
token_uri = 'https://accounts.google.com/o/oauth2/token'

# WORKING CODE BUT REQUIRES VALID ACCESS_TOKEN
credentials = google.oauth2.credentials.Credentials(None,
                                                    refresh_token=refresh_token,
                                                  token_uri='https://accounts.google.com/o/oauth2/token',
                                                    client_id=client_id,
                                                    client_secret=client_secret)

credentials = google.oauth2.credentials.Credentials(access_token)
authorized = AuthorizedHttp(credentials=credentials)
print(access_token)

# API Name and Verison, these don't change until
# they release a new API version for us to play with.
api_name = 'analyticsreporting'
api_version = 'v4'

# Let's build the client
api_client = google_build(serviceName=api_name, version=api_version, http=authorized)

sample_request = {
    'viewId': 'xxxxxxxx',
    'dateRanges': {
        'startDate': datetime.strftime(datetime.now() - timedelta(days=120), '%Y-%m-%d'),
        'endDate': datetime.strftime(datetime.now(), '%Y-%m-%d')
    },
    'dimensions': [{'name': 'ga:date'}],
    'metrics': [{'expression': 'ga:sessions'}]
}

response = api_client.reports().batchGet(
    body={
        'reportRequests': sample_request
    }).execute()
print(response)

我将 ACCESS_TOKEN 保留为 none 以获取初始访问令牌,当我打印它时,这似乎有效,但我无法使用此凭证 api 刷新此 access_token,因为它也没有 expires_at 或 expiry 属性. URL 范围将是“ https://www.googleapis.com/auth/analytics.readonly

运行上述代码刷新 ACCESS TOKEN 时,出现错误:

Traceback (most recent call last):
  File "E:/PyCharm_Workspace/MLPractices/GA3.py", line 78, in <module>
    'reportRequests': sample_request
  File "E:\PyCharm_Workspace\MLPractices\venv\lib\site-packages\googleapiclient\_helpers.py", line 134, in positional_wrapper
    return wrapped(*args, **kwargs)
  File "E:\PyCharm_Workspace\MLPractices\venv\lib\site-packages\googleapiclient\http.py", line 901, in execute
    headers=self.headers,
  File "E:\PyCharm_Workspace\MLPractices\venv\lib\site-packages\googleapiclient\http.py", line 177, in _retry_request
    resp, content = http.request(uri, method, *args, **kwargs)
  File "E:\PyCharm_Workspace\MLPractices\venv\lib\site-packages\google_auth_httplib2.py", line 213, in request
    self.credentials.refresh(self._request)
  File "E:\PyCharm_Workspace\MLPractices\venv\lib\site-packages\google\oauth2\credentials.py", line 172, in refresh
    "The credentials do not contain the necessary fields need to "
google.auth.exceptions.RefreshError: The credentials do not contain the necessary fields need to refresh the access token. You must specify refresh_token, token_uri, client_id, and client_secret.

提前致谢

尤瓦

标签: pythongoogle-analytics-apigoogle-oauthgoogle-api-python-client

解决方案


谢谢你们。可以通过使用服务帐户凭据而不是 OAUTH - client_secrets 来获取 google 分析访问权限。使用服务帐户似乎很简单,因为现在我不需要刷新任何令牌。

但我在想哪个更好,更安全,请有任何想法。这也是访问 Google Analytics V4 的最新参考,已于 2020 年发布参考:https ://www.jcchouinard.com/google-analytics-api-using-python/


推荐阅读