Skip to content

Instantly share code, notes, and snippets.

@soh335
Created October 15, 2011 16:02
Show Gist options
  • Save soh335/1289764 to your computer and use it in GitHub Desktop.
Save soh335/1289764 to your computer and use it in GitHub Desktop.
#!/usr/bin/env perl
use strict;
use warnings;
use utf8;
use AnyEvent::Twitter::Stream;
use Config::Pit;
use Net::Twitter::Lite;
use AnyEvent::WebService::ImKayac;
use YAML::Tiny;
use Regexp::Assemble;
use FindBin;
use Log::Minimal;
my $twitter_config = pit_get('twitter.com', require => {
consumer_key => 'consumer_key',
consumer_secret => 'consumer_secret',
token => 'token',
token_secret => 'token_secret',
});
my $im_config = pit_get('im.kayac.com', require => {
user => 'user',
secret_key => 'secret_key',
});
my $screen_name = do {
Net::Twitter::Lite->new(
%$twitter_config,
access_token => $twitter_config->{token},
access_token_secret => $twitter_config->{token_secret},
)->verify_credentials->{screen_name};
};
my $im = AnyEvent::WebService::ImKayac->new(
%{$im_config},
type => 'secret'
);
my $yaml = YAML::Tiny->read("$FindBin::Bin/config.yml") or die "not exist config.yml";
my $regexp = Regexp::Assemble->new->track->add(@{$yaml->[0]->{keywords}});
my $cv = AE::cv;
my $listener = AnyEvent::Twitter::Stream->new(
%$twitter_config,
method => 'userstream',
on_tweet => sub {
my ($tweet) = @_;
# Retweet
if (my $retweet = $tweet->{retweeted_status}) {
if ($retweet->{user}{screen_name} eq $screen_name) {
my $from = $tweet->{user}{screen_name};
my $text = $retweet->{text};
notify( "Retweet from \@$from: $text", $tweet );
}
}
else {
# Mention
for my $mention (@{ $tweet->{entities}{user_mentions} }) {
if ($mention->{screen_name} eq $screen_name) {
my $from = $tweet->{user}{screen_name};
my $text = $tweet->{text};
notify( "Mention from \@$from: $text", $tweet );
return;
}
}
# Keyword
if ( $tweet->{user}{screen_name} ne $screen_name and $regexp->match($tweet->{text}) ) {
my $from = $tweet->{user}{screen_name};
my $text = $tweet->{text};
notify( "Keyword from \@$from: $text", $tweet );
}
}
},
on_event => sub {
my ($tweet) = @_;
my $event = $tweet->{event};
my $from = $tweet->{source}{screen_name};
my $target = $tweet->{target_object} ? $tweet->{target_object}{text} : '';
return if $from eq $screen_name;
notify( "$event from \@$from: $target", $tweet->{target_object} );
},
on_connect => sub {
infof "on connect";
},
on_delete => sub {},
on_friends => sub {},
on_eof => sub {
warnf "on_eof: @_";
$cv->send;
},
on_error => sub {
warnf "on_error: @_";
$cv->send;
},
);
$cv->recv;
sub notify {
my ($msg, $tweet) = @_;
$msg =~ s/</>/g;
$msg =~ s/&gt;/</g;
infof $msg;
my $url = "http://twitter.com/#!/$tweet->{user}{screen_name}/status/$tweet->{id}";
$im->send( message => $msg, handler => $url, cb => sub {
my $res = shift;
warnf $res->{error} unless $res->{result} eq 'posted';
});
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment