Added ability to login to buzz and store oacurl.java compatible credentials in ~/.oacurl.properties
diff --git a/oacurl.py b/oacurl.py
index 68b4ca9..64493b5 100644
--- a/oacurl.py
+++ b/oacurl.py
@@ -11,13 +11,18 @@
# 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.
-import optparse
+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):
@@ -29,6 +34,20 @@
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)
@@ -38,6 +57,7 @@
print 'You are not logged in'
sys.exit(1)
+
properties = load_properties_file(path)
oauth_parameters = {
'consumer_key': properties['consumerKey'],
@@ -52,7 +72,48 @@
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[0] == 'login':
+ return 'login'
if args[0] == 'fetch':
return 'fetch'
return None
@@ -69,6 +130,7 @@
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()
@@ -85,6 +147,10 @@
response, content = fetch(args[1])
print response
print content
+ return
+
+ if command == 'login':
+ login(options)
if __name__ == '__main__':
main()
\ No newline at end of file