TypeError: file () - argument 1-kodierte Strings ohne NULL-bytes, nicht str
Ich versuche zu Folgen dieses tutorial, um so Verbindung zu den Google-Analytics-API. Ich folgte alles Schritt für Schritt. Aber wenn ich das Modul in python, bekomme ich die folgende Fehlermeldung:
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
Ob jemand kann mich in die richtige Richtung, das wäre toll. Der vollständige code ist hier:
"""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()
- Dies scheint zu sein, viel mehr code als nötig wäre, um die Reproduktion Ihrer Fehler. Können Sie statt der post ein minimal Beispiel dieser code zur Erzeugung der Fehler, den Sie haben (hilfreich!) zur Verfügung gestellt?
- Ehrlich, ich bin ganz neu hier. Ich möchte gar nicht wissen, was zu nehmen, ohne zu brechen etwas anderes. Ich entschuldige mich.
- Hast du mit einem richtigen Dateipfad (mit einer benannten Laufwerksbuchstaben, da du scheinbar auf windows) für die key_file_location ? Die Fehlermeldung scheint zu beklagen, das argument für die Datei-operation, nicht alles, was innerhalb der Datei.
- Danke für die Antwort. Im code verwende ich: key_file_location = './client_secrets.p12', und ich führe den code in den gleichen Ordner. Aber ich habe den gleichen, genaue Fehlermeldung, wenn ich den vollständigen Pfad mit dem Laufwerksbuchstaben. Ich weiß, dass ich den Weg zu korrigieren und die p12-Datei gelesen wird, weil wenn ich schalten Sie die Weg, bekomme ich ein " No such file or directory:' Fehler. Vielen Dank für die Hilfe.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ist der Fehler zurückverfolgt werden, um die
ServiceAccountCredentials.from_p12_keyfile()
Funktion. Es scheint zu sein, erkennen Sie einen null-Wert in der service_account_email string. Sie könnten es ein raw-string, indem Sie ein 'r' vor dem ersten Zitat:service_account_email = r'<Replace with your service account email address.>'
oder mit einem backslash '\' als escape-der null-Wert.
Ich lief in dieses problem, gestern. Das problem ist mit die HelloAnalytics.py Beispiel-code. Ersetzen Sie die folgenden drei Zeilen:
mit diesem statt:
Leider, das Google-Beispiel-code versucht zu Lesen, den Inhalt der p12-Datei, wenn es sollte einfach nur zeigen, um den Speicherort der Datei. Der rest der Probe code lief Prima für mich, die zimmerreserviereung, ohne das Präfix meine E-Mail-oder file-Position mit r.
Hatte ich das gleiche problem. Ich fand es war die folgende Zeile in der helloanalytics.py Datei. Sie müssen sich ändern Sie Zeile 33:
Den ServiceAccountCredentials.from_p12_keyfile () - Funktion erfordert die key_file_location nicht der Schlüssel.
Schlüssel ersetzen mit key_file_location: