ichirin2501's diary

いっちりーん。

PerlでTwitterBot作ってみた

某サイトのHTMLを落として差分(更新情報)を取り、発言させるというもの。
作成時の記憶を辿ってつらつらと記事にしてみる。OSはUbuntuです。


大まかな流れ。
1.Net::Twitterモジュールのインストール
2.Perlでごりごり書く

Net::Twitter

#!/usr/bin/perl
#sample code
use Net::Twitter
my $twitter = Net::Twitter->new(
		username => $username,
		password => $password
	);
my $result => $twitter->update("hogehoge");
}

Net::Twitterモジュールが使えるとこんな感じで書き込みが行えます。
CPANを使ってNet::Tiwtterをインストールするので、まずCPANを導入します。
関連アプリケーション
make,C/C++ Complier,tar,gzip


$ sudo perl -MCPAN -e shell
初回は設定について色々訊かれますが、Enter連打で乗り越える。

cpan> install Net::Twitter
と打てば終わる…予定でした。
makeがねーよ、インストール出来ない、とのこと。
え…make入ってるけど?なんでえ?
~/.cpan/build/ を見てみると、Net::Twitterと依存関係にある
モジュールをインストールしようとした痕跡がある。
原因が解らないので手動で行うことにした。
インストールしたいモジュールのディレクトリに入って、

$ sudo perl Makefile.PL
$ sudo make
$ sudo make test
$ sudo make install
make testをした時に、all okとなれば良い。
だめなときは必要なモジュールが足りないから、
エラー文に表示されているモジュールをインストールする〜を繰り返す。
作業げー。
なんとかインストールは出来たのですが、結局エラーの原因が解らず。

perlでごりごり書く

特別なことはしてないので、苦労した2バイト文字と文字コードのめも。
Twitterに送信する文字コードはutf8でないと文字化けするみたい。
今回は差分を取るHTMLがutf8だったのでその点は問題なかったです。
文字コードを変更する場合は下記URLで丁寧に解説されています。


コード内で記述する2バイト文字と外部から入力された2バイト文字列は違うらしい。
こちらで詳しく書かれており、大変参考になりました。
Encode - 日本語などのマルチバイト文字列を適切に処理する / Perlモジュール徹底解説 - サンプルコードによるPerl入門

2バイト文字の比較

#!/usr/bin/perl

#入力は
#論理パズル
#論理パズル[EOF]

use utf8;
use Encode qw/ encode decode /;

for(<>){
  my $w=decode('utf8',$_);
  if( $w =~/論理パズル/ ){
    print"yes1\n";
  }
  if( $w eq "論理パズル" ){
    print"yes2\n";
  }
}

出力結果


yes1
yes1
yes2
文字列比較のeqだと改行も判定されるので1回目がマッチしない。


2バイト文字の連結

#!/usr/bin/perl

#入力は先程と同じ

use utf8;
use Encode qw/ encode decode /;

for(<>){
  my $w=decode('utf8',$_);
  if( $w =~/論理パズル/ ){
    #print"yes\n";
    $w=~s/[\r\n]//g;
    $w.='と知恵の輪';
    $w=encode('utf8',$w);
    print"$w\n";
  }
}

出力結果


論理パズルと知恵の輪
論理パズルと知恵の輪
正しく連結されてるのですが、print"yes\n"のコメントをはずすと
1行目の先頭で文字化けが起こりました。
2行目以降は問題ないのですが…謎すぎる。