googleapi python如何获取/刷新访问令牌

时间:2020-05-26 08:45:59

标签: python google-analytics-api google-oauth google-api-python-client

我正在尝试将Google Analytics(分析)设置为我的一个博客网站。我正在使用google api客户端库。如果我从以下站点手动获取访问令牌,则代码工作正常:https://developers.google.com/oauthplayground/。我发现很难刷新access_token。有人可以为我提供指导吗?请分享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保持为空以获取初始访问令牌,在我打印它时似乎可行,但是我无法使用此凭据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.

预先感谢

Yuva

2 个答案:

答案 0 :(得分:0)

您将首次获得带有访问令牌的刷新令牌。您的刷新令牌寿命很长。因此,您可以将其存储到数据库中的某个位置,以便以后使用。每当您需要访问令牌时,请使用该刷新令牌并生成新的令牌。

Google API: getting Credentials from refresh token with oauth2client.client

上面的链接将为您提供帮助。

答案 1 :(得分:0)

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

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