Skip to content

Instantly share code, notes, and snippets.

@takaya030
Last active August 29, 2015 14:05
Show Gist options
  • Save takaya030/1417e3c6a8322ce846eb to your computer and use it in GitHub Desktop.
Save takaya030/1417e3c6a8322ce846eb to your computer and use it in GitHub Desktop.
Perl script sending from Twitter to FriendFeed.
#!/usr/bin/perl
use strict;
use warnings;
use Config::Pit;
Config::Pit::set( "twitter.com", data => {
"consumer_key" => "your consumer key on api.twitter.com",
"consumer_select" => "your consumer select on api.twitter.com"
});
#!/usr/bin/perl
use strict;
use warnings;
use HTTP::Request::Common;
use LWP::UserAgent;
use Net::Twitter::Lite::WithAPIv1_1;
use DateTime;
#use Encode;
#use XML::XPath;
use Time::HiRes qw(sleep);
use Config::Pit;
#use Data::Dumper;
# argv
if( ($#ARGV < 2) || (4 < $#ARGV) )
{
die "Usage: twitter2ff.pl twitter_user_name start_page num_pages [ff_room] [since_id]\n";
}
my $twitter_user = $ARGV[0];
my $start_page = $ARGV[1]; # 0 is recent page.
my $num_page = $ARGV[2];
my $room = $ARGV[3] if($#ARGV >= 3);
my $since_id = $ARGV[4] if($#ARGV >= 4);
# FriendFeed account info
my $ff_conf = pit_get("friendfeed.com", require => {
"username" => "your username on friendfeed",
"remotekey" => "your remotekey on friendfeed.com API" # https://friendfeed.com/account/api
});
# Twitter API account info
my $tw_conf = pit_get("twitter.com", require => {
"consumer_key" => "your consumer key on api.twitter.com",
"consumer_secret" => "your consumer secret on api.twitter.com",
"access_token" => "your access token on api.twitter.com",
"access_token_secret" => "your access token secret on api.twitter.com",
});
# UserAgent for posting to FriendFeed
my $ua = LWP::UserAgent->new;
$ua->default_header('Content_Type' => 'text/plain; charset=UTF-8');
# Twitter
my $twit = Net::Twitter::Lite::WithAPIv1_1->new(
consumer_key => $tw_conf->{consumer_key},
consumer_secret => $tw_conf->{consumer_secret},
access_token => $tw_conf->{access_token},
access_token_secret => $tw_conf->{access_token_secret},
legacy_lists_api => 0
);
# post to FriendFeed
while( $num_page > 0 )
{
my $statuses = $twit->user_timeline( {
id => $twitter_user,
page => $start_page,
trim_user => 1,
include_rts => 1,
defined $since_id ? ('since_id' => $since_id) : ()
});
foreach my $status ( reverse(@$statuses) )
{
my $twst = CTwitterStatus->new( $status, $twitter_user );
if( $room eq "debug" )
{
$twst->debug_print();
print "\n";
}
else
{
my $req = $twst->get_request_obj( $room );
$req->authorization_basic($ff_conf->{username}, $ff_conf->{remotekey});
my $res = $ua->request($req);
print $res->as_string, "\n";
if( !$res->is_success )
{
die $res->status_line, "\n";
}
sleep(15);
}
}
$num_page--;
$start_page--;
}
exit(0);
#--------------------------------------------
sub conv_iso8601 {
my ($timestamp, $tz) = @_;
my ($weekday, $monthname, $day, $time, $timezone, $year) = split /\s+/ => $timestamp;
my ($hour, $minute, $second) = split /:/ => $time;
my %month = (
Jan => 1, Feb => 2, Mar => 3, Apr => 4,
May => 5, Jun => 6, Jul => 7, Aug => 8,
Sep => 9, Oct => 10, Nov => 11, Dec => 12,
);
# FIXME: Time::Piece? HTTP::Date?
my $dt = DateTime->new(
year => $year,
month => $month{$monthname},
day => $day,
hour => $hour,
minute => $minute,
second => $second,
time_zone => $timezone
);
$dt->set_time_zone( $tz ) if $tz;
# iso8601 format
return $dt->iso8601;
}
#--------------------------------------------
#
# Definition utility classes
#
# Class of Twitter Status
{
package CTwitterStatus;
sub new
{
my $class = shift;
my $status = shift; # status of Net::Twitter::Lite
my $user_name = shift;
my $self = {};
$self->{created_at} = main::conv_iso8601( $status->{created_at}, "Asia/Tokyo" );
$self->{id} = $status->{id};
$self->{text} = $status->{text};
$self->{user_name} = $user_name;
bless $self,$class;
}
sub get_date_str
{
my $self = shift;
return $self->{created_at};
}
sub get_status_url
{
my $self = shift;
return "http://twitter.com/#!/" . $self->{user_name} . "/status/" . $self->{id};
}
sub get_comment_str
{
my $self = shift;
my $str = "date: " . $self->get_date_str();
$str .= " status_id: " . $self->{id};
return $str;
}
sub get_request_obj
{
my $self = shift;
my $room = shift;
my $body = $self->{text};
my $link = $self->get_status_url();
my $comment = $self->get_comment_str();
my $req = HTTP::Request::Common::POST('http://friendfeed.com/api/share',
Content => [
'title' => $body,
'link' => $link,
'comment' => $comment,
defined $room ? ('room' => $room) : ()
]);
return $req;
}
sub debug_print
{
my $self = shift;
print "created_at : ", $self->{created_at}, "\n";
print "id : ", $self->{id}, "\n";
print "text : ", $self->{text}, "\n";
print "status url : ", $self->get_status_url(), "\n";
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment