Files
deb-python-oauth2client/oacurl.py
ade@google.com 60a53c035e Removed buzz_gae_client.py and it's associated tests.
Renamed simple_buzz_wrapper.py and it's tests to simple_wrapper.py.
SimpleWrapper now uses the Credential class.
Added oauth_required decorator for use on AppEngine. This aims to
greatly simplify OAuth use with this library. At the moment it only
supports Buzz.
oacurl.py now uses spaces for indentation rather than tabs.
2011-01-10 02:33:17 +00:00

160 lines
4.5 KiB
Python

# Copyright (C) 2010 Google Inc.
#
# 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.
from apiclient.discovery import build
from apiclient.oauth import FlowThreeLegged
import datetime
import httplib2
import logging
import oauth_wrap
import optparse
import os
import sys
def load_properties_file(path):
properties = {}
for line in open(path):
line = line.strip()
if line.startswith('#'):
continue
key,value = line.split('=')
properties[key.strip()] = value.strip()
return properties
def save_properties(consumer_key, consumer_secret, token_key, token_secret, path):
file = open(path, 'w')
# File format and order is based on oacurl.java's defaults
now = datetime.datetime.today()
now_string = now.strftime('%a %b %d %H:%m:%S %Z %Y')
file.write('#%s\n' % now_string)
file.write('consumerSecret=%s\n' % consumer_secret)
file.write('accessToken=%s\n' % token_key)
file.write('consumerKey=%s\n' % consumer_key)
file.write('accessTokenSecret=%s\n' % token_secret)
file.close()
def fetch(url):
logging.debug('Now fetching: %s' % url)
path = os.path.expanduser('~/.oacurl.properties')
if not os.path.exists(path):
logging.debug('User is not logged in.')
print 'You are not logged in'
sys.exit(1)
properties = load_properties_file(path)
oauth_parameters = {
'consumer_key': properties['consumerKey'],
'consumer_secret' : properties['consumerSecret'],
'oauth_token' : properties['accessToken'],
'oauth_token_secret':properties['accessTokenSecret']}
http = oauth_wrap.get_authorised_http(oauth_parameters)
response, content = http.request(url)
logging.debug(response)
logging.debug(content)
return response,content
def buzz_login():
buzz_discovery = build("buzz", "v1").auth_discovery()
flow = FlowThreeLegged(buzz_discovery,
consumer_key='anonymous',
consumer_secret='anonymous',
user_agent='google-api-client-python-buzz-cmdline/1.0',
domain='anonymous',
scope='https://www.googleapis.com/auth/buzz',
xoauth_displayname='oacurl.py')
authorize_url = flow.step1_get_authorize_url()
print 'Go to the following link in your browser:'
print authorize_url
print
accepted = 'n'
while accepted.lower() == 'n':
accepted = raw_input('Have you authorized me? (y/n) ')
verification = raw_input('What is the verification code? ').strip()
credentials = flow.step2_exchange(verification)
path = os.path.expanduser('~/.oacurl.properties')
save_properties('anonymous', 'anonymous', credentials.token.key, credentials.token.secret,path)
def generic_login():
#TODO(ade) Implement support for other services
print 'Support for services other than Buzz is not implemented yet. Sorry.'
def login(options):
if options.buzz:
buzz_login()
else:
generic_login()
def get_command(args):
if args and args[0] == 'login':
return 'login'
if args and args[0] == 'fetch':
return 'fetch'
return None
def configure_logging(options):
if options.verbose:
logging.basicConfig(level=logging.DEBUG)
def main():
usage = '''Usage: %prog [options] fetch <url>
Example: %prog -v fetch "https://www.googleapis.com/buzz/v1/people/@me/@self?alt=json&pp=1"
'''
parser = optparse.OptionParser(usage=usage)
parser.set_defaults(verbose=False)
parser.add_option('-v', '--verbose', action='store_true', dest='verbose')
parser.add_option('-q', '--quiet', action='store_false', dest='verbose')
parser.add_option('--buzz', action='store_true', dest='buzz')
(options, args) = parser.parse_args()
configure_logging(options)
logging.debug('Options: %s and Args: %s' % (str(options), str(args)))
command = get_command(args)
if not command:
parser.error('Invalid arguments')
return
if command == 'fetch':
response, content = fetch(args[1])
print response
print content
return
if command == 'login':
login(options)
if __name__ == '__main__':
main()