Move all remaining samples over to client_secrets.json.
Fixes issue #156. Reviewed in http://codereview.appspot.com/6305118/.
This commit is contained in:
		@@ -39,54 +39,59 @@ __author__ = 'rahulpaul@google.com (Rahul Paul)'
 | 
				
			|||||||
import gflags
 | 
					import gflags
 | 
				
			||||||
import httplib2
 | 
					import httplib2
 | 
				
			||||||
import logging
 | 
					import logging
 | 
				
			||||||
import re
 | 
					import os
 | 
				
			||||||
import simplejson
 | 
					import pprint
 | 
				
			||||||
import sys
 | 
					import sys
 | 
				
			||||||
 | 
					
 | 
				
			||||||
from apiclient.discovery import build
 | 
					from apiclient.discovery import build
 | 
				
			||||||
from oauth2client.client import AccessTokenRefreshError
 | 
					from oauth2client.client import AccessTokenRefreshError
 | 
				
			||||||
from oauth2client.client import OAuth2WebServerFlow
 | 
					from oauth2client.client import flow_from_clientsecrets
 | 
				
			||||||
from oauth2client.file import Storage
 | 
					from oauth2client.file import Storage
 | 
				
			||||||
from oauth2client.tools import run
 | 
					from oauth2client.tools import run
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
FLAGS = gflags.FLAGS
 | 
					FLAGS = gflags.FLAGS
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# Set up a Flow object to be used if we need to authenticate. This
 | 
					# CLIENT_SECRETS, name of a file containing the OAuth 2.0 information for this
 | 
				
			||||||
# sample uses OAuth 2.0, and we set up the OAuth2WebServerFlow with
 | 
					# application, including client_id and client_secret, which are found
 | 
				
			||||||
# the information it needs to authenticate. Note that it is called
 | 
					# on the API Access tab on the Google APIs
 | 
				
			||||||
# the Web Server Flow, but it can also handle the flow for native
 | 
					# Console <http://code.google.com/apis/console>
 | 
				
			||||||
# applications <http://code.google.com/apis/accounts/docs/OAuth2.html#IA>
 | 
					CLIENT_SECRETS = 'client_secrets.json'
 | 
				
			||||||
# When creating credentials for this application be sure to choose an
 | 
					 | 
				
			||||||
# Application type of 'Installed application'.
 | 
					 | 
				
			||||||
FLOW = OAuth2WebServerFlow(
 | 
					 | 
				
			||||||
    client_id='880851855448.apps.googleusercontent.com',
 | 
					 | 
				
			||||||
    client_secret='d8nBjlNBpOMH_LITqz31IMdI',
 | 
					 | 
				
			||||||
    scope='https://www.googleapis.com/auth/apps/reporting/audit.readonly',
 | 
					 | 
				
			||||||
    user_agent='audit-cmdline-sample/1.0')
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
# The flags module makes defining command-line options easy for
 | 
					# 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 <https://code.google.com/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/apps/reporting/audit.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
 | 
					# applications. Run this program with the '--help' argument to see
 | 
				
			||||||
# all the flags that it understands.
 | 
					# all the flags that it understands.
 | 
				
			||||||
gflags.DEFINE_enum('logging_level', 'ERROR',
 | 
					gflags.DEFINE_enum('logging_level', 'ERROR',
 | 
				
			||||||
                  ['DEBUG', 'INFO', 'WARNING', 'ERROR', 'CRITICAL'],
 | 
					    ['DEBUG', 'INFO', 'WARNING', 'ERROR', 'CRITICAL'],
 | 
				
			||||||
                  'Set the level of logging detail.')
 | 
					    'Set the level of logging detail.')
 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
def print_activities(activity_list):
 | 
					 | 
				
			||||||
  events = activity_list['items']
 | 
					 | 
				
			||||||
  print '\nRetrieved %d activities.' % len(events)
 | 
					 | 
				
			||||||
  for i in range(len(events)):
 | 
					 | 
				
			||||||
    print '\nEvent %d : %s' % (i, simplejson.JSONEncoder().encode(events[i]))
 | 
					 | 
				
			||||||
  print '\nNext URL : %s' % (activity_list['next'])
 | 
					 | 
				
			||||||
  print '======================================================================'
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
def main(argv):
 | 
					def main(argv):
 | 
				
			||||||
  # Let the flags module process the command-line arguments
 | 
					  # Let the gflags module process the command-line arguments
 | 
				
			||||||
  try:
 | 
					  try:
 | 
				
			||||||
    argv = FLAGS(argv)
 | 
					    argv = FLAGS(argv)
 | 
				
			||||||
  except gflags.FlagsError, e:
 | 
					  except gflags.FlagsError, e:
 | 
				
			||||||
    print '%s\nUsage: %s ARGS\n%s' % (e, argv[0], FLAGS)
 | 
					    print '%s\\nUsage: %s ARGS\\n%s' % (e, argv[0], FLAGS)
 | 
				
			||||||
    sys.exit(1)
 | 
					    sys.exit(1)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  # Set the logging according to the command-line flag
 | 
					  # Set the logging according to the command-line flag
 | 
				
			||||||
