Skip to content

Instantly share code, notes, and snippets.

@tatsuyaueda
Created September 5, 2012 07:27
Show Gist options
  • Save tatsuyaueda/3632604 to your computer and use it in GitHub Desktop.
Save tatsuyaueda/3632604 to your computer and use it in GitHub Desktop.
Twitter RT Script
#!/usr/local/bin/perl -wT
#binmode(STDOUT, ":utf8");
use strict;
use Encode;
use Net::Twitter;
use URI::Escape;
use LWP::Simple;
use XML::DOM;
# Config
my $user = ''; # Twitter のユーザー名
my $key = ''; # Consumer key
my $secret = ''; # Consumer secret
my $token = ''; # Access Token
my $tsecret = ''; # Access Token Secret
my $lang = 'ja';
my $api = 'http://search.twitter.com/search.atom';
# do not need to edit
my $max_length = 140;
my $home;
if (-d $ENV{'HOME'} && $ENV{'HOME'} =~ /^(\/.+)$/) {
$home = $1;
}
my $log = '/tmp/.twitbot.txt'; # 最新のIDを保存して次回以降はこのID以下は無視
if (!-e $log) {
open (OUT, ">", $log);
close(OUT);
}
my $max_id = 0;
open (IN, "<", $log);
my $n = <IN>;
if ($n) {
chomp $n;
$max_id = $n;
}
close(IN);
# connect to twitter
my $twt = Net::Twitter->new(
traits => [qw/API::REST OAuth WrapError/],
consumer_key => $key,
consumer_secret => $secret
);
$twt->access_token ($token);
$twt->access_token_secret($tsecret);
my $sch = $twt->saved_searches();
my %posted;
my $since = $max_id;
foreach (@$sch) {
my $k = uri_escape_utf8($_->{query});
my $url = $api.'?show_user=true&q='.$k.'&lang='.$lang;
my $atom = get($url);
my $parser = new XML::DOM::Parser;
my $doc = $parser->parse ($atom);
my $nodes = $doc->getElementsByTagName ("entry");
for (my $i=0; $i<$nodes->getLength; $i++) {
my $node = $nodes->item($i);
my $txt = getvalue($node, 'title');
my $id = getvalue($node, 'id');
if ($id =~ /([0-9]+)$/) {
$id = $1;
} else {
die ('can not get id');
}
if ($max_id < $id) {
$max_id = $id;
}
# 以下に該当するものはRTしない
# 自分の投稿
# RT(スペース)が含まれる投稿
# @が含まれる投稿
# すでにRTした投稿
# ログに保存されたIDより古い投稿
if ($txt !~ /^$user/ && $txt !~ /RT\s/ && $txt !~ /\@/ && !$posted{$id} && $since < $id) {
$posted{$id} = 1; # 重複投稿しないためのフラグ
eval {$twt->retweet($id)};
if ($@) {
warn "update failed because: ".$@."\n";
}
}
}
}
open (OUT, ">", $log);
print OUT $max_id;
close(OUT);
exit;
sub getvalue {
my $node = shift @_;
my $tag = shift @_;
my $n = $node->getElementsByTagName($tag)->item(0);
return $n->getFirstChild->getNodeValue;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment