[UPDATE]
Apparently someone at Twitter was listening, or I’m going senile/blind. Let’s call it a combination of both.
Instead of following all the steps below, you could just login with the Twitter account you want to use on http://dev.twitter.com, register your application and then click ‘Edit Details’ on the application overview page at http://dev.twitter.com/apps. Next click the ‘Application detail’ button on the right, followed by the ‘My Access Token’ button in order to get your Access Token and Access Token Secret.
This makes the old post below rather obsolete. Clearly a case of me thinking everything is a nail and ruby is a hammer (don’t they usually say this about java coders?) 😉
[ORIGINAL POST]
OAuth is great! OAuth allows your application to use your user’s data without the need to ask for their password. So Twitter made the API much safer for their and your users. Hurray! Free pizza for everyone!
Unless of course you’re using the Twitter API for your own needs like running your own bot and don’t need access to other user’s data. In such cases a simple username/password combination is more than enough. I can understand however that the Twitter guys don’t really care that much about these exceptions(?). Most such uses for the API are probably rather spammy in nature.
!!! If you have a twitter app that uses the API to access external user’s data: look for another solution. This solution is ONLY meant when you ONLY need access to your own account(s) through the API.
Other Solutions
Mr Dallas Devries posted a solution here which involves requesting and scraping a one-time PIN.
But: I like to minimize the amount of calls I make to twitter’s API or pages to lessen my chances of meeting the fail whale. Also, as soon as the pin isn’t included in a div called
However, mr Devries’ post was a starting point for my solution, so I’m much obliged to him posting his findings.
Authenticating with the Twitter API: old vs new
Acessing The Twitter API the old way:
[sourcecode language=’ruby’]
require ‘twitter’
httpauth = Twitter::HTTPAuth.new(‘my_account’,’my_secret_password’)
client = Twitter::Base.new(httpauth)
client.update(‘Hurray!’)
[/sourcecode]
The OAuth way:
[sourcecode language=’ruby’]
require ‘twitter’
oauth = Twitter::OAuth.new(‘ve4whatafuzzksaMQKjoI’, ‘KliketyklikspQ6qYALcuNandsomemored8pQ6qYALIG7mbEQY’)
oauth.authorize_from_access(‘123-owhfmeyAgfozdyt5hDeprSevsWmPo5rVeroGfsthis’, ‘fGiinCdqtehMeehiddenymDeAsasaawgGeryye8amh’)
client = Twitter::Base.new(oauth)
client.update(‘Hurray!’)
[/sourcecode]
In the above case,
ve4whatafuzzksaMQKjoI is the ‘consumer key’ (sometimes also referred to as ‘consumer token’) and
KliketyklikspQ6qYALcuNandsomemored8pQ6qYALIG7mbEQY is the ‘consumer secret’. You’ll get these from Twitter when you register your app.
123-owhfmeyAgfozdyt5hDeprSevsWmPo5rVeroGfsthis is the ‘access token’ and
fGiinCdqtehMeehiddenymDeAsasaawgGeryye8amh is the ‘access secret’. This combination gives the registered application access to your account. I’ll show you how to obtain these by following the steps below.
(Basically you’ll need a bunch of keys and you’ll have to jump a bit through hoops to obtain them for your server/bot. )
How to get these keys
1. Surf to the twitter apps registration page
go to http://dev.twitter.com/apps to register your app. Login with your twitter account.
2. Register your application
Enter something for Application name, Description, website,… as I said: they make you jump through hoops.
If you plan on using the API to post tweets, Your application name and website will be used in the ‘5 minutes ago via…’ line below your tweet. You could use the this to point to a page with info about your bot, or maybe it’s useful for SEO purposes.
For application type I choose ‘browser’ and entered http://www.hadermann.be/callback as a ‘Callback URL’. This url returns a 404 error, which is ideal because after giving our account access to our ‘application’ (step 6), it will redirect to this url with an ‘oauth_token’ and ‘oauth_verifier’ in the url. We need to get these from the url. It doesn’t really matter what you enter here though, you could leave it blank because you need to explicitely specify it when generating a request token.
You probably want read&write access so set this at ‘Default Access type’.
3. Get your consumer key and consumer secret
On the next page, copy/paste your ‘consumer key’ and ‘consumer secret’. You’ll need these later on. You also need these as part of the authentication in your script later on:
[sourcecode language=’ruby’]
oauth = Twitter::OAuth.new([consumer key], [consumer secret])
[/sourcecode]
4. Obtain your request token
run the following in IRB to obtain your ‘request token’
Replace my fake consumer key and consumer secret with the one you obtained in step 3. And use something else instead http://www.hadermann.be/callback: although this will only give a 404, you shouldn’t trust me.
[sourcecode language=’ruby’]
irb(main):001:0> require ‘oauth’
irb(main):002:0> c = OAuth::Consumer.new(‘ve4whatafuzzksaMQKjoI’,
‘KliketyklikspQ6qYALcuNandsomemored8pQ6qYALIG7mbEQY’,
{:site => ‘http://twitter.com’})
irb(main):003:0> request_token = c.get_request_token(:oauth_callback => ‘http://www.hadermann.be/callback’)
irb(main):004:0> request_token.token
=> “UrperqaukeWsWt3IAlfbxzyBUFpwWIcWkHP94QH2C1”
[/sourcecode]
This (UrperqaukeWsWt3IAlfbxzyBUFpwWIcWkHP94QH2C1) is the request token: Copy/paste this token, you will need this next.
5. Authorize your application
surf to https://api.twitter.com/oauth/authorize?oauth_token=[the above token], for example:
https://api.twitter.com/oauth/authorize?oauth_token=UrperqaukeWsWt3IAlfbxzyBUFpwWIcWkHP94QH2C1
This will bring you to the ‘An application would like to connect to your account’- screen on Twitter where you can grant access to the app you just registered. If you aren’t still logged in, you need to login first. Click ‘Allow’. Unless you don’t trust yourself.
6. Get your oauth_verifier from the redirected url
Your browser will be redirected to your callback url, with an oauth_token and oauth_verifier parameter appended. You’ll need the oauth_verifier.
In my case the browser redirected to:
http://www.hadermann.be/callback?oauth_token=UrperqaukeWsWt3IAlfbxzyBUFpwWIcWkHP94QH2C1&oauth_verifier=waoOhKo8orpaqvQe6rVi5fti4ejr8hPeZrTewyeag
Which returned a 404, giving me the chance to copy/paste my oauth_verifier: waoOhKo8orpaqvQe6rVi5fti4ejr8hPeZrTewyeag
7. Request an access token
Back to irb, use the oauth_verifier to request an access token, as follows:
[sourcecode language=’ruby’]
irb(main):005:0> at = request_token.get_access_token(:oauth_verifier => ‘waoOhKo8orpaqvQe6rVi5fti4ejr8hPeZrTewyeag’)
irb(main):006:0> at.params[:oauth_token]
=> “123-owhfmeyAgfozdyt5hDeprSevsWmPo5rVeroGfsthis”
irb(main):007:0> at.params[:oauth_token_secret]
=> “fGiinCdqtehMeehiddenymDeAsasaawgGeryye8amh”
[/sourcecode]
We’re there!
123-owhfmeyAgfozdyt5hDeprSevsWmPo5rVeroGfsthis is the access token.
fGiinCdqtehMeehiddenymDeAsasaawgGeryye8amh is the access secret.
Try it!
Try the following to post an update:
[sourcecode language=’ruby’]
require ‘twitter’
oauth = Twitter::OAuth.new(‘ve4whatafuzzksaMQKjoI’, ‘KliketyklikspQ6qYALcuNandsomemored8pQ6qYALIG7mbEQY’)
oauth.authorize_from_access(‘123-owhfmeyAgfozdyt5hDeprSevsWmPo5rVeroGfsthis’, ‘fGiinCdqtehMeehiddenymDeAsasaawgGeryye8amh’)
client = Twitter::Base.new(oauth)
client.update(‘Cowabunga!’)
[/sourcecode]
Now you can go to your twitter page and delete the tweet if you want to.
February 3, 2011 at 11:40 pm
why do I got “jruby-1.5.3/lib/ruby/gems/1.8/gems/oauth-0.4.4/lib/oauth/signature/hmac/base.rb:12:in `digest’: wrong # of arguments(3 for 2) (ArgumentError)” when making the call:
request_token = c.get_request_token
thx,
Cindy
August 28, 2012 at 4:49 am
Your original post is still useful. I have 250 accounts I own that I post to automatically so having a way to get the access token and secret programatically is huge and I was able to follow your directions to get it going. I just parse out the oauth_verifier instead of the pin that I used to use from the authorize page and voila.