diff --git a/samples/analytics/client_secrets.json b/samples/analytics/client_secrets.json new file mode 100644 index 0000000..323ffd0 --- /dev/null +++ b/samples/analytics/client_secrets.json @@ -0,0 +1,9 @@ +{ + "installed": { + "client_id": "[[INSERT CLIENT ID HERE]]", + "client_secret": "[[INSERT CLIENT SECRET HERE]]", + "redirect_uris": [], + "auth_uri": "https://accounts.google.com/o/oauth2/auth", + "token_uri": "https://accounts.google.com/o/oauth2/token" + } +} diff --git a/samples/analytics/core_reporting_v3_reference.py b/samples/analytics/core_reporting_v3_reference.py new file mode 100755 index 0000000..6132263 --- /dev/null +++ b/samples/analytics/core_reporting_v3_reference.py @@ -0,0 +1,255 @@ +#!/usr/bin/python +# -*- coding: utf-8 -*- +# +# Copyright 2012 Google Inc. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +"""Reference command-line example for Google Analytics Core Reporting API v3. + +This application demonstrates how to use the python client library to access +all the pieces of data returned by the Google Analytics Core Reporting API v3. + +The application manages autorization by saving an OAuth2.0 token in a local +file and reusing the token for subsequent requests. + +Before You Begin: + +Update the client_secrets.json file + + You must update the clients_secrets.json file with a client id, client + secret, and the redirect uri. You get these values by creating a new project + in the Google APIs console and registering for OAuth2.0 for installed + applications: https://code.google.com/apis/console + + Learn more about registering your analytics application here: + http://code.google.com/apis/analytics/docs/gdata/v3/gdataAuthorization.html + +Supply your TABLE_ID + + You will also need to identify from which profile to access data by + specifying the TABLE_ID constant below. This value is of the form: ga:xxxx + where xxxx is the profile ID. You can get the profile ID by either querying + the Management API or by looking it up in the account settings of the + Google Anlaytics web interface. + +Sample Usage: + + $ python core_reporting_v3_reference.py + +Also you can also get help on all the command-line flags the program +understands by running: + + $ python core_reporting_v3_reference.py --help +""" + +__author__ = 'api.nickm@gmail.com (Nick Mihailovski)' + +import sys +import sample_utils + +from apiclient.errors import HttpError +from oauth2client.client import AccessTokenRefreshError + + +# The table ID is used to identify from which Google Anlaytics profile +# to retrieve data. This ID is in the format ga:xxxx where xxxx is the +# profile ID. +TABLE_ID = 'INSERT_YOUR_TABLE_ID_HERE' + + +def main(argv): + sample_utils.process_flags(argv) + + # Authenticate and construct service. + service = sample_utils.initialize_service() + + # Try to make a request to the API. Print the results or handle errors. + try: + results = get_api_query(service).execute() + print_results(results) + + except TypeError, error: + # Handle errors in constructing a query. + print ('There was an error in constructing your query : %s' % error) + + except HttpError, error: + # Handle API errors. + print ('Arg, there was an API error : %s : %s' % + (error.resp.status, error._get_reason())) + + except AccessTokenRefreshError: + # Handle Auth errors. + print ('The credentials have been revoked or expired, please re-run ' + 'the application to re-authorize') + + +def get_api_query(service): + """Returns a query object to retrieve data from the Core Reporting API. + + Args: + service: The service object built by the Google API Python client library. + """ + + return service.data().ga().get( + ids=TABLE_ID, + start_date='2012-01-01', + end_date='2012-01-15', + metrics='ga:visits', + dimensions='ga:source,ga:keyword', + sort='-ga:visits', + filters='ga:medium==organic', + start_index='1', + max_results='25') + + +def print_results(results): + """Prints all the results in the Core Reporting API Response. + + Args: + results: The response returned from the Core Reporting API. + """ + + print_report_info(results) + print_pagination_info(results) + print_profile_info(results) + print_query(results) + print_column_headers(results) + print_totals_for_all_results(results) + print_rows(results) + + +def print_report_info(results): + """Prints general information about this report. + + Args: + results: The response returned from the Core Reporting API. + """ + + print 'Report Infos:' + print 'Contains Sampled Data = %s' % results.get('containsSampledData') + print 'Kind = %s' % results.get('kind') + print 'ID = %s' % results.get('id') + print 'Self Link = %s' % results.get('selfLink') + print + + +def print_pagination_info(results): + """Prints common pagination details. + + Args: + results: The response returned from the Core Reporting API. + """ + + print 'Pagination Infos:' + print 'Items per page = %s' % results.get('itemsPerPage') + print 'Total Results = %s' % results.get('totalResults') + + # These only have values if other result pages exist. + if results.get('previousLink'): + print 'Previous Link = %s' % results.get('previousLink') + if results.get('nextLink'): + print 'Next Link = %s' % results.get('nextLink') + print + + +def print_profile_info(results): + """Prints information about the profile. + + Args: + results: The response returned from the Core Reporting API. + """ + + print 'Profile Infos:' + info = results.get('profileInfo') + print 'Account Id = %s' % info.get('accountId') + print 'Web Property Id = %s' % info.get('webPropertyId') + print 'Profile Id = %s' % info.get('profileId') + print 'Table Id = %s' % info.get('tableId') + print 'Profile Name = %s' % info.get('profileName') + print + + +def print_query(results): + """The query returns the original report query as a dict. + + Args: + results: The response returned from the Core Reporting API. + """ + + print 'Query Parameters:' + query = results.get('query') + for key, value in query.iteritems(): + print '%s = %s' % (key, value) + print + + +def print_column_headers(results): + """Prints the information for each column. + + The main data from the API is returned as rows of data. The column + headers describe the names and types of each column in rows. + + + Args: + results: The response returned from the Core Reporting API. + """ + + print 'Column Headers:' + headers = results.get('columnHeaders') + for header in headers: + # Print Dimension or Metric name. + print '\t%s name: = %s' % (header.get('columnType').title(), + header.get('name')) + print '\tColumn Type = %s' % header.get('columnType') + print '\tData Type = %s' % header.get('dataType') + print + + +def print_totals_for_all_results(results): + """Prints the total metric value for all pages the query matched. + + Args: + results: The response returned from the Core Reporting API. + """ + + print 'Total Metrics For All Results:' + print 'This query returned %s rows.' % len(results.get('rows')) + print ('But the query matched %s total results.' % + results.get('totalResults')) + print 'Here are the metric totals for the matched total results.' + totals = results.get('totalsForAllResults') + + for metric_name, metric_total in totals.iteritems(): + print 'Metric Name = %s' % metric_name + print 'Metric Total = %s' % metric_total + print + + +def print_rows(results): + """Prints all the rows of data returned by the API. + + Args: + results: The response returned from the Core Reporting API. + """ + + print 'Rows:' + if results.get('rows', []): + for row in results.get('rows'): + print '\t'.join(row) + else: + print 'No Rows Found' + + +if __name__ == '__main__': + main(sys.argv) diff --git a/samples/analytics/hello_analytics_api_v3.py b/samples/analytics/hello_analytics_api_v3.py new file mode 100755 index 0000000..271c213 --- /dev/null +++ b/samples/analytics/hello_analytics_api_v3.py @@ -0,0 +1,176 @@ +#!/usr/bin/python +# -*- coding: utf-8 -*- +# +# Copyright 2012 Google Inc. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +"""Simple intro to using the Google Analytics API v3. + +This application demonstrates how to use the python client library to access +Google Analytics data. The sample traverses the Management API to obtain the +authorized user's first profile ID. Then the sample uses this ID to +contstruct a Core Reporting API query to return the top 25 organic search +terms. + +Before you begin, you must sigup for a new project in the Google APIs console: +https://code.google.com/apis/console + +Then register the project to use OAuth2.0 for installed applications. + +Finally you will need to add the client id, client secret, and redirect URL +into the client_secrets.json file that is in the same directory as this sample. + +Sample Usage: + + $ python hello_analytics_api_v3.py + +Also you can also get help on all the command-line flags the program +understands by running: + + $ python hello_analytics_api_v3.py --help +""" + +__author__ = 'api.nickm@gmail.com (Nick Mihailovski)' + +import sys +import sample_utils + +from apiclient.errors import HttpError +from oauth2client.client import AccessTokenRefreshError + + +def main(argv): + sample_utils.process_flags(argv) + + # Authenticate and construct service. + service = sample_utils.initialize_service() + + # Try to make a request to the API. Print the results or handle errors. + try: + first_profile_id = get_first_profile_id(service) + if not first_profile_id: + print 'Could not find a valid profile for this user.' + else: + results = get_top_keywords(service, first_profile_id) + print_results(results) + + except TypeError, error: + # Handle errors in constructing a query. + print ('There was an error in constructing your query : %s' % error) + + except HttpError, error: + # Handle API errors. + print ('Arg, there was an API error : %s : %s' % + (error.resp.status, error._get_reason())) + + except AccessTokenRefreshError: + # Handle Auth errors. + print ('The credentials have been revoked or expired, please re-run ' + 'the application to re-authorize') + + +def get_first_profile_id(service): + """Traverses Management API to return the first profile id. + + This first queries the Accounts collection to get the first account ID. + This ID is used to query the Webproperties collection to retrieve the first + webproperty ID. And both account and webproperty IDs are used to query the + Profile collection to get the first profile id. + + Args: + service: The service object built by the Google API Python client library. + + Returns: + A string with the first profile ID. None if a user does not have any + accounts, webproperties, or profiles. + """ + + accounts = service.management().accounts().list().execute() + + if accounts.get('items'): + firstAccountId = accounts.get('items')[0].get('id') + webproperties = service.management().webproperties().list( + accountId=firstAccountId).execute() + + if webproperties.get('items'): + firstWebpropertyId = webproperties.get('items')[0].get('id') + profiles = service.management().profiles().list( + accountId=firstAccountId, + webPropertyId=firstWebpropertyId).execute() + + if profiles.get('items'): + return profiles.get('items')[0].get('id') + + return None + + +def get_top_keywords(service, profile_id): + """Executes and returns data from the Core Reporting API. + + This queries the API for the top 25 organic search terms by visits. + + Args: + service: The service object built by the Google API Python client library. + profile_id: String The profile ID from which to retrieve analytics data. + + Returns: + The response returned from the Core Reporting API. + """ + + return service.data().ga().get( + ids='ga:' + profile_id, + start_date='2012-01-01', + end_date='2012-01-15', + metrics='ga:visits', + dimensions='ga:source,ga:keyword', + sort='-ga:visits', + filters='ga:medium==organic', + start_index='1', + max_results='25').execute() + + +def print_results(results): + """Prints out the results. + + This prints out the profile name, the column headers, and all the rows of + data. + + Args: + results: The response returned from the Core Reporting API. + """ + + print + print 'Profile Name: %s' % results.get('profileInfo').get('profileName') + print + + # Print header. + output = [] + for header in results.get('columnHeaders'): + output.append('%30s' % header.get('name')) + print ''.join(output) + + # Print data table. + if results.get('rows', []): + for row in results.get('rows'): + output = [] + for cell in row: + output.append('%30s' % cell) + print ''.join(output) + + else: + print 'No Rows Found' + + +if __name__ == '__main__': + main(sys.argv) diff --git a/samples/analytics/management_v3_reference.py b/samples/analytics/management_v3_reference.py old mode 100644 new mode 100755 index 0ecfc08..2d73445 --- a/samples/analytics/management_v3_reference.py +++ b/samples/analytics/management_v3_reference.py @@ -1,7 +1,7 @@ #!/usr/bin/python # -*- coding: utf-8 -*- # -# Copyright 2011 Google Inc. All Rights Reserved. +# Copyright 2012 Google Inc. All Rights Reserved. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. @@ -32,79 +32,55 @@ To read an indepth discussion on how this file works, check out the Management API Python Getting Started guide here: http://code.google.com/apis/analytics/docs/mgmt/v3/mgmtPython.html -Usage: +Before You Begin: -Before you begin, you should register your application as an installed -application to get your own Project / OAUth2 Client ID / Secret: -https://code.google.com/apis/console +Update the client_secrets.json file -Learn more about registering your Analytics Application here: -http://code.google.com/apis/analytics/docs/mgmt/v3/mgmtPython.html#authorize + You must update the clients_secrets.json file with a client id, client + secret, and the redirect uri. You get these values by creating a new project + in the Google APIs console and registering for OAuth2.0 for installed + applications: https://code.google.com/apis/console - $ python analytics.py + Learn more about registering your analytics application here: + http://code.google.com/apis/analytics/docs/gdata/v3/gdataAuthorization.html + +Sample Usage: + + $ python management_v3_reference.py Also you can also get help on all the command-line flags the program understands by running: - $ python analytics.py --help + $ python management_v3_reference.py --help """ -__author__ = 'api.nickm@ (Nick Mihailovski)' +__author__ = 'api.nickm@gmail.com (Nick Mihailovski)' import sys +import sample_utils -from apiclient.discovery import build from apiclient.errors import HttpError - -import gflags -import httplib2 - from oauth2client.client import AccessTokenRefreshError -from oauth2client.client import OAuth2WebServerFlow -from oauth2client.file import Storage -from oauth2client.tools import run - -FLAGS = gflags.FLAGS - - -# Remember to get your own client_id / client_secret in the -# Google API developer console: https://code.google.com/apis/console -FLOW = OAuth2WebServerFlow( - client_id='INSERT_YOUR_CLIENT_ID_HERE', - client_secret='INSERT_YOUR_CLIENT_SECRET_HERE', - scope='https://www.googleapis.com/auth/analytics.readonly', - user_agent='analytics-api-v3-awesomeness') - -TOKEN_FILE_NAME = 'analytics.dat' def main(argv): - # Let the gflags module process the command-line arguments - try: - argv = FLAGS(argv) - except gflags.FlagsError, e: - print '%s\\nUsage: %s ARGS\\n%s' % (e, argv[0], FLAGS) - sys.exit(1) + sample_utils.process_flags(argv) - # Manage re-using tokens. - storage = Storage(TOKEN_FILE_NAME) - credentials = storage.get() - if not credentials or credentials.invalid: - # Get a new token. - credentials = run(FLOW, storage) + # Authenticate and construct service. + service = sample_utils.initialize_service() - # Build an authorized service object. - http = httplib2.Http() - http = credentials.authorize(http) - service = build('analytics', 'v3', http=http) - - # Traverse the Management hiearchy and print results. + # Traverse the Management hiearchy and print results or handle errors. try: traverse_hiearchy(service) + except TypeError, error: + # Handle errors in constructing a query. + print ('There was an error in constructing your query : %s' % error) + except HttpError, error: - print ('Arg, there was an API error : %s %s : %s' % - (error.resp.status, error.resp.reason, error._get_reason())) + # Handle API errors. + print ('Arg, there was an API error : %s : %s' % + (error.resp.status, error._get_reason())) except AccessTokenRefreshError: print ('The credentials have been revoked or expired, please re-run' @@ -126,18 +102,16 @@ def traverse_hiearchy(service): HttpError: If an error occured when accessing the API. AccessTokenRefreshError: If the current token was invalid. """ - view = View() accounts = service.management().accounts().list().execute() - - view.print_accounts(accounts) + print_accounts(accounts) if accounts.get('items'): firstAccountId = accounts.get('items')[0].get('id') webproperties = service.management().webproperties().list( accountId=firstAccountId).execute() - view.print_webproperties(webproperties) + print_webproperties(webproperties) if webproperties.get('items'): firstWebpropertyId = webproperties.get('items')[0].get('id') @@ -145,7 +119,7 @@ def traverse_hiearchy(service): accountId=firstAccountId, webPropertyId=firstWebpropertyId).execute() - view.print_profiles(profiles) + print_profiles(profiles) if profiles.get('items'): firstProfileId = profiles.get('items')[0].get('id') @@ -154,226 +128,285 @@ def traverse_hiearchy(service): webPropertyId=firstWebpropertyId, profileId=firstProfileId).execute() - view.print_goals(goals) + print_goals(goals) - view.print_segments(service.management().segments().list().execute()) + print_segments(service.management().segments().list().execute()) -class View(object): - """Utility class to print various Management API collections.""" +def print_accounts(accounts_response): + """Prints all the account info in the Accounts Collection. - def print_accounts(self, accounts_list): - """Prints all the account info in the Accounts Collection.""" + Args: + accounts_response: The response object returned from querying the Accounts + collection. + """ - print '------ Account Collection -------' - self.print_pagination_info(accounts_list) + print '------ Account Collection -------' + print_pagination_info(accounts_response) + print + + for account in accounts_response.get('items', []): + print 'Account ID = %s' % account.get('id') + print 'Kind = %s' % account.get('kind') + print 'Self Link = %s' % account.get('selfLink') + print 'Account Name = %s' % account.get('name') + print 'Created = %s' % account.get('created') + print 'Updated = %s' % account.get('updated') + + child_link = account.get('childLink') + print 'Child link href = %s' % child_link.get('href') + print 'Child link type = %s' % child_link.get('type') + print + else: + print 'No accounts found.\n' + + +def print_webproperties(webproperties_response): + """Prints all the web property info in the WebProperties collection. + + Args: + webproperties_response: The response object returned from querying the + Webproperties collection. + """ + + print '------ Web Properties Collection -------' + print_pagination_info(webproperties_response) + print + + for webproperty in webproperties_response.get('items', []): + print 'Kind = %s' % webproperty.get('kind') + print 'Account ID = %s' % webproperty.get('accountId') + print 'Web Property ID = %s' % webproperty.get('id') + print ('Internal Web Property ID = %s' % + webproperty.get('internalWebPropertyId')) + + print 'Website URL = %s' % webproperty.get('websiteUrl') + print 'Created = %s' % webproperty.get('created') + print 'Updated = %s' % webproperty.get('updated') + + print 'Self Link = %s' % webproperty.get('selfLink') + parent_link = webproperty.get('parentLink') + print 'Parent link href = %s' % parent_link.get('href') + print 'Parent link type = %s' % parent_link.get('type') + child_link = webproperty.get('childLink') + print 'Child link href = %s' % child_link.get('href') + print 'Child link type = %s' % child_link.get('type') + print + else: + print 'No webproperties found.\n' + + +def print_profiles(profiles_response): + """Prints all the profile info in the Profiles Collection. + + Args: + profiles_response: The response object returned from querying the + Profiles collection. + """ + + print '------ Profiles Collection -------' + print_pagination_info(profiles_response) + print + + for profile in profiles_response.get('items', []): + print 'Kind = %s' % profile.get('kind') + print 'Account ID = %s' % profile.get('accountId') + print 'Web Property ID = %s' % profile.get('webPropertyId') + print ('Internal Web Property ID = %s' % + profile.get('internalWebPropertyId')) + print 'Profile ID = %s' % profile.get('id') + print 'Profile Name = %s' % profile.get('name') + + print 'Currency = %s' % profile.get('currency') + print 'Timezone = %s' % profile.get('timezone') + print 'Default Page = %s' % profile.get('defaultPage') + + print ('Exclude Query Parameters = %s' % + profile.get('excludeQueryParameters')) + print ('Site Search Category Parameters = %s' % + profile.get('siteSearchCategoryParameters')) + print ('Site Search Query Parameters = %s' % + profile.get('siteSearchQueryParameters')) + + print 'Created = %s' % profile.get('created') + print 'Updated = %s' % profile.get('updated') + + print 'Self Link = %s' % profile.get('selfLink') + parent_link = profile.get('parentLink') + print 'Parent link href = %s' % parent_link.get('href') + print 'Parent link type = %s' % parent_link.get('type') + child_link = profile.get('childLink') + print 'Child link href = %s' % child_link.get('href') + print 'Child link type = %s' % child_link.get('type') + print + else: + print 'No profiles found.\n' + + +def print_goals(goals_response): + """Prints all the goal info in the Goals collection. + + Args: + goals_response: The response object returned from querying the Goals + collection + """ + + print '------ Goals Collection -------' + print_pagination_info(goals_response) + print + + for goal in goals_response.get('items', []): + print 'Goal ID = %s' % goal.get('id') + print 'Kind = %s' % goal.get('kind') + print 'Self Link = %s' % goal.get('selfLink') + + print 'Account ID = %s' % goal.get('accountId') + print 'Web Property ID = %s' % goal.get('webPropertyId') + print ('Internal Web Property ID = %s' % + goal.get('internalWebPropertyId')) + print 'Profile ID = %s' % goal.get('profileId') + + print 'Goal Name = %s' % goal.get('name') + print 'Goal Value = %s' % goal.get('value') + print 'Goal Active = %s' % goal.get('active') + print 'Goal Type = %s' % goal.get('type') + + print 'Created = %s' % goal.get('created') + print 'Updated = %s' % goal.get('updated') + + parent_link = goal.get('parentLink') + print 'Parent link href = %s' % parent_link.get('href') + print 'Parent link type = %s' % parent_link.get('type') + + # Print the goal details depending on the type of goal. + if goal.get('urlDestinationDetails'): + print_url_destination_goal_details( + goal.get('urlDestinationDetails')) + + elif goal.get('visitTimeOnSiteDetails'): + print_visit_time_on_site_goal_details( + goal.get('visitTimeOnSiteDetails')) + + elif goal.get('visitNumPagesDetails'): + print_visit_num_pages_goal_details( + goal.get('visitNumPagesDetails')) + + elif goal.get('eventDetails'): + print_event_goal_details(goal.get('eventDetails')) + + print + else: + print 'No goals found.\n' + + +def print_url_destination_goal_details(goal_details): + """Prints all the URL Destination goal type info. + + Args: + goal_details: The details portion of the goal response. + """ + + print '------ Url Destination Goal -------' + print 'Goal URL = %s' % goal_details.get('url') + print 'Case Sensitive = %s' % goal_details.get('caseSensitive') + print 'Match Type = %s' % goal_details.get('matchType') + print 'First Step Required = %s' % goal_details.get('firstStepRequired') + + print '------ Url Destination Goal Steps -------' + for goal_step in goal_details.get('steps', []): + print 'Step Number = %s' % goal_step.get('number') + print 'Step Name = %s' % goal_step.get('name') + print 'Step URL = %s' % goal_step.get('url') + else: + print 'No Steps Configured' + + +def print_visit_time_on_site_goal_details(goal_details): + """Prints all the Visit Time On Site goal type info. + + Args: + goal_details: The details portion of the goal response. + """ + + print '------ Visit Time On Site Goal -------' + print 'Comparison Type = %s' % goal_details.get('comparisonType') + print 'comparison Value = %s' % goal_details.get('comparisonValue') + + +def print_visit_num_pages_goal_details(goal_details): + """Prints all the Visit Num Pages goal type info. + + Args: + goal_details: The details portion of the goal response. + """ + + print '------ Visit Num Pages Goal -------' + print 'Comparison Type = %s' % goal_details.get('comparisonType') + print 'comparison Value = %s' % goal_details.get('comparisonValue') + + +def print_event_goal_details(goal_details): + """Prints all the Event goal type info. + + Args: + goal_details: The details portion of the goal response. + """ + + print '------ Event Goal -------' + print 'Use Event Value = %s' % goal_details.get('useEventValue') + + for event_condition in goal_details.get('eventConditions', []): + event_type = event_condition.get('type') + print 'Type = %s' % event_type + + if event_type in ('CATEGORY', 'ACTION', 'LABEL'): + print 'Match Type = %s' % event_condition.get('matchType') + print 'Expression = %s' % event_condition.get('expression') + else: # VALUE type. + print 'Comparison Type = %s' % event_condition.get('comparisonType') + print 'Comparison Value = %s' % event_condition.get('comparisonValue') + + +def print_segments(segments_response): + """Prints all the segment info in the Segments collection. + + Args: + segments_response: The response object returned from querying the + Segments collection. + """ + + print '------ Segments Collection -------' + print_pagination_info(segments_response) + print + + for segment in segments_response.get('items', []): + print 'Segment ID = %s' % segment.get('id') + print 'Kind = %s' % segment.get('kind') + print 'Self Link = %s' % segment.get('selfLink') + print 'Name = %s' % segment.get('name') + print 'Definition = %s' % segment.get('definition') + print 'Created = %s' % segment.get('created') + print 'Updated = %s' % segment.get('updated') print - for account in accounts_list.get('items'): - print 'Account ID = %s' % account.get('id') - print 'Kind = %s' % account.get('kind') - print 'Self Link = %s' % account.get('selfLink') - print 'Account Name = %s' % account.get('name') - print 'Created = %s' % account.get('created') - print 'Updated = %s' % account.get('updated') - child_link = account.get('childLink') - print 'Child link href = %s' % child_link.get('href') - print 'Child link type = %s' % child_link.get('type') - print +def print_pagination_info(management_response): + """Prints common pagination details. - def print_webproperties(self, webproperties_list): - """Prints all the web property info in the WebProperties Collection.""" + Args: + management_response: The common reponse object for each collection in the + Management API. + """ - print '------ Web Properties Collection -------' - self.print_pagination_info(webproperties_list) - print + print 'Items per page = %s' % management_response.get('itemsPerPage') + print 'Total Results = %s' % management_response.get('totalResults') + print 'Start Index = %s' % management_response.get('startIndex') - for webproperty in webproperties_list.get('items'): - print 'Kind = %s' % webproperty.get('kind') - print 'Account ID = %s' % webproperty.get('accountId') - print 'Web Property ID = %s' % webproperty.get('id') - print ('Internal Web Property ID = %s' % - webproperty.get('internalWebPropertyId')) - - print 'Website URL = %s' % webproperty.get('websiteUrl') - print 'Created = %s' % webproperty.get('created') - print 'Updated = %s' % webproperty.get('updated') - - print 'Self Link = %s' % webproperty.get('selfLink') - parent_link = webproperty.get('parentLink') - print 'Parent link href = %s' % parent_link.get('href') - print 'Parent link type = %s' % parent_link.get('type') - child_link = webproperty.get('childLink') - print 'Child link href = %s' % child_link.get('href') - print 'Child link type = %s' % child_link.get('type') - print - - def print_profiles(self, profiles_list): - """Prints all the profile info in the Profiles Collection.""" - - print '------ Profiles Collection -------' - self.print_pagination_info(profiles_list) - print - - for profile in profiles_list.get('items'): - print 'Kind = %s' % profile.get('kind') - print 'Account ID = %s' % profile.get('accountId') - print 'Web Property ID = %s' % profile.get('webPropertyId') - print ('Internal Web Property ID = %s' % - profile.get('internalWebPropertyId')) - print 'Profile ID = %s' % profile.get('id') - print 'Profile Name = %s' % profile.get('name') - - print 'Currency = %s' % profile.get('currency') - print 'Timezone = %s' % profile.get('timezone') - print 'Default Page = %s' % profile.get('defaultPage') - - print ('Exclude Query Parameters = %s' % - profile.get('excludeQueryParameters')) - print ('Site Search Category Parameters = %s' % - profile.get('siteSearchCategoryParameters')) - print ('Site Search Query Parameters = %s' % - profile.get('siteSearchQueryParameters')) - - print 'Created = %s' % profile.get('created') - print 'Updated = %s' % profile.get('updated') - - print 'Self Link = %s' % profile.get('selfLink') - parent_link = profile.get('parentLink') - print 'Parent link href = %s' % parent_link.get('href') - print 'Parent link type = %s' % parent_link.get('type') - child_link = profile.get('childLink') - print 'Child link href = %s' % child_link.get('href') - print 'Child link type = %s' % child_link.get('type') - print - - def print_goals(self, goals_list): - """Prints all the goal info in the Goals Collection.""" - - print '------ Goals Collection -------' - self.print_pagination_info(goals_list) - print - - for goal in goals_list.get('items'): - print 'Goal ID = %s' % goal.get('id') - print 'Kind = %s' % goal.get('kind') - print 'Self Link = %s' % goal.get('selfLink') - - print 'Account ID = %s' % goal.get('accountId') - print 'Web Property ID = %s' % goal.get('webPropertyId') - print ('Internal Web Property ID = %s' % - goal.get('internalWebPropertyId')) - print 'Profile ID = %s' % goal.get('profileId') - - print 'Goal Name = %s' % goal.get('name') - print 'Goal Value = %s' % goal.get('value') - print 'Goal Active = %s' % goal.get('active') - print 'Goal Type = %s' % goal.get('type') - - print 'Created = %s' % goal.get('created') - print 'Updated = %s' % goal.get('updated') - - parent_link = goal.get('parentLink') - print 'Parent link href = %s' % parent_link.get('href') - print 'Parent link type = %s' % parent_link.get('type') - - # Print the goal details depending on the type of goal. - if goal.get('urlDestinationDetails'): - self.print_url_destination_goal_details( - goal.get('urlDestinationDetails')) - - elif goal.get('visitTimeOnSiteDetails'): - self.print_visit_time_on_site_goal_details( - goal.get('visitTimeOnSiteDetails')) - - elif goal.get('visitNumPagesDetails'): - self.print_visit_num_pages_goal_details( - goal.get('visitNumPagesDetails')) - - elif goal.get('eventDetails'): - self.print_event_goal_details(goal.get('eventDetails')) - - print - - def print_url_destination_goal_details(self, goal_details): - """Prints all the URL Destination goal type info.""" - - print '------ Url Destination Goal -------' - print 'Goal URL = %s' % goal_details.get('url') - print 'Case Sensitive = %s' % goal_details.get('caseSensitive') - print 'Match Type = %s' % goal_details.get('matchType') - print 'First Step Required = %s' % goal_details.get('firstStepRequired') - - print '------ Url Destination Goal Steps -------' - if goal_details.get('steps'): - for goal_step in goal_details.get('steps'): - print 'Step Number = %s' % goal_step.get('number') - print 'Step Name = %s' % goal_step.get('name') - print 'Step URL = %s' % goal_step.get('url') - else: - print 'No Steps Configured' - - def print_visit_time_on_site_goal_details(self, goal_details): - """Prints all the Visit Time On Site goal type info.""" - - print '------ Visit Time On Site Goal -------' - print 'Comparison Type = %s' % goal_details.get('comparisonType') - print 'comparison Value = %s' % goal_details.get('comparisonValue') - - def print_visit_num_pages_goal_details(self, goal_details): - """Prints all the Visit Num Pages goal type info.""" - - print '------ Visit Num Pages Goal -------' - print 'Comparison Type = %s' % goal_details.get('comparisonType') - print 'comparison Value = %s' % goal_details.get('comparisonValue') - - def print_event_goal_details(self, goal_details): - """Prints all the Event goal type info.""" - - print '------ Event Goal -------' - print 'Use Event Value = %s' % goal_details.get('useEventValue') - - for event_condition in goal_details.get('eventConditions'): - event_type = event_condition.get('type') - print 'Type = %s' % event_type - - if event_type in ('CATEGORY', 'ACTION', 'LABEL'): - print 'Match Type = %s' % event_condition.get('matchType') - print 'Expression = %s' % event_condition.get('expression') - else: # VALUE type. - print 'Comparison Type = %s' % event_condition.get('comparisonType') - print 'Comparison Value = %s' % event_condition.get('comparisonValue') - - def print_segments(self, segments_list): - """Prints all the segment info in the Segments Collection.""" - - print '------ Segments Collection -------' - self.print_pagination_info(segments_list) - print - - for segment in segments_list.get('items'): - print 'Segment ID = %s' % segment.get('id') - print 'Kind = %s' % segment.get('kind') - print 'Self Link = %s' % segment.get('selfLink') - print 'Name = %s' % segment.get('name') - print 'Definition = %s' % segment.get('definition') - print 'Created = %s' % segment.get('created') - print 'Updated = %s' % segment.get('updated') - print - - def print_pagination_info(self, mgmt_list): - """Prints common pagination details.""" - - print 'Items per page = %s' % mgmt_list.get('itemsPerPage') - print 'Total Results = %s' % mgmt_list.get('totalResults') - print 'Start Index = %s' % mgmt_list.get('startIndex') - - # These only have values if other result pages exist. - if mgmt_list.get('previousLink'): - print 'Previous Link = %s' % mgmt_list.get('previousLink') - if mgmt_list.get('nextLink'): - print 'Next Link = %s' % mgmt_list.get('nextLink') + # These only have values if other result pages exist. + if management_response.get('previousLink'): + print 'Previous Link = %s' % management_response.get('previousLink') + if management_response.get('nextLink'): + print 'Next Link = %s' % management_response.get('nextLink') if __name__ == '__main__': diff --git a/samples/analytics/sample_utils.py b/samples/analytics/sample_utils.py new file mode 100644 index 0000000..c397bf8 --- /dev/null +++ b/samples/analytics/sample_utils.py @@ -0,0 +1,131 @@ +#!/usr/bin/python +# +# Copyright 2012 Google Inc. All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +"""Utilities for Analytics API code samples. + +Handles various tasks to do with logging, authentication and initialization. +Mostly taken from Sergio :) + +Before You Begin: + +You must update the client_secrets.json file with a client id, client secret, +and the redirect uri. You get these values by creating a new project +in the Google APIs console and registering for OAuth2.0 for installed +applications: https://code.google.com/apis/console + +Also all OAuth2.0 tokens are stored for resue in the file specified +as TOKEN_FILE_NAME. You can modify this file name if you wish. +""" + +__author__ = ('sergio.gomes@google.com (Sergio Gomes)' + 'api.nickm@gmail.com (Nick Mihailovski)') + +import logging +import os +import sys +from apiclient.discovery import build +import gflags +import httplib2 +from oauth2client.client import flow_from_clientsecrets +from oauth2client.file import Storage +from oauth2client.tools import run + + +FLAGS = gflags.FLAGS + +# CLIENT_SECRETS, name of a file containing the OAuth 2.0 information for this +# application, including client_id and client_secret. You get these values by +# creating a new project in the Google APIs console and registering for +# OAuth2.0 for installed applications: +CLIENT_SECRETS = 'client_secrets.json' + + +# Helpful message to display in the browser if the CLIENT_SECRETS file +# is missing. +MISSING_CLIENT_SECRETS_MESSAGE = """ +WARNING: Please configure OAuth 2.0 + +To make this sample run you will need to populate the client_secrets.json file +found at: + + %s + +with information from the APIs Console . + +""" % os.path.join(os.path.dirname(__file__), CLIENT_SECRETS) + +# Set up a Flow object to be used if we need to authenticate. +FLOW = flow_from_clientsecrets(CLIENT_SECRETS, + scope='https://www.googleapis.com/auth/analytics.readonly', + message=MISSING_CLIENT_SECRETS_MESSAGE) + +# The gflags module makes defining command-line options easy for applications. +# Run this program with the '--help' argument to see all the flags that it +# understands. +gflags.DEFINE_enum('logging_level', 'ERROR', + ['DEBUG', 'INFO', 'WARNING', 'ERROR', 'CRITICAL'], + 'Set the level of logging detail.') + + +# Name of file that will store the access and refresh tokens to access +# the API without having to login each time. Make sure this file is in +# a secure place. +TOKEN_FILE_NAME = 'analytics.dat' + + +def process_flags(argv): + """Uses the command-line flags to set the logging level. + + Args: + argv: List of command line arguments passed to the python script. + """ + + # Let the gflags module process the command-line arguments. + try: + argv = FLAGS(argv) + except gflags.FlagsError, e: + print '%s\nUsage: %s ARGS\n%s' % (e, argv[0], FLAGS) + sys.exit(1) + + # Set the logging according to the command-line flag. + logging.getLogger().setLevel(getattr(logging, FLAGS.logging_level)) + + +def initialize_service(): + """Returns an instance of service from discovery data and does auth. + + This method tries to read any existing OAuth 2.0 credentials from the + Storage object. If the credentials do not exist, new credentials are + obtained. The crdentials are used to authorize an http object. The + http object is used to build the analytics service object. + + Returns: + An analytics v3 service object. + """ + + # Create an httplib2.Http object to handle our HTTP requests. + http = httplib2.Http() + + # Prepare credentials, and authorize HTTP object with them. + storage = Storage(TOKEN_FILE_NAME) + credentials = storage.get() + if credentials is None or credentials.invalid: + credentials = run(FLOW, storage) + + http = credentials.authorize(http) + + # Retrieve service. + return build('analytics', 'v3', http=http)