python - 向 Google Analtycis API 发出请求会返回 Login Required
问题描述
我从 Google Analytics API v3 获取数据
https://www.googleapis.com/analytics/v3/data/ga?ids=ga:181335694&metrics=ga:sessions&start-date=7daysAgo&end-date=today
一旦我运行浏览器就会抛出错误
{
"error":{
"errors":[
{
"domain":"global",
"reason":"required",
"message":"Login Required",
"locationType":"header",
"location":"Authorization"
}
],
"code":401,
"message":"Login Required"
}
}
如何解决此错误?
一旦我运行 python 代码,我就会得到谷歌分析 api,但是我在浏览器中运行时会抛出错误,需要登录才能解决它。
解决方案
当我们谈论 Google API 时,有两种类型的数据。
不属于任何人和每个人的公共数据数据都可以查看用户拥有的私有数据,您必须有权访问它。
“要求登录”,
确切地说,您必须通过身份验证才能访问您尝试访问的数据。您需要获得该数据所有者的许可。您不能只获取该字符串并在浏览器中启动它,您需要一个访问令牌才能做到这一点。您从身份验证流中获得访问令牌。
由于您提到了 python,您应该遵循hello analytics 教程 ,该教程将向您展示如何设置项目和验证您的脚本,以便您可以访问所需的数据。
import argparse
from apiclient.discovery import build
import httplib2
from oauth2client import client
from oauth2client import file
from oauth2client import tools
def get_service(api_name, api_version, scope, client_secrets_path):
"""Get a service that communicates to a Google API.
Args:
api_name: string The name of the api to connect to.
api_version: string The api version to connect to.
scope: A list of strings representing the auth scopes to authorize for the
connection.
client_secrets_path: string A path to a valid client secrets file.
Returns:
A service that is connected to the specified API.
"""
# Parse command-line arguments.
parser = argparse.ArgumentParser(
formatter_class=argparse.RawDescriptionHelpFormatter,
parents=[tools.argparser])
flags = parser.parse_args([])
# Set up a Flow object to be used if we need to authenticate.
flow = client.flow_from_clientsecrets(
client_secrets_path, scope=scope,
message=tools.message_if_missing(client_secrets_path))
# Prepare credentials, and authorize HTTP object with them.
# If the credentials don't exist or are invalid run through the native client
# flow. The Storage object will ensure that if successful the good
# credentials will get written back to a file.
storage = file.Storage(api_name + '.dat')
credentials = storage.get()
if credentials is None or credentials.invalid:
credentials = tools.run_flow(flow, storage, flags)
http = credentials.authorize(http=httplib2.Http())
# Build the service object.
service = build(api_name, api_version, http=http)
return service
def get_first_profile_id(service):
# Use the Analytics service object to get the first profile id.
# Get a list of all Google Analytics accounts for the authorized user.
accounts = service.management().accounts().list().execute()
if accounts.get('items'):
# Get the first Google Analytics account.
account = accounts.get('items')[0].get('id')
# Get a list of all the properties for the first account.
properties = service.management().webproperties().list(
accountId=account).execute()
if properties.get('items'):
# Get the first property id.
property = properties.get('items')[0].get('id')
# Get a list of all views (profiles) for the first property.
profiles = service.management().profiles().list(
accountId=account,
webPropertyId=property).execute()
if profiles.get('items'):
# return the first view (profile) id.
return profiles.get('items')[0].get('id')
return None
def get_results(service, profile_id):
# Use the Analytics Service Object to query the Core Reporting API
# for the number of sessions in the past seven days.
return service.data().ga().get(
ids='ga:' + profile_id,
start_date='7daysAgo',
end_date='today',
metrics='ga:sessions').execute()
def print_results(results):
# Print data nicely for the user.
if results:
print 'View (Profile): %s' % results.get('profileInfo').get('profileName')
print 'Total Sessions: %s' % results.get('rows')[0][0]
else:
print 'No results found'
def main():
# Define the auth scopes to request.
scope = ['https://www.googleapis.com/auth/analytics.readonly']
# Authenticate and construct service.
service = get_service('analytics', 'v3', scope, 'client_secrets.json')
profile = get_first_profile_id(service)
print_results(get_results(service, profile))
if __name__ == '__main__':
main()
推荐阅读
- javascript - 对象返回错误的日期格式?
- java - 每当使用插入时主键生成器
- excel - 当列出的代码经过测试时,我得到一个对象不支持方法错误
- google-apps-script - 编辑其他电子表格时复制现有电子表格的脚本
- google-maps-sdk-ios - 如何在 Google iOS SDK 中自定义 myLocationButton 控件?
- javascript - h1“hello world”文本隐藏在导航栏后面我该如何解决这个问题
- r - 使用 extRemes 的一般帕累托的经验绘图位置
- python - Python周期性边界条件
- javascript - 将 JavaScript 数组中的随机元素插入 html 字符串
- javascript - Vue webpack动态导入需要不起作用