Permalink
Cannot retrieve contributors at this time
Join GitHub today
GitHub is home to over 28 million developers working together to host and review code, manage projects, and build software together.
Sign up
Fetching contributors…
| #!/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; |