我正在尝试关注this tutorial to so connect to Google Analytics API。我一步一步地跟着一切。但是当我在python中运行模块时,我收到以下错误:
Traceback (most recent call last):
File "C:\Users\me\Desktop\New folder (3)\HelloAnalytics.py", line 112, in <module>
main()
File "C:\Users\me\Desktop\New folder (3)\HelloAnalytics.py", line 106, in main
service_account_email)
File "C:\Users\me\Desktop\New folder (3)\HelloAnalytics.py", line 35, in get_service
service_account_email, key, scopes=scope)
File "C:\Python27\lib\site-packages\oauth2client\service_account.py", line 274, in from_p12_keyfile
with open(filename, 'rb') as file_obj:
TypeError: file() argument 1 must be encoded string without NULL bytes, not str
如果有人能指出我正确的方向,那就太好了。完整的代码就在这里:
"""A simple example of how to access the Google Analytics API."""
import argparse
from apiclient.discovery import build
from oauth2client.service_account import ServiceAccountCredentials
import httplib2
from oauth2client import client
from oauth2client import file
from oauth2client import tools
def get_service(api_name, api_version, scope, key_file_location,
service_account_email):
"""Get a service that communicates to a Google API.
Args:
api_name: The name of the api to connect to.
api_version: The api version to connect to.
scope: A list auth scopes to authorize for the application.
key_file_location: The path to a valid service account p12 key file.
service_account_email: The service account email address.
Returns:
A service that is connected to the specified API.
"""
f = open(key_file_location, 'rb')
key = f.read()
f.close()
credentials = ServiceAccountCredentials.from_p12_keyfile(
service_account_email, key, scopes=scope)
http = credentials.authorize(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 this 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 within 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']
# Use the developer console and replace the values with your
# service account email and relative location of your key file.
service_account_email = '<Replace with your service account email address.>'
key_file_location = '<Replace with /path/to/generated/client_secrets.p12>'
# Authenticate and construct service.
service = get_service('analytics', 'v3', scope, key_file_location,
service_account_email)
profile = get_first_profile_id(service)
print_results(get_results(service, profile))
if __name__ == '__main__':
main()
答案 0 :(得分:1)
错误正在追溯到ServiceAccountCredentials.from_p12_keyfile()
函数。它似乎检测到service_account_email字符串中的空值。你可以通过在第一个引号前放一个'r'来使它成为一个原始字符串:
service_account_email = r'<Replace with your service account email address.>'
或使用反斜杠'\'来转义空值。
答案 1 :(得分:1)
昨天我遇到了这个问题。问题出在HelloAnalytics.py示例代码中。替换以下三行:
f = open(key_file_location, 'rb')
key = f.read()
f.close()
代之以:
key = key_file_location
不幸的是,当示例代码指向文件位置时,Google示例代码会尝试读取p12文件的内容。其余的示例代码对我来说运行正常,而不必使用r。
为我的电子邮件或文件位置添加前缀答案 2 :(得分:1)
我有同样的问题。我发现它是helloanalytics.py文件中的以下行。您需要修改第33行:
凭据= ServiceAccountCredentials.from_p12_keyfile(service_account_email,密钥,范围=范围)
ServiceAccountCredentials.from_p12_keyfile()函数需要key_file_location而不是密钥。
用key_file_location替换密钥:
credentials = ServiceAccountCredentials.from_p12_keyfile(service_account_email, key_file_location ,范围=范围)