#!/usr/bin/perl # # Net::Twitter - OAuth webapp example # package MyWebApp; use warnings; use strict; use base qw/HTTP::Server::Simple::CGI/; use Net::Twitter; use Data::Dumper; # You can replace the consumer tokens with your own; # these tokens are for the Net::Twitter example app. my %consumer_tokens = ( consumer_key => 'v8t3JILkStylbgnxGLOQ', consumer_secret => '5r31rSMc0NPtBpHcK8MvnCLg2oAyFLx5eGOMkXM', ); my $server_port = 8080; sub twitter { shift->{twitter} ||= Net::Twitter->new(traits => [qw/API::RESTv1_1/], %consumer_tokens) } my %dispatch = ( '/oauth_callback' => \&oauth_callback, '/' => \&my_last_tweet, ); # all request start here sub handle_request { my ($self, $q) = @_; my $request = $q->path_info; warn "Handling request for $request\n"; my $handler = $dispatch{$request} || \¬_found; $self->$handler($q); } # Display the authenicated user's last tweet in all its naked glory sub my_last_tweet { my ($self, $q) = @_; # if the user is authorized, we'll get access tokens from a cookie my %sess = $q->cookie('sess'); unless ( exists $sess{access_token_secret} ) { warn "User has no access_tokens\n"; return $self->authorize($q); } warn <<""; Using access tokens: access_token => $sess{access_token} access_token_secret => $sess{access_token_secret} my $nt = $self->twitter; # pass the access tokens to Net::Twitter $nt->access_token($sess{access_token}); $nt->access_token_secret($sess{access_token_secret}); # attempt to get the user's last tweet my $status = eval { $nt->user_timeline({ count => 1 }) }; if ( $@ ) { warn "$@\n"; # if we got a 401 response, our access tokens were invalid; get new ones return $self->authorize($q) if $@ =~ /\b401\b/; # something bad happened; show the user the error $status = $@; } print $q->header(-nph => 1), $q->start_html, $q->pre(Dumper $status), $q->end_html; } # send the user to Twitter to authorize us sub authorize { my ($self, $q) = @_; my $auth_url = $self->twitter->get_authorization_url(callback => "$ENV{SERVER_URL}oauth_callback"); # we'll store the request tokens in a session cookie my $cookie = $q->cookie(-name => 'sess', -value => { request_token => $self->twitter->request_token, request_token_secret => $self->twitter->request_token_secret, }); warn "Sending user to: $auth_url\n"; print $q->redirect(-nph => 1, -uri => $auth_url, -cookie => $cookie); } # Twitter returns the user here sub oauth_callback { my ($self, $q) = @_; my $request_token = $q->param('oauth_token'); my $verifier = $q->param('oauth_verifier'); my %sess = $q->cookie(-name => 'sess'); die "Something is horribly wrong" unless $sess{request_token} eq $request_token; $self->twitter->request_token($request_token); $self->twitter->request_token_secret($sess{request_token_secret}); warn <<""; User returned from Twitter with: oauth_token => $request_token oauth_verifier => $verifier # exchange the request token for access tokens my @access_tokens = $self->twitter->request_access_token(verifier => $verifier); warn <<""; Exchanged request tokens for access tokens: access_token => $access_tokens[0] access_token_secret => $access_tokens[1] # we'll store the access tokens in a session cookie my $cookie = $q->cookie(-name => 'sess', -value => { access_token => $access_tokens[0], access_token_secret => $access_tokens[1], }); warn "redirecting newly authorized user to $ENV{SERVER_URL}\n"; print $q->redirect(-nph => 1, -uri => "$ENV{SERVER_URL}", -cookie => $cookie); } # display a 404 Not found for any request we don't expect sub not_found { my ($self, $q) = @_; print $q->header(-nph => 1, -type => 'text/html', -status => '404 Not found'), $q->start_html, $q->h1('Not Found'), $q->p('You appear to be lost. Try going home.'); } my $app = MyWebApp->new($server_port); $app->run;