Last active
August 29, 2015 14:05
-
-
Save takaya030/1417e3c6a8322ce846eb to your computer and use it in GitHub Desktop.
Perl script sending from Twitter to FriendFeed.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/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" | |
}); |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/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'); | |
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