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
初回は設定について色々訊かれますが、Enter連打で乗り越える。
$ sudo perl -MCPAN -e shell
と打てば終わる…予定でした。
cpan> install Net::Twitter
makeがねーよ、インストール出来ない、とのこと。
え…make入ってるけど?なんでえ?
~/.cpan/build/ を見てみると、Net::Twitterと依存関係にある
モジュールをインストールしようとした痕跡がある。
原因が解らないので手動で行うことにした。
インストールしたいモジュールのディレクトリに入って、
make testをした時に、all okとなれば良い。
$ sudo perl Makefile.PL
$ sudo make
$ sudo make test
$ sudo make install
だめなときは必要なモジュールが足りないから、
エラー文に表示されているモジュールをインストールする〜を繰り返す。
作業げー。
なんとかインストールは出来たのですが、結局エラーの原因が解らず。
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"; } }
出力結果
文字列比較のeqだと改行も判定されるので1回目がマッチしない。
yes1
yes1
yes2
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行目以降は問題ないのですが…謎すぎる。