Created
September 5, 2012 07:27
-
-
Save tatsuyaueda/3632604 to your computer and use it in GitHub Desktop.
Twitter RT Script
This file contains hidden or 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/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