Monday, May 23, 2011

UtahPolitics Retweeter

Phil Windley's Technometria | A Retweeting Twitterbot in Perl

#!/usr/bin/perl -w
use strict;

use Net::Twitter;
use DateTime;
use DateTime::Format::HTTP;
use Fcntl;
use SDBM_File;
use File::Copy;

my $dt = DateTime->now;
$dt->subtract( minutes => 60);

my $class = 'DateTime::Format::HTTP';
my $since = $class->format_datetime($dt);

my $today_string = $dt->strftime("%M");
my $seen_dir = "./seen";
my $seen_file = "$seen_dir/latest.db";
my $backup_file = "$seen_dir/$today_string.db";

# make a backup of the hash and open it
unless(-e "$backup_file.pag") {
copy("$seen_file.pag","$backup_file.pag");
copy("$seen_file.dir","$backup_file.dir");
}

my %seen;
tie %seen, "SDBM_File", $seen_file, O_CREAT|O_RDWR, 0644 ||
die "Can't link to $seen_file, $!\n";

# set your own username and password here
my $user = 'put_your_twitter_screenname_here';
my $password = 'put_your_password_here';

my $twit = Net::Twitter->new(
username=>$user,
password=>$password,
source => "Utah Politics Retweeter",
clientname=>"UtahPolitics ReTweeter");

# find replies
my $retweets = [];
my $twit_replies =
$twit->friends_timeline({since => $since, count=>100}) ;

foreach my $reply (@{ $twit_replies }) {
my $text = $reply->{'text'};
my $id = $reply->{'id'};
my $name = $reply->{'user'}->{'screen_name'};
print ".";
if($text =~ m/utahpolitics|#utpolitics/ &&
! $seen{$id}
){
unshift @{ $retweets},
{'name' => $name,
'id' => $id,
'text' => $text
} unless $name eq $user;
}
}

print "\n";

foreach my $retweet (@{ $retweets }) {
print ".";
my $status = "(@".$retweet->{'name'}.") ".
$retweet->{'text'};
my $code = $twit->update($status);
$seen{$retweet->{'id'}} = 1 if $code;
}

print "\n";

1;

No comments:

Post a Comment