Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Save audy/23a4ca985468bafce60018fa0fbfa893 to your computer and use it in GitHub Desktop.
Save audy/23a4ca985468bafce60018fa0fbfa893 to your computer and use it in GitHub Desktop.
sinatra twitter client with oauth
# sinatra twitter client with oauth
require 'rubygems'
require 'sinatra'
# use http://github.com/moomerman/twitter_oauth gem
# gem sources -a http://gems.github.com
# gem install moomerman-twitter_oauth
require 'twitter_oauth'
# use memcached based session
use Rack::Session::Memcache
set :host, 'localhost'
set :port, '4567'
before do
@consumer_key = '<INSERT APP KEY>'
@consumer_secret = '<INSERT APP SECRET>'
end
get '/' do
if !has_access?
session_clear()
"<p><a href='/login'><img src='http://apiwiki.twitter.com/f/1242697715/Sign-in-with-Twitter-darker.png' /></a></p>"
else
client = get_client()
if client.authorized?
list = "<div>"
client.user_timeline.each do |tweet|
list << "<p><strong>#{tweet['user']['screen_name']}:</strong> #{tweet['text']}</p>"
end
list << "</div>"
form = "<form action='/send' method='post'><label>What are you doing?</label><br /><textarea name='text'></textarea><br /><input type='submit' value='update' /></form>"
return form + list + "<p><a href='/logout'>logout</a></p>"
else
session_clear()
"<p>not authorized!</p><p><a href='/login'><img src='http://apiwiki.twitter.com/f/1242697715/Sign-in-with-Twitter-darker.png' /></a></p>"
end
end
end
get '/login' do
if session['token'].nil? && session['secret'].nil? && session['url'].nil?
client = get_client()
@request_token = client.request_token(:oauth_callback => "http://#{options.host}:#{options.port}/callback")
session['token'] = @request_token.token
session['secret'] = @request_token.secret
session['url'] = @request_token.authorize_url
end
redirect session['url']
end
get '/callback' do
begin
client = get_client()
access_token = client.authorize(
session['token'],
session['secret'],
:oauth_verifier => params[:oauth_verifier]
)
session['access_token'] = access_token.token
session['access_secret'] = access_token.secret
redirect '/'
rescue OAuth::Unauthorized
session_clear()
redirect '/'
end
end
post '/send' do
if has_access?
client = get_client()
else
redirect '/sent?err=1'
end
if client.authorized?
client.update(params[:text])
redirect '/sent'
else
redirect '/sent?err=1'
end
end
get '/sent' do
if params[:err] == '1'
"your tweet was not sent!<br /><a href='/'>back</a>"
else
"your tweet was sent!<br /><a href='/'>back</a>"
end
end
get '/logout' do
session_clear()
redirect '/'
end
def has_access?
return session['access_token'] && session['access_secret']
end
def get_client()
if !has_access?
TwitterOAuth::Client.new(
:consumer_key => @consumer_key,
:consumer_secret => @consumer_secret)
else
TwitterOAuth::Client.new(
:consumer_key => @consumer_key,
:consumer_secret => @consumer_secret,
:token => session['access_token'],
:secret => session['access_secret'])
end
end
def session_clear
# yes, I don't know clean session :/
session['token'] = nil
session['secret'] = nil
session['url'] = nil
session['access_token'] = nil
session['access_secret'] = nil
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment