I've uploaded a scaffolding app as example of authentication with
twitter oauth. You can find source code here:
https://code.google.com/r/michelecomitini-facebookaccess/source/browse/#hg/applications/helloTwitter
Or you can clone the repository locally:
https://code.google.com/r/michelecomitini-facebookaccess/source/checkout
as usual it is also on GAE for testing:
http://grafbook.appspot.com/helloTwitter
Please enjoy and send feedback.
tnx
michele
Things are simple even without external libraries, look for instance
at the get_user method in db.py, how it gets user info:
http://code.google.com/r/michelecomitini-facebookaccess/source/browse/applications/helloTwitter/models/db.py#81
def get_user(self):
if self.accessToken() is not None:
client = oauth.Client(self.consumer, self.accessToken())
resp, content =
client.request('http://api.twitter.com/1/account/verify_credentials.json')
if resp['status'] != '200':
# cannot get user info. should check status
return None
u = json.loads(content)
return dict(username=u['screen_name'], name=u['name'],
registration_id=u['id'])
so you build a client, make a request to a REST api url
(http://api.twitter.com/1/account/verify_credentials.json)
To post a tweet see: http://dev.twitter.com/doc/post/statuses/update
in your controller you should write something like this:
import oauth2 as oauth
.
.
.
@auth.requires_login()
def sendtweet():
token = auth.settings.login_form.accessToken() # you can use this
also if you prefer: token=session.access_token
consumer = oauth.Consumer(CLIENT_ID, CLIENT_SECRET) #<- CLIENT_ID,
CLIENT_SECRET are defined in db.py
client = oauth.Client(self.consumer, token)
# encode the message
message = 'My web2py post!"
data=urlencode(status=message)
#make a post
resp, content =
client.request('http://api.twitter.com/1/statuses/update.json',
"POST", body=data)
if resp['status'] != '200':
#manage the error
return dict(message="Could not send tweet! :-( ")
return dict(message="Succesfully sent! :-)")
if you call method returning some data I suggest tu use the .json
version of it and use
simplejson to decode it to a python dictionary (see the get_user() method above)
hope that helps...
mic
2010/8/30 Albert Abril <albert...@gmail.com>:
Traceback (most recent call last):
File "gluon/restricted.py", line 186, in restricted
exec ccode in environment
File "/home/aabril/webapps/dcide4me/web2py/applications/helloTwitter/models/db.py", line 72, in <module>
toa = local_import('twitter_oauth_data')
File "gluon/compileapp.py", line 243, in <lambda>
local_import_aux(name,reload,app)
File "gluon/compileapp.py", line 174, in local_import_aux
module = __import__(name)
ImportError: No module named applications.helloTwitter.modules.twitter_oauth_data
CLIENT_ID |
CLIENT_SECRET |
AUTH_URL |
TOKEN_URL |
ACCESS_TOKEN_URL |
sorry for late answering...
just go on http://developer.twitter.com and register an application.
After that you get the CLIENT_ID and CLIENT_SECRET, TOKEN_URL and
ACCESS_TOKEN_URL from twitter.
define those variables in a file called twitter_oauth_data.py in
modules dir under your application and keep the file *secret*.
After that any user that authenticates with the application will be
redirected to twitter and twitter will let
your application act on behalf of the user. You do not have to ask
any secret from the user!
For more info on how twitter authenticates see http://oauth.net
michele
2010/9/5 Yannick <ytcha...@gmail.com>:
mic
2010/9/6 Albert Abril <albert...@gmail.com>:
I fully agree with the article except on the fact that OAuth2.0 will
solve all problems, OAuth2.0 is simpler (less weird options) so will
solve problems with application bugs, but I fear that problems with
the flow (such as phishing) could persist.
Aside from twitter's own problems the goal of web2py's oauth1.0a
implementation is to stick as much to the RFC, not twitter's.
Please remember that a *web2py application package distribution must
not contain secrets of any sort!*.
Since web2py is not a "desktop" application there is *no need to
distribute secrets* to third parties.
I think that web2py allowed to make a very simple implementation, so
bugs should be kept to a minimum, and code is less
than 400 lines, so anyone can read it and find errors.
tnx
mic
2010/9/11 Jonathan Lundell <jlun...@pobox.com>: