仕事をしていると、荷物を宅配便で送る業務っていうのがあるんですけれども、宅配便業者さんに引き渡した後、ちゃんと届いたか確認したいってことありますよね。
というわけで、今回はPerlでクロネコヤマトの荷物照会のページをスクレイピングして、荷物の状況表示を回収するPerlスクリプトです。
応用すると、未配達の荷物を追跡して問い合わせるロボットなんかが作れるかもしれません。
今回は、モジュールにしてみましたので、ディレクトリをしっかり掘って使ってみてください。
Filename: WebService/KuronekoYamato.pm
package WebService::KuronekoYamato;
use warnings;
use strict;
use Carp;
use version; our $VERSION = qv('0.0.1');
# Other recommended modules (uncomment to use):
# use IO::Prompt;
# use Perl6::Export;
# use Perl6::Slurp;
# use Perl6::Say;
use Encode;
use WWW::Mechanize;
use Web::Scraper;
use YAML::Syck;
# Module implementation here
# コンストラクタ
sub new {
my ( $class ) = shift;
my $mech = WWW::Mechanize->new();
$mech->agent_alias( 'Windows IE 6' );
$mech->get('http://toi.kuronekoyamato.co.jp/cgi-bin/tneko?init');
my $self = { mech => $mech, };
bless $self;
}
# ヤマト運輸に問い合わせ
sub check {
my $self = shift;
my $numbers = shift; # 荷物問い合わせ番号のリストのリファレンス
# フォームの問い合わせは10件ごとなので10件ごとのリストのリストにする
my $list; # 10件ごとに分割されたリストのリストが入る
my $j = -1; #添え字調整
foreach ( my $i = 0; $i < $#$numbers + 1; $i++ ) {
$j++ unless $i % 10;
push @{$list->[$j]}, $numbers->[$i];
}
# _requestを呼んで実際にWebアクセスする
my $result = [];
foreach my $item( @$list ) {
my $res = _request($self, $item);
push @$result, @$res; # 返答は最大10件なので、$resultにためていく
}
return $result; # 集まったリストを返す
}
# 実際にリストからアクセスする
sub _request {
my $self = shift;
my $list = shift;
$self->{mech}->form_number(1);
for ( my $i = 0; $i < $#$list + 1; $i++) {
my $field = sprintf "number%02d", $i+1;
$self->{mech}->set_fields( $field => $list->[$i]);
}
$self->{mech}->submit;
# Web::Scraper による解析
my $s = scraper {
process '//tr/td[1]/input/../../td[2][contains(. , "-")]/..',
'tneko[]' => scraper {
process '//td[2]',
number => 'TEXT',
process '//td[3]',
date => 'TEXT',
process '//td[4]',
status => 'TEXT',
},
};
my $res = $s->scrape( # Shift_JISをUTF-8に変換
encode('utf8', decode('cp932', $self->{mech}->content() ) )
);
# 得られた結果をリストで返す
return $res->{tneko};
}
sub dump {
my $self = shift;
print Dump($self);
return;
}
1; # Magic true value required at end of module
__END__
使うときは、
#!/usr/bin/perl use lib qw(lib/); package main; use strict; use warnings; use YAML::Syck; use WebService::KuronekoYamato; use utf8; my $n = WebService::KuronekoYamato->new(); my $res = $n->check([ 240000000000, 240000000011, ]); print Dump($res); exit;
こんな感じで使うといいんじゃないでしょうか。身の回りにあるクロネコヤマトの発送伝票で試してみてください。
ねえよ。
今回のは、CoreReposにも置いてあります。正直言ってPerlのモジュールやらオブジェクト指向がよくわかっていないっぽいので、修正してもらえればなあとも思ってたり。
http://svn.coderepos.org/share/lang/perl/WebService-KuronekoYamato/
~~~
このようなスクリプトがあったところで、大事なのは、荷物が動いていなかったときの交渉と手配だったりすることは言うまでもありません。
今回のエントリは、
M.C.P.C.: クロネコヤマトの荷物お問い合わせシステムでテキストボックスへフォーカスを合わせるUser Script(Opera用)
M.C.P.C.: Plaggerでクロネコヤマトの荷物お問い合わせが出来ればいいよね
あたりが元ネタです。


