読者です 読者をやめる 読者になる 読者になる

NeverBlog::Likk::Unexistable;

見なかったことにして下さい

ターミナルからTwissrを使う

Twissr via TwitterとWassrのタイムラインを合成するだけの簡単なモジュールを作ってみた - すぎゃーんメモ

Sabotterっぽく、TwitterWassrのタイムラインを合わせて出力したり、両方に同時にポストしたりするためのモジュールです。

という事で早速使ってみるのみならず、常に最新タイムラインが表示されつつPOSTできるスクリプトterm_twissr.pl書いてみた。
あ、Config::Pit 超絶無視してます。

#!/usr/local/bin/perl
use strict;
use warnings;
use Getopt::Long;
use List::MoreUtils qw(any);
use Net::Wassr;
use Net::Twitter;
use Net::Twissr;

Getopt::Long::GetOptions(
    '-d'  => \my $daemon,
    '-u=s'=> \my $update,
    '-t'  => \my $term,
);
my $wassr = Net::Wassr->new(
  'user' => '*****',
  'passwd' => '*****',
);
my $twitter = Net::Twitter->new(
  'username' => '*****',
  'password' => '*****',
);
my $twissr = Net::Twissr->new(twitter => $twitter,wassr => $wassr,);
local $| = 1;
local $\ = "\n";

our $syscom = {
  quit => ['exit','quit','!q','!quit'],
};

my $lastymd = 0;

if ($daemon) {
  FORK: {
    if(my $pid = fork()) {
      while(1){
        main_timeline();
        sleep ($term || 60);
      }
    }elsif (defined $pid){
      while(my $in = <STDIN>||''){
        chomp $in;
        last if(any{ $in eq $_ } @{$syscom->{quit}});
        cmd_io($in);
      }
      kill 9 ,$pid;
      exit(0);
    }else{
      die "Can't fork: $\n";
    }
  }
}else{
  if($update){
    cmd_io($update);
  }else{
    main_timeline();
  }
}
exit(0);
#=============================================================================================
sub cmd_io{
  my $in = shift;

  if($in =~ m{^!w(?:assr)?\s(.*)$})
  {
    my $in = $1 ||'';
    my $args = {
        status => $in,
    };
    $wassr->update($args) or die($!);
    return 1;
  }
  elsif($in =~ m{^!t(?:witter)?\s(.*)$})
  {
    my $in = $1 ||'';
    $twitter->update($in) or die($!);
    return 1;
  }
  elsif($in =~ m{^!res(?:s)?\s(\w{10})\s(.*)$})
  {
    my $in = $2 ||'';
    my $rid = $1 || '';
    my $args = {
        reply_status_rid => $rid,
        status => $in,
      };
    $wassr->update($args) or die($!);
    return 1;
  }
  elsif($in =~ m{^!})
  {
    warn ("! method misspell:$in");
    return 1;
  }
  elsif($in ne '')
  {
    $twissr->update($in) or die($!);
    return 1;
  }
}

sub main_timeline{
  my $timeline = $twissr->friends_timeline();
  for(sort { $a->{time} <=> $b->{time} } @$timeline){
    my @t = localtime($_->{time});
    my $yyyymmdd_24hmiss = sprintf("%04d/%02d/%02d %02d:%02d:%02d", $t[5] + 1900, $t[4]+1, $t[3], $t[2], $t[1], $t[0]);
    if($_->{time} > $lastymd){
      my $log = "$yyyymmdd_24hmiss $_->{service} $_->{user_id}: $_->{text} ($_->{id})";
      utf8::encode $log;
      print $log;
      $lastymd = $_->{time};
    }
  }
}
  • d 付きで永続起動
  • c で一回こっきり実効
  • t が -d を指定したさいのtimelineの更新間隔(秒)

使用時のイメージは以下な感じ http://wassr.jp/user/likk/statuses/pu31wEd7yi

きちっと書いたら Net-Twassr/trunk/example 辺りに掘って置くかも