From: Josh Roesslein Date: Sun, 20 Sep 2009 22:07:09 +0000 (-0500) Subject: Added appengine example for using oauth. X-Git-Url: https://vcs.fsf.org/?a=commitdiff_plain;h=fef7e05477a24a6c9a523e5bfae45bb96c7382a8;p=tweepy.git Added appengine example for using oauth. --- diff --git a/CHANGES b/CHANGES index 357a440..bf68daa 100644 --- a/CHANGES +++ b/CHANGES @@ -7,6 +7,9 @@ during upgrade will be listed here. + Google App Engine fixes (thanks Thomas Bohmbach, Jr) + Added Retweet API methods + Added Retweet Streaming method ++ Added set_request_token() method to OAuthHandler ++ Examples + + Appengine demo (oauth) 1.0 -> 1.0.1 ============ diff --git a/examples/appengine/app.py b/examples/appengine/app.py new file mode 100644 index 0000000..a1cf44b --- /dev/null +++ b/examples/appengine/app.py @@ -0,0 +1,23 @@ +from google.appengine.ext import webapp +from google.appengine.ext.webapp.util import run_wsgi_app + +import sys +sys.path.insert(0, 'tweepy.zip') + +import oauth_example.handlers + +# Construct the WSGI application +application = webapp.WSGIApplication([ + + # OAuth example + (r'/oauth/', oauth_example.handlers.MainPage), + (r'/oauth/callback', oauth_example.handlers.CallbackPage), + +], debug=True) + +def main(): + run_wsgi_app(application) + +# Run the WSGI application +if __name__ == '__main__': + main() diff --git a/examples/appengine/app.yaml b/examples/appengine/app.yaml new file mode 100644 index 0000000..6f9e636 --- /dev/null +++ b/examples/appengine/app.yaml @@ -0,0 +1,9 @@ +application: tweepy-demo +version: 1 +runtime: python +api_version: 1 + +handlers: +- url: /.* + script: app.py + diff --git a/examples/appengine/error.html b/examples/appengine/error.html new file mode 100644 index 0000000..417572a --- /dev/null +++ b/examples/appengine/error.html @@ -0,0 +1,11 @@ + + + + Tweepy OAuth Example -- Error! + + + +

{{message}}

+ + + diff --git a/examples/appengine/index.yaml b/examples/appengine/index.yaml new file mode 100644 index 0000000..a3b9e05 --- /dev/null +++ b/examples/appengine/index.yaml @@ -0,0 +1,11 @@ +indexes: + +# AUTOGENERATED + +# This index.yaml is automatically updated whenever the dev_appserver +# detects that a new type of query is run. If you want to manage the +# index.yaml file manually, remove the above marker line (the line +# saying "# AUTOGENERATED"). If you want to manage some indexes +# manually, move them above the marker line. The index.yaml file is +# automatically uploaded to the admin console when you next deploy +# your application using appcfg.py. diff --git a/examples/appengine/oauth_example/__init__.py b/examples/appengine/oauth_example/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/examples/appengine/oauth_example/callback.html b/examples/appengine/oauth_example/callback.html new file mode 100644 index 0000000..58bc2bd --- /dev/null +++ b/examples/appengine/oauth_example/callback.html @@ -0,0 +1,16 @@ + + + + Tweepy OAuth Example -- callback + + + +

Success!

+

Access token

+ + + + diff --git a/examples/appengine/oauth_example/handlers.py b/examples/appengine/oauth_example/handlers.py new file mode 100644 index 0000000..d9726dd --- /dev/null +++ b/examples/appengine/oauth_example/handlers.py @@ -0,0 +1,72 @@ +import pickle +from google.appengine.ext.webapp import RequestHandler, template +from google.appengine.ext import db +import tweepy + +from oauth_example.models import OAuthToken + +CONSUMER_KEY = 'e9n31I0z64dagq3WbErGvA' +CONSUMER_SECRET = '9hwCupdAKV8EixeNdN3xrxL9RG3X3JTXI0Q520Oyolo' +CALLBACK = 'http://127.0.0.1:8080/oauth/callback' + +# Main page handler (/oauth/) +class MainPage(RequestHandler): + + def get(self): + # Build a new oauth handler and display authorization url to user. + auth = tweepy.OAuthHandler(CONSUMER_KEY, CONSUMER_SECRET, CALLBACK) + try: + print template.render('oauth_example/main.html', { + "authurl": auth.get_authorization_url(), + "request_token": auth.request_token + }) + except tweepy.TweepError, e: + # Failed to get a request token + print template.render('error.html', {'message': e}) + return + + # We must store the request token for later use in the callback page. + request_token = OAuthToken( + token_key = auth.request_token.key, + token_secret = auth.request_token.secret + ) + request_token.put() + +# Callback page (/oauth/callback) +class CallbackPage(RequestHandler): + + def get(self): + oauth_token = self.request.get("oauth_token", None) + oauth_verifier = self.request.get("oauth_verifier", None) + if oauth_token is None: + # Invalid request! + print template.render('error.html', { + 'message': 'Missing required parameters!' + }) + return + + # Lookup the request token + request_token = OAuthToken.gql("WHERE token_key=:key", key=oauth_token).get() + if request_token is None: + # We do not seem to have this request token, show an error. + print template.render('error.html', {'message': 'Invalid token!'}) + return + + # Rebuild the auth handler + auth = tweepy.OAuthHandler(CONSUMER_KEY, CONSUMER_SECRET) + auth.set_request_token(request_token.token_key, request_token.token_secret) + + # Fetch the access token + try: + auth.get_access_token(oauth_verifier) + except tweepy.TweepError, e: + # Failed to get access token + print template.render('error.html', {'message': e}) + return + + # So now we could use this auth handler. + # Here we will just display the access token key&secret + print template.render('oauth_example/callback.html', { + 'access_token': auth.access_token + }) + diff --git a/examples/appengine/oauth_example/main.html b/examples/appengine/oauth_example/main.html new file mode 100644 index 0000000..92ea389 --- /dev/null +++ b/examples/appengine/oauth_example/main.html @@ -0,0 +1,17 @@ + + + + Tweepy OAuth Example + + + +

Tweepy OAuth Example

+

Authorize Tweepy

+

Request token

+ + + + diff --git a/examples/appengine/oauth_example/models.py b/examples/appengine/oauth_example/models.py new file mode 100644 index 0000000..d76213b --- /dev/null +++ b/examples/appengine/oauth_example/models.py @@ -0,0 +1,6 @@ +from google.appengine.ext import db + +class OAuthToken(db.Model): + token_key = db.StringProperty(required=True) + token_secret = db.StringProperty(required=True) + diff --git a/examples/appengine/tweepy.zip b/examples/appengine/tweepy.zip new file mode 100644 index 0000000..3666b25 Binary files /dev/null and b/examples/appengine/tweepy.zip differ