先日自分がtweetしていました通り、更新情報を拾ってtweetするボットの紹介です。対象のボット第一弾は @webunbot_top3 です。こんな感じで、人気記事のトップ3をtweetします。
富山県に関する情報が、もっとネットに溢れたらいいのにな、という思いで作っています。このボットは、北日本新聞社のサイト http://webun.jp/ の県内記事アクセス数トップ3tweetするbotです。
構造はシンプルです。予めバッチ取得しておいたインデックスページのHTML構文解析をHTML::TokeParser モジュールを使い、Net::Twitter で tweet します。
まず、バッチ部分は cron に次のように指定しています。
01 * * * * /home/zem/develop/webun.jp/index/webun_top3.sh
これは、毎時1分にデータを取得するシェルスクリプトです。中身はこちら。
#!/bin/sh cd /home/zem/develop/webun.jp/index mv news.html ./archive_news/news_`date +%Y-%m%d_%H%M`.html wget http://webun.jp/news -O news.html perl ./news_parse.pl
wgetで最新のデータを取得し、古いものをバックアップとして日時をつけてアーカイブ化していきます。次に、構文解析・tweet する news_parse.pl はこちらです。
#!/usr/bin/perl # Feb 11, 2012 ver 0.01 created by Masahito Zembutsu <zem@pocketstudio.jp> # Licensed by Under # Module for Pocketstudio.net Network Services, the project toyama.info use HTML::TokeParser; use Encode qw(decode); use utf8; use Net::Twitter; binmode(STDOUT, ":utf8"); # define data files $dat = '/home/zem/develop/webun.jp/index/news.html'; # parse HTML &parseNews(); exit; sub parseNews() { # read file my $data = HTML::TokeParser->new($dat) || die "Can't open: $!"; my $str; if (my $tag = $data->get_tag("ol") ) { while (my $token = $data->get_tag("a")) { $i++; last if ($i > 3); my $url = $token->[1]{href} || "-"; my $text = $data->get_trimmed_text("/a"); $text = decode('utf8', $text); $str .= $i.'位「 '.$text."」\n"; } } my @time = localtime(); $str .= $time[2].'時 北日本新聞 webun 富山一覧 http://bit.ly/xgVt5Y #webunBest3'; # http://webun.jp/newlist/knpnews # output &tweet($str); return; } sub tweet { my $nt = Net::Twitter->new( traits => [qw/API::REST OAuth WrapError/], consumer_key => 'xxxxxxxxxxxxxxxx', consumer_secret => 'xxxxxxxxxxxxxxxx', ssl => 1, ); $nt->access_token ('xxxx'); $nt->access_token_secret('xxxx'); my $text = $_[0]; my $result = $nt->update($text); print "[$result:$!]$text\n"; # for debug return; } 1;
まだライセンスも何も決めてません。そのうち github にもあげようと思います。
この系統の bot を perl で作りたいかたの参考になれば幸いです。
第二弾は、無料記事を紹介する @webunbot_free の構造を予定しています。