App::Maisha::Plugin::Twitter - Maisha interface to Twitter


App-Maisha documentation Contained in the App-Maisha distribution.

Index


Code Index:

NAME

Top

App::Maisha::Plugin::Twitter - Maisha interface to Twitter

SYNOPSIS

Top

   maisha
   maisha> use Twitter
   use ok

DESCRIPTION

Top

App::Maisha::Plugin::Twitter is the gateway for Maisha to access the Twitter API.

METHODS

Top

Constructor

* new

Process Methods

* login

Login to the service. See Authentication below.

API Methods

The API methods are used to interface to with the Twitter API.

* api_follow
* api_unfollow
* api_user
* api_user_timeline
* api_friends
* api_friends_timeline
* api_public_timeline
* api_followers
* api_update
* api_replies
* api_send_message
* api_direct_messages_to
* api_direct_messages_from

AUTHENTICATION

Top

On 31st August 2010, Twitter disabled Basic Authentication to access their API. Instead they have introduce the OAuth method of authrntication, which now requires application developers to request the user to authenticate themselves and provide a PIN (Personal Identification Number) to allow the application to retrieve access tokens.

With this new method of authentication, the application will provide a URL, which the user needs to cut-n-paste into a browser to logging in to the service, using your regular username/password, then 'Allow' Maisha to access your account. This will then allow Maisha to post to your account. You will then be given a PIN, which should then be entered at the prompt on the Maisha command line.

Once you have completed authentication, the application will then store your access tokens permanently under your profile on your computer. Then when you next use the application it will retrieve these access tokens automatically and you will no longer need to register the application.

SEE ALSO

Top

For further information regarding the commands and configuration, please see the 'maisha' script included with this distribution.

App::Maisha

Net::Twitter

WEBSITES

Top

* Main Site: http://maisha.grango.org =item * Git Repo: http://github.com/barbie/maisha/tree/master =item * RT Queue: RT: http://rt.cpan.org/Public/Dist/Display.html?Name=App-Maisha

AUTHOR

Top

  Copyright (c) 2009-2010 Barbie <barbie@cpan.org> for Grango.org.

LICENSE

Top

  This program is free software; you can redistribute it and/or modify it
  under the same terms as Perl itself.

  See http://www.perl.com/perl/misc/Artistic.html


App-Maisha documentation Contained in the App-Maisha distribution.

package App::Maisha::Plugin::Twitter;

use strict;
use warnings;

our $VERSION = '0.15';

#----------------------------------------------------------------------------
# Library Modules

use base qw(App::Maisha::Plugin::Base);
use base qw(Class::Accessor::Fast);
use File::Path;
use Net::Twitter;
use Storable;

#----------------------------------------------------------------------------
# Accessors

__PACKAGE__->mk_accessors($_) for qw(api users);

#----------------------------------------------------------------------------
# Public API

#Request token URL
#https://api.twitter.com/oauth/request_token

#Access token URL
#https://api.twitter.com/oauth/access_token

#Authorize URL
#https://api.twitter.com/oauth/authorize

# http://dev.twitter.com/apps/347040

sub new {
    my $class = shift;
    my $self = {
        consumer_key    => 'ifCuNOQXA5KTnKVXVcZg',
        consumer_secret => 'OXyHE1PSgfy66gbCu3QshXgP9RNA1fOVLdqv4afPDug',
    };

    bless $self, $class;
    return $self;
}

sub login {
    my ($self,$config) = @_;

    unless($config->{username}) { warn "No username supplied\n"; return }

    my $api = Net::Twitter->new(
#        traits              => [qw/API::REST OAuth WrapError/],
        traits              => [qw/API::REST OAuth/],
        consumer_key        => $self->{consumer_key},
        consumer_secret     => $self->{consumer_secret},
        ssl                 => 1
    );

    unless($api) {
        warn "Unable to establish connection to Twitter API\n";
        return 0;
    }

    # for testing purposes we don't want to login
    if(!$config->{test}) {
        my $datafile = $config->{home} . '/.maisha/twitter.dat';
        my $access_tokens = eval { retrieve($datafile) } || {};

        if ( $access_tokens && $access_tokens->{$config->{username}}) {
            $api->access_token($access_tokens->{$config->{username}}->[0]);
            $api->access_token_secret($access_tokens->{$config->{username}}->[1]);
        }
        else {
            my $auth_url = $api->get_authorization_url;
            print " Authorize this application at: $auth_url\nThen, enter the PIN# provided to continue: ";

            my $pin = <STDIN>; # wait for input
            chomp $pin;

            # request_access_token stores the tokens in $nt AND returns them
            my @access_tokens = $api->request_access_token(verifier => $pin);
            $access_tokens->{$config->{username}} = \@access_tokens;

            mkpath( $config->{home} . '/.maisha' );

            # save the access tokens
            store $access_tokens, $datafile;
        }
    }

    $self->api($api);

    if(!$config->{test}) {
        print "...building user cache for Twitter\n";
        $self->_build_users();
    }

    return 1;
}

sub _build_users {
    my $self = shift;
    my %users;

    my $f = $self->api->friends();
    if($f && @$f)   { for(@$f) { next unless($_); $users{$_->{screen_name}} = 1 } }
    $f = $self->api->followers();
    if($f && @$f)   { for(@$f) { next unless($_); $users{$_->{screen_name}} = 1 } }

    $self->users(\%users);
}

sub api_update {
    my $self = shift;
    $self->api->update(@_);
}

sub api_user {
    my $self = shift;
    $self->api->show_user(@_);
}

sub api_user_timeline {
    my $self = shift;
    $self->api->user_timeline(@_);
}

sub api_friends {
    my $self = shift;
    $self->api->friends();
}

sub api_friends_timeline {
    my $self = shift;
    $self->api->friends_timeline();
}

sub api_public_timeline {
    my $self = shift;
    $self->api->public_timeline();
}

sub api_followers {
    my $self = shift;
    $self->api->followers();
}

sub api_replies {
    my $self = shift;
    $self->api->replies();
}

sub api_send_message {
    my $self = shift;
    $self->api->new_direct_message(@_);
}

sub api_direct_messages_to {
    my $self = shift;
    $self->api->direct_messages();
}

sub api_direct_messages_from {
    my $self = shift;
    $self->api->sent_direct_messages();
}

sub api_follow {
    my $self = shift;
    $self->api->create_friend(@_);
}

sub api_unfollow {
    my $self = shift;
    $self->api->destroy_friend(@_);
}

1;

__END__