@@ -95,9 +100,10 @@ def main(argv):
 | 
				
			|||||||
  # If the Credentials don't exist or are invalid run through the native client
 | 
					  # 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
 | 
					  # flow. The Storage object will ensure that if successful the good
 | 
				
			||||||
  # Credentials will get written back to a file.
 | 
					  # Credentials will get written back to a file.
 | 
				
			||||||
  storage = Storage('audit.dat')
 | 
					  storage = Storage('plus.dat')
 | 
				
			||||||
  credentials = storage.get()
 | 
					  credentials = storage.get()
 | 
				
			||||||
  if not credentials or credentials.invalid:
 | 
					
 | 
				
			||||||
 | 
					  if credentials is None or credentials.invalid:
 | 
				
			||||||
    credentials = run(FLOW, storage)
 | 
					    credentials = run(FLOW, storage)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  # Create an httplib2.Http object to handle our HTTP requests and authorize it
 | 
					  # Create an httplib2.Http object to handle our HTTP requests and authorize it
 | 
				
			||||||
@@ -131,7 +137,8 @@ def main(argv):
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
  except AccessTokenRefreshError:
 | 
					  except AccessTokenRefreshError:
 | 
				
			||||||
    print ('The credentials have been revoked or expired, please re-run'
 | 
					    print ('The credentials have been revoked or expired, please re-run'
 | 
				
			||||||
           'the application to re-authorize')
 | 
					      'the application to re-authorize')
 | 
				
			||||||
 | 
					
 | 
				
			||||||
if __name__ == '__main__':
 | 
					if __name__ == '__main__':
 | 
				
			||||||
  main(sys.argv)
 | 
					  main(sys.argv)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										9
									
								
								samples/audit/client_secrets.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										9
									
								
								samples/audit/client_secrets.json
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,9 @@
 | 
				
			|||||||
 | 
					{
 | 
				
			||||||
 | 
					  "web": {
 | 
				
			||||||
 | 
					    "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"
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										9
									
								
								samples/moderator/client_secrets.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										9
									
								
								samples/moderator/client_secrets.json
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,9 @@
 | 
				
			|||||||
 | 
					{
 | 
				
			||||||
 | 
					  "web": {
 | 
				
			||||||
 | 
					    "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"
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@@ -37,31 +37,44 @@ __author__ = 'jcgregorio@google.com (Joe Gregorio)'
 | 
				
			|||||||
import gflags
 | 
					import gflags
 | 
				
			||||||
import httplib2
 | 
					import httplib2
 | 
				
			||||||
import logging
 | 
					import logging
 | 
				
			||||||
 | 
					import os
 | 
				
			||||||
import pprint
 | 
					import pprint
 | 
				
			||||||
import sys
 | 
					import sys
 | 
				
			||||||
 | 
					
 | 
				
			||||||
from apiclient.discovery import build
 | 
					from apiclient.discovery import build
 | 
				
			||||||
from oauth2client.file import Storage
 | 
					 | 
				
			||||||
from oauth2client.client import AccessTokenRefreshError
 | 
					from oauth2client.client import AccessTokenRefreshError
 | 
				
			||||||
from oauth2client.client import OAuth2WebServerFlow
 | 
					from oauth2client.client import flow_from_clientsecrets
 | 
				
			||||||
 | 
					from oauth2client.file import Storage
 | 
				
			||||||
from oauth2client.tools import run
 | 
					from oauth2client.tools import run
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
FLAGS = gflags.FLAGS
 | 
					FLAGS = gflags.FLAGS
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# Set up a Flow object to be used if we need to authenticate. This
 | 
					# CLIENT_SECRETS, name of a file containing the OAuth 2.0 information for this
 | 
				
			||||||
# sample uses OAuth 2.0, and we set up the OAuth2WebServerFlow with
 | 
					# application, including client_id and client_secret, which are found
 | 
				
			||||||
# the information it needs to authenticate. Note that it is called
 | 
					# on the API Access tab on the Google APIs
 | 
				
			||||||
# the Web Server Flow, but it can also handle the flow for native
 | 
					# Console <http://code.google.com/apis/console>
 | 
				
			||||||
# applications <http://code.google.com/apis/accounts/docs/OAuth2.html#IA>
 | 
					CLIENT_SECRETS = 'client_secrets.json'
 | 
				
			||||||
# The client_id client_secret are copied from the API Access tab on
 | 
					
 | 
				
			||||||
# the Google APIs Console <http://code.google.com/apis/console>. When
 | 
					# Helpful message to display in the browser if the CLIENT_SECRETS file
 | 
				
			||||||
# creating credentials for this application be sure to choose an Application
 | 
					# is missing.
 | 
				
			||||||
# type of "Installed application".
 | 
					MISSING_CLIENT_SECRETS_MESSAGE = """
 | 
				
			||||||
FLOW = OAuth2WebServerFlow(
 | 
					WARNING: Please configure OAuth 2.0
 | 
				
			||||||
    client_id='433807057907.apps.googleusercontent.com',
 | 
					
 | 
				
			||||||
    client_secret='jigtZpMApkRxncxikFpR+SFg',
 | 
					To make this sample run you will need to populate the client_secrets.json file
 | 
				
			||||||
 | 
					found at:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   %s
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					with information from the APIs Console <https://code.google.com/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/moderator',
 | 
					    scope='https://www.googleapis.com/auth/moderator',
 | 
				
			||||||
    user_agent='moderator-cmdline-sample/1.0')
 | 
					    message=MISSING_CLIENT_SECRETS_MESSAGE)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# The gflags module makes defining command-line options easy for
 | 
					# The gflags module makes defining command-line options easy for
 | 
				
			||||||
# applications. Run this program with the '--help' argument to see
 | 
					# applications. Run this program with the '--help' argument to see
 | 
				
			||||||
@@ -85,8 +98,9 @@ def main(argv):
 | 
				
			|||||||
  # If the Credentials don't exist or are invalid run through the native client
 | 
					  # 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
 | 
					  # flow. The Storage object will ensure that if successful the good
 | 
				
			||||||
  # Credentials will get written back to a file.
 | 
					  # Credentials will get written back to a file.
 | 
				
			||||||
  storage = Storage('moderator.dat')
 | 
					  storage = Storage('plus.dat')
 | 
				
			||||||
  credentials = storage.get()
 | 
					  credentials = storage.get()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  if credentials is None or credentials.invalid:
 | 
					  if credentials is None or credentials.invalid:
 | 
				
			||||||
    credentials = run(FLOW, storage)
 | 
					    credentials = run(FLOW, storage)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -95,54 +109,55 @@ def main(argv):
 | 
				
			|||||||
  http = httplib2.Http()
 | 
					  http = httplib2.Http()
 | 
				
			||||||
  http = credentials.authorize(http)
 | 
					  http = credentials.authorize(http)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  service = build("moderator", "v1", http=http)
 | 
					  service = build('moderator', 'v1', http=http)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  try:
 | 
					  try:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    # Create a new Moderator series.
 | 
					    # Create a new Moderator series.
 | 
				
			||||||
    series_body = {
 | 
					    series_body = {
 | 
				
			||||||
          "description": "Share and rank tips for eating healthy and cheap!",
 | 
					          'description': 'Share and rank tips for eating healthy and cheap!',
 | 
				
			||||||
          "name": "Eating Healthy & Cheap",
 | 
					          'name': 'Eating Healthy & Cheap',
 | 
				
			||||||
          "videoSubmissionAllowed": False
 | 
					          'videoSubmissionAllowed': False
 | 
				
			||||||
          }
 | 
					          }
 | 
				
			||||||
    series = service.series().insert(body=series_body).execute()
 | 
					    series = service.series().insert(body=series_body).execute()
 | 
				
			||||||
    print "Created a new series"
 | 
					    print 'Created a new series'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    # Create a new Moderator topic in that series.
 | 
					    # Create a new Moderator topic in that series.
 | 
				
			||||||
    topic_body = {
 | 
					    topic_body = {
 | 
				
			||||||
          "description": "Share your ideas on eating healthy!",
 | 
					          'description': 'Share your ideas on eating healthy!',
 | 
				
			||||||
          "name": "Ideas",
 | 
					          'name': 'Ideas',
 | 
				
			||||||
          "presenter": "liz"
 | 
					          'presenter': 'liz'
 | 
				
			||||||
          }
 | 
					          }
 | 
				
			||||||
    topic = service.topics().insert(seriesId=series['id']['seriesId'],
 | 
					    topic = service.topics().insert(seriesId=series['id']['seriesId'],
 | 
				
			||||||
                              body=topic_body).execute()
 | 
					                              body=topic_body).execute()
 | 
				
			||||||
    print "Created a new topic"
 | 
					    print 'Created a new topic'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    # Create a new Submission in that topic.
 | 
					    # Create a new Submission in that topic.
 | 
				
			||||||
    submission_body = {
 | 
					    submission_body = {
 | 
				
			||||||
          "attachmentUrl": "http://www.youtube.com/watch?v=1a1wyc5Xxpg",
 | 
					          'attachmentUrl': 'http://www.youtube.com/watch?v=1a1wyc5Xxpg',
 | 
				
			||||||
          "attribution": {
 | 
					          'attribution': {
 | 
				
			||||||
            "displayName": "Bashan",
 | 
					            'displayName': 'Bashan',
 | 
				
			||||||
            "location": "Bainbridge Island, WA"
 | 
					            'location': 'Bainbridge Island, WA'
 | 
				
			||||||
            },
 | 
					            },
 | 
				
			||||||
          "text": "Charlie Ayers @ Google"
 | 
					          'text': 'Charlie Ayers @ Google'
 | 
				
			||||||
          }
 | 
					          }
 | 
				
			||||||
    submission = service.submissions().insert(seriesId=topic['id']['seriesId'],
 | 
					    submission = service.submissions().insert(seriesId=topic['id']['seriesId'],
 | 
				
			||||||
        topicId=topic['id']['topicId'], body=submission_body).execute()
 | 
					        topicId=topic['id']['topicId'], body=submission_body).execute()
 | 
				
			||||||
    print "Inserted a new submisson on the topic"
 | 
					    print 'Inserted a new submisson on the topic'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    # Vote on that newly added Submission.
 | 
					    # Vote on that newly added Submission.
 | 
				
			||||||
    vote_body = {
 | 
					    vote_body = {
 | 
				
			||||||
          "vote": "PLUS"
 | 
					          'vote': 'PLUS'
 | 
				
			||||||
          }
 | 
					          }
 | 
				
			||||||
    service.votes().insert(seriesId=topic['id']['seriesId'],
 | 
					    service.votes().insert(seriesId=topic['id']['seriesId'],
 | 
				
			||||||
                     submissionId=submission['id']['submissionId'],
 | 
					                     submissionId=submission['id']['submissionId'],
 | 
				
			||||||
                     body=vote_body)
 | 
					                     body=vote_body)
 | 
				
			||||||
    print "Voted on the submission"
 | 
					    print 'Voted on the submission'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  except AccessTokenRefreshError:
 | 
					  except AccessTokenRefreshError:
 | 
				
			||||||
    print ("The credentials have been revoked or expired, please re-run"
 | 
					    print ('The credentials have been revoked or expired, please re-run'
 | 
				
			||||||
      "the application to re-authorize")
 | 
					      'the application to re-authorize')
 | 
				
			||||||
 | 
					
 | 
				
			||||||
if __name__ == '__main__':
 | 
					if __name__ == '__main__':
 | 
				
			||||||
  main(sys.argv)
 | 
					  main(sys.argv)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -17,17 +17,17 @@
 | 
				
			|||||||
"""This application produces formatted listings for Google Cloud
 | 
					"""This application produces formatted listings for Google Cloud
 | 
				
			||||||
   Storage buckets.
 | 
					   Storage buckets.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
It takes a bucket name in the URL path and does an HTTP GET on the 
 | 
					It takes a bucket name in the URL path and does an HTTP GET on the
 | 
				
			||||||
corresponding Google Cloud Storage URL to obtain a listing of the 
 | 
					corresponding Google Cloud Storage URL to obtain a listing of the bucket
 | 
				
			||||||
bucket contents. For example, if this app is invoked with the URI 
 | 
					contents. For example, if this app is invoked with the URI
 | 
				
			||||||
http://bucket-list.appspot.com/foo, it would remove the bucket name 
 | 
					http://bucket-list.appspot.com/foo, it would remove the bucket name 'foo',
 | 
				
			||||||
'foo', append it to the Google Cloud Storage service URI and send 
 | 
					append it to the Google Cloud Storage service URI and send a GET request to
 | 
				
			||||||
a GET request to the resulting URI. The bucket listing is returned 
 | 
					the resulting URI. The bucket listing is returned in an XML document, which is
 | 
				
			||||||
in an XML document, which is prepended with a reference to an XSLT 
 | 
					prepended with a reference to an XSLT style sheet for human readable
 | 
				
			||||||
style sheet for human readable presentation.
 | 
					presentation.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
More information about using Google App Engine apps and service accounts
 | 
					More information about using Google App Engine apps and service accounts to
 | 
				
			||||||
to call Google APIs can be found here:
 | 
					call Google APIs can be found here:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
<https://developers.google.com/accounts/docs/OAuth2ServiceAccount>
 | 
					<https://developers.google.com/accounts/docs/OAuth2ServiceAccount>
 | 
				
			||||||
<http://code.google.com/appengine/docs/python/appidentity/overview.html>
 | 
					<http://code.google.com/appengine/docs/python/appidentity/overview.html>
 | 
				
			||||||
@@ -73,7 +73,7 @@ class MainHandler(webapp.RequestHandler):
 | 
				
			|||||||
        err = 'Error: ' + str(resp.status) + ', bucket: ' + bucket + \
 | 
					        err = 'Error: ' + str(resp.status) + ', bucket: ' + bucket + \
 | 
				
			||||||
              ', response: ' + str(content)
 | 
					              ', response: ' + str(content)
 | 
				
			||||||
        raise Exception(err)
 | 
					        raise Exception(err)
 | 
				
			||||||
      # Edit returned bucket listing XML to insert a reference to our style 
 | 
					      # Edit returned bucket listing XML to insert a reference to our style
 | 
				
			||||||
      # sheet for nice formatting and send results to client.
 | 
					      # sheet for nice formatting and send results to client.
 | 
				
			||||||
      content = re.sub('(<ListBucketResult)', XSL + '\\1', content)
 | 
					      content = re.sub('(<ListBucketResult)', XSL + '\\1', content)
 | 
				
			||||||
      self.response.headers['Content-Type'] = 'text/xml'
 | 
					      self.response.headers['Content-Type'] = 'text/xml'
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										9
									
								
								samples/urlshortener/client_secrets.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										9
									
								
								samples/urlshortener/client_secrets.json
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,9 @@
 | 
				
			|||||||
 | 
					{
 | 
				
			||||||
 | 
					  "web": {
 | 
				
			||||||
 | 
					    "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"
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@@ -38,31 +38,44 @@ __author__ = 'jcgregorio@google.com (Joe Gregorio)'
 | 
				
			|||||||
import gflags
 | 
					import gflags
 | 
				
			||||||
import httplib2
 | 
					import httplib2
 | 
				
			||||||
import logging
 | 
					import logging
 | 
				
			||||||
 | 
					import os
 | 
				
			||||||
import pprint
 | 
					import pprint
 | 
				
			||||||
import sys
 | 
					import sys
 | 
				
			||||||
 | 
					
 | 
				
			||||||
from apiclient.discovery import build
 | 
					from apiclient.discovery import build
 | 
				
			||||||
from oauth2client.file import Storage
 | 
					 | 
				
			||||||
from oauth2client.client import AccessTokenRefreshError
 | 
					from oauth2client.client import AccessTokenRefreshError
 | 
				
			||||||
from oauth2client.client import OAuth2WebServerFlow
 | 
					from oauth2client.client import flow_from_clientsecrets
 | 
				
			||||||
 | 
					from oauth2client.file import Storage
 | 
				
			||||||
from oauth2client.tools import run
 | 
					from oauth2client.tools import run
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
FLAGS = gflags.FLAGS
 | 
					FLAGS = gflags.FLAGS
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# Set up a Flow object to be used if we need to authenticate. This
 | 
					# CLIENT_SECRETS, name of a file containing the OAuth 2.0 information for this
 | 
				
			||||||
# sample uses OAuth 2.0, and we set up the OAuth2WebServerFlow with
 | 
					# application, including client_id and client_secret, which are found
 | 
				
			||||||
# the information it needs to authenticate. Note that it is called
 | 
					# on the API Access tab on the Google APIs
 | 
				
			||||||
# the Web Server Flow, but it can also handle the flow for native
 | 
					# Console <http://code.google.com/apis/console>
 | 
				
			||||||
# applications <http://code.google.com/apis/accounts/docs/OAuth2.html#IA>
 | 
					CLIENT_SECRETS = 'client_secrets.json'
 | 
				
			||||||
# The client_id client_secret are copied from the API Access tab on
 | 
					
 | 
				
			||||||
# the Google APIs Console <http://code.google.com/apis/console>. When
 | 
					# Helpful message to display in the browser if the CLIENT_SECRETS file
 | 
				
			||||||
# creating credentials for this application be sure to choose an Application
 | 
					# is missing.
 | 
				
			||||||
# type of "Installed application".
 | 
					MISSING_CLIENT_SECRETS_MESSAGE = """
 | 
				
			||||||
FLOW = OAuth2WebServerFlow(
 | 
					WARNING: Please configure OAuth 2.0
 | 
				
			||||||
    client_id='[[CLIENT ID GOES HERE]]',
 | 
					
 | 
				
			||||||
    client_secret='[[CLIENT SECRET GOES HERE]]',
 | 
					To make this sample run you will need to populate the client_secrets.json file
 | 
				
			||||||
 | 
					found at:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					   %s
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					with information from the APIs Console <https://code.google.com/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/urlshortener',
 | 
					    scope='https://www.googleapis.com/auth/urlshortener',
 | 
				
			||||||
    user_agent='urlshortener-cmdline-sample/1.0')
 | 
					    message=MISSING_CLIENT_SECRETS_MESSAGE)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# The gflags module makes defining command-line options easy for
 | 
					# The gflags module makes defining command-line options easy for
 | 
				
			||||||
# applications. Run this program with the '--help' argument to see
 | 
					# applications. Run this program with the '--help' argument to see
 | 
				
			||||||
@@ -86,8 +99,9 @@ def main(argv):
 | 
				
			|||||||
  # If the Credentials don't exist or are invalid run through the native client
 | 
					  # 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
 | 
					  # flow. The Storage object will ensure that if successful the good
 | 
				
			||||||
  # Credentials will get written back to a file.
 | 
					  # Credentials will get written back to a file.
 | 
				
			||||||
  storage = Storage('urlshortener.dat')
 | 
					  storage = Storage('plus.dat')
 | 
				
			||||||
  credentials = storage.get()
 | 
					  credentials = storage.get()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  if credentials is None or credentials.invalid:
 | 
					  if credentials is None or credentials.invalid:
 | 
				
			||||||
    credentials = run(FLOW, storage)
 | 
					    credentials = run(FLOW, storage)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -96,14 +110,14 @@ def main(argv):
 | 
				
			|||||||
  http = httplib2.Http()
 | 
					  http = httplib2.Http()
 | 
				
			||||||
  http = credentials.authorize(http)
 | 
					  http = credentials.authorize(http)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  service = build("urlshortener", "v1", http=http)
 | 
					  service = build('urlshortener', 'v1', http=http)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  try:
 | 
					  try:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    url = service.url()
 | 
					    url = service.url()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    # Create a shortened URL by inserting the URL into the url collection.
 | 
					    # Create a shortened URL by inserting the URL into the url collection.
 | 
				
			||||||
    body = {"longUrl": "http://code.google.com/apis/urlshortener/" }
 | 
					    body = {'longUrl': 'http://code.google.com/apis/urlshortener/' }
 | 
				
			||||||
    resp = url.insert(body=body).execute()
 | 
					    resp = url.insert(body=body).execute()
 | 
				
			||||||
    pprint.pprint(resp)
 | 
					    pprint.pprint(resp)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -113,10 +127,9 @@ def main(argv):
 | 
				
			|||||||
    resp = url.get(shortUrl=short_url).execute()
 | 
					    resp = url.get(shortUrl=short_url).execute()
 | 
				
			||||||
    pprint.pprint(resp)
 | 
					    pprint.pprint(resp)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					 | 
				
			||||||
  except AccessTokenRefreshError:
 | 
					  except AccessTokenRefreshError:
 | 
				
			||||||
    print ("The credentials have been revoked or expired, please re-run"
 | 
					    print ('The credentials have been revoked or expired, please re-run'
 | 
				
			||||||
      "the application to re-authorize")
 | 
					      'the application to re-authorize')
 | 
				
			||||||
 | 
					
 | 
				
			||||||
if __name__ == '__main__':
 | 
					if __name__ == '__main__':
 | 
				
			||||||
  main(sys.argv)
 | 
					  main(sys.argv)
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user