Added appengine example for using oauth.
authorJosh Roesslein <jroesslein@gmail.com>
Sun, 20 Sep 2009 22:07:09 +0000 (17:07 -0500)
committerJosh Roesslein <jroesslein@gmail.com>
Sun, 20 Sep 2009 22:07:09 +0000 (17:07 -0500)
CHANGES
examples/appengine/app.py [new file with mode: 0644]
examples/appengine/app.yaml [new file with mode: 0644]
examples/appengine/error.html [new file with mode: 0644]
examples/appengine/index.yaml [new file with mode: 0644]
examples/appengine/oauth_example/__init__.py [new file with mode: 0644]
examples/appengine/oauth_example/callback.html [new file with mode: 0644]
examples/appengine/oauth_example/handlers.py [new file with mode: 0644]
examples/appengine/oauth_example/main.html [new file with mode: 0644]
examples/appengine/oauth_example/models.py [new file with mode: 0644]
examples/appengine/tweepy.zip [new file with mode: 0644]

diff --git a/CHANGES b/CHANGES
index 357a440c6b2cdd967c0980d7edb650bb165a29e3..bf68daafd3c2c3a44a7cdfe54c49713b8b63df7b 100644 (file)
--- 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 (file)
index 0000000..a1cf44b
--- /dev/null
@@ -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 (file)
index 0000000..6f9e636
--- /dev/null
@@ -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 (file)
index 0000000..417572a
--- /dev/null
@@ -0,0 +1,11 @@
+<html>
+
+    <head>
+        <title>Tweepy OAuth Example -- Error!</title>
+    </head>
+
+    <body>
+        <h1>{{message}}</h1>
+    </body>
+
+</html>
diff --git a/examples/appengine/index.yaml b/examples/appengine/index.yaml
new file mode 100644 (file)
index 0000000..a3b9e05
--- /dev/null
@@ -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 (file)
index 0000000..e69de29
diff --git a/examples/appengine/oauth_example/callback.html b/examples/appengine/oauth_example/callback.html
new file mode 100644 (file)
index 0000000..58bc2bd
--- /dev/null
@@ -0,0 +1,16 @@
+<html>
+
+    <head>
+        <title>Tweepy OAuth Example -- callback</title>
+    </head>
+
+    <body>
+        <h1>Success!</h1>
+        <h1>Access token</h1>
+        <ul>
+            <li><b>Key:</b> {{access_token.key}}</li>
+            <li><b>Secret:</b> {{access_token.secret}}</li>
+        </ul>
+    </body>
+
+</html>
diff --git a/examples/appengine/oauth_example/handlers.py b/examples/appengine/oauth_example/handlers.py
new file mode 100644 (file)
index 0000000..d9726dd
--- /dev/null
@@ -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 (file)
index 0000000..92ea389
--- /dev/null
@@ -0,0 +1,17 @@
+<html>
+
+    <head>
+        <title>Tweepy OAuth Example</title>
+    </head>
+
+    <body>
+        <h1>Tweepy OAuth Example</h1>
+        <h3><a href="{{authurl}}">Authorize Tweepy</a></h3>
+        <h3>Request token</h3>
+        <ul>
+            <li><b>Key:</b> {{request_token.key}}</li>
+            <li><b>Secret:</b> {{request_token.secret}}</li>
+        </ul>
+    </body>
+
+</html>
diff --git a/examples/appengine/oauth_example/models.py b/examples/appengine/oauth_example/models.py
new file mode 100644 (file)
index 0000000..d76213b
--- /dev/null
@@ -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 (file)
index 0000000..3666b25
Binary files /dev/null and b/examples/appengine/tweepy.zip differ