なんとなくNet::Twitter関連を調べてみた

kujoo2009-04-27



こことかここの影響でbot作りたいとか考えてるのかも。


しかし、Twitter API 仕様書 日本語訳とかNet::Twitterのドキュメントを読む気は無いのでしたー。(やる気ねーと言われても否定できない!


ちなみに私の実験環境はさくらインターネットのスタンダードプラン。
localにcpanをインストールしてます。

PATH通したりPERL5LIBを設定したりしてますが、シェルログインして実行する時しかこれらの環境変数の設定が生きないような。なので、

use lib qw(/home/ユーザー名/local/lib/perl5);

みたいに指定しています。(下記のソースでは省略)

これってイチイチ指定しないといけないのかなー。ちょっとめんどい。


更新

とりあえず、post(update)する方法。

#!perl
use strict;
use warnings;
use Net::Twitter;

 my $twit = Net::Twitter->new(
  username => 'twittername', # name
  password => 'twitterpswd', # password
 );
 $twit->update($_) for @ARGV; # パラメータを投稿(utf-8環境で実行を想定)

 exit;

まんま「実用! PerlでコマンドラインからTwitter投稿 - perl-mongers.org」から持ってきてますけどw

まー、基本なので・・・。


メールから更新

そんでメールドリブンの処理の練習として、メールから更新する方法。
さくらインターネットの環境だとメールサーバーがあるのでそれを利用します。

メール受信時にプログラムを実行する方法は「メール < Wiki | さくらのレンタルサーバ非公式FAQ」から。

cc "| perl /home/ユーザー名/local/なんとか.pl"

みたいに設定しています。(最初 perl を書き忘れてエラーになってたw


実行するコードは以下。

#!perl
use strict;
use warnings;
use utf8;
use Encode;
use Encode::Guess qw(shiftjis euc-jp 7bit-jis);
 binmode STDIN, ":bytes";
 binmode STDOUT, ":utf8";
use Net::Twitter;

 my $twit = Net::Twitter->new(
  username => 'twittername', # name
  password => 'twitterpswd', # password
 );
 my $flag;
 my $msg;

 while(<STDIN>) {
  my $line = decode('Guess', $_);
  $line =~ s/\r\n/\n/g;
  $line =~ s/\r/\n/g;
  if($flag) {
   $line =~ s/\n//g;
   $msg .= $line;
  }
  if($line eq "\n") {
   $flag++;
  }
 }

 if($msg) {
  $twit->update($msg);
 }

 exit;

もっとちゃんとした書き方がありそうですが、ひとまず。
メールの処理って書いたことないんですが、本文判定って空行(改行のみ)でいいのかなー。

うーん、ちゃんとした勉強しとけという事か。書籍ですかねー・・・


あと、文字コードの扱いに少し手こずった・・・。さくらの環境だとJIS(7bit-jis)決め打ちでも良さそうですが、せっかく調べたのでw Encode::Guessを使ってみました。
※そういう問題じゃないですねw よくわかってなかったのでメールサーバーがこの文字列で出力しているのかと思ってました。

followされたらfollowする

あんまり機能としては重要でもないような気がしないでもないw

これも上のと一緒で、メール受信したら処理が走るようにする。(フォローされたらメールを送信するように設定しておく)

実行するのは以下。

#!perl
use strict;
use warnings;
use Net::Twitter;

 my $twit = Net::Twitter->new(
  username => 'twittername', # name
  password => 'twitterpswd', # password
 );

 my $screen_name;
 my $regex_sn = '  http://twitter\.com/(\w+)'; # 現状はこんな感じで
 while(<STDIN>) {
  if($_ =~ m/$regex_sn/i) {
   $screen_name = $+;
   last;
  }
 }

 if($screen_name) {
  $twit->create_friend($screen_name);
 }

 exit;

これは「Twitter でイチイチ follow するのが面倒くさい - にぽたん研究所」からのパクリ。なんか違うのは私の趣味の問題desu

あー、あと、$twit->followってのは今のNet::Twitterには無くて $twit->create_friend になってるみたいですねー。


実際、FollowされたらFollowするってのはbotとして使えるかどうか微妙ですが・・・。らしくするならFollowされたらリストしておいて、なんかのタイミングでFollowするとかの方が、んー。


@されたら反応する

これも完全にパクリwww

@ドリブンなTwitter自動投稿スクリプト - ここでもバリ3をゲットできるかな - はてなグループ::ついったー部」からです。

#!perl
use strict;
use warnings;
use utf8;
use Encode;
 use open ':utf8';
 binmode STDIN, ":utf8";
 binmode STDOUT, ":utf8";
use Net::Twitter;

 my $twname = 'twittername', # name
 my $twpswd = 'twitterpswd', # password

 my $twit = Net::Twitter->new(
  username   => $twname,
  password   => $twpswd,
 );

sub content {
 my $input = shift;
 my $output = $input;
 return( $output );
}

sub reply {
 my $screen_name = shift;
 my $text = shift;
 my $at_name = '@' . $twname;
 my $at_name_to = '@' . $screen_name . ' ';
 $text =~ s!^$at_name\s*!!;
 my $content = &content($text);
 my $status = $at_name_to . $content;
 $twit->update($status);
}

 my ($last_id, $first_one, $checked);
 open my $fh01, '<', '/local/last_id' or $last_id = 'none'; # 環境に合わせてdir変更
 unless(defined $last_id) {
  while(<$fh01>) { chomp; $last_id = $_; }
 }

sub check_new {
 unless($first_one) {
  $first_one++;
  open my $fh01, '>', '/local/last_id'; # 環境に合わせてdir変更
  print {$fh01} "$_[0]->{'id'}";
 }
 $checked++ if $_[0]->{'id'} eq $last_id;
 $checked ? 0 : 1;
}

 my $posts = $twit->replies;
 my @new_posts = reverse grep &check_new($_), @$posts;

 for my $new_post (@new_posts) {
  &reply($new_post->{'user'}{'screen_name'}, $new_post->{'text'});
 }

 exit;

・・・正直、どう動いてるのかよくわかってないのですがw 何したらどうなるのかは掴みました!たぶん。 これはcronで(さくらインターネットはcronの最小設定が2分間隔のようです)回す〜。


とりあえず、投稿したり反応したりするところはなんとなく調べ終わったかなー。(検索しまっくってただけですがw


あと気になるのは「Twitter APIのメッセージ抜け対策メモ」。困ったらこれを試す。(でもそのうちまた状況変わっちゃうか


あとはメインの処理

あー、これが一番の問題ですけど・・・。

形態素解析とかを調べて適当なこと呟いたり、便利な情報をタレ流すとか、そういうのを思いついて作れるといいですね!w


ハイクのAPIも気になりだしてきた=