Move all remaining samples over to client_secrets.json.

Fixes issue #156.

Reviewed in http://codereview.appspot.com/6305118/.
This commit is contained in:
Joe Gregorio
2012-06-20 12:10:56 -04:00
parent f46ea5502e
commit 84e4180c0b
7 changed files with 161 additions and 99 deletions

View File

@@ -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)

View 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"
}
}

View 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"
}
}

View File

@@ -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)

View File

@@ -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'

View 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"
}
}

View File

@@ -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)