定期券を PASMO に切り替えたらネットで利用履歴が見られることを知った。以下の URL を開いてログインすると、上に挙げたようなページ
マイページ PASMO 履歴照会サービス ログイン
https://www.pasmo-mypage.jp/loginwebform.aspx
ここから利用履歴を得るスクリプトを書いてみよう。とりあえず実行結果はこんな感じ。
$ perl pasmo.pl ユーザー名 パスワード --- - 利用駅1: 横浜市B 利用駅2: '' 月日: 0930 残額: 30 種別1: バス 種別2: '' 運賃: 530 - 利用駅1: 横浜 利用駅2: 新横浜 月日: 0925 残額: 560 種別1: 入 種別2: 出 運賃: 440 - 利用駅1: 横浜 利用駅2: '' 月日: 0920 残額: 1000 種別1: 現金 種別2: '' 運賃: 0
#!/usr/bin/perl
use utf8;
use strict;
use warnings;
use Web::Scraper;
use WWW::Mechanize;
binmode STDOUT => ":utf8";
# Windowsなら
# binmode STDOUT => ":encoding(cp932)";
my $m = WWW::Mechanize->new;
$m->get( "https://www.pasmo-mypage.jp/loginwebform.aspx" );
warn "-- ユーザー名・パスワードをセット\n";
$m->set_fields(
userIdTextBox => shift // die,
passwordTextBox => shift // die,
);
warn "-- ログイン\n";
$m->click( "loginButton" );
warn "-- 履歴照会画面を開く\n";
$m->follow_link( text => "PASMO履歴照会はこちら" );
my $content = $m->content;
#use Path::Class;
#my $content = file( "sample.html" )->slurp( iomode => "<:encoding(utf8)" );
my $results = scraper {
process '//tr[@bgcolor="#D0D0D0"]', 'results[]' => scraper {
process "//td[1]", 月日 => "TEXT";
process "//td[2]", 種別1 => "TEXT";
process "//td[3]", 利用駅1 => "TEXT";
process "//td[4]", 種別2 => [
"TEXT",
sub { s/ //g; },
];
process "//td[5]", 利用駅2 => "TEXT";
process "//td[6]", 残額 => [
"TEXT",
sub { s/\*//g; },
];
}
}->scrape( $content )->{results};
for my $i ( 0 .. @$results - 1 ) {
my $b = $results->[ $i ];
$b->{運賃} = $i == @$results - 1 ? 0 :
abs $results->[ $i + 1 ]{残額} - $b->{残額};
}
use YAML; print Dump $results;
WWW::Mechanize で目的のページを得る
WWW::Mechanize を使うと、実際にマウスとキーボードでブラウジングしているようにページを行き来できる。
ただ、そのスクリプトを一から書くことは難しいので、事前に WWW::Mechanize::Shell を使ってコマンドプロンプトからシミュレートしてみよう。
$ perl -MWWW::Mechanize::Shell -e shell (no url)>
このコマンドで WWW::Mechanize のシェルが起動する。
(no url)>get https://www.pasmo-mypage.jp/loginwebform.aspx Retrieving https://www.pasmo-mypage.jp/loginwebform.aspx(200)
まずは get コマンドでログインページを開く。
https://www.pasmo-mypage.jp/loginwebform.aspx>forms Form [1] POST https://www.pasmo-mypage.jp/loginwebform.aspx [_ctl0] userIdTextBox= (text) passwordTextBox= (password) loginButton=ログイン (submit) registerLinkButton=会員登録 (submit)
forms コマンドでページの中にどんなフォームがあるか調べる。このページにはフォームが一つしかないので問題ないが、2 つ以上のフォームがある場合は“form 3”などとして、目的のフォームを選択しないといけない。
https://www.pasmo-mypage.jp/loginwebform.aspx>fillout (text)userIdTextBox> [] ユーザー名 (password)passwordTextBox> [] パスワード
フォームの確認が終わったら、fillout コマンドで実際に必要な項目を埋める。
https://www.pasmo-mypage.jp/loginwebform.aspx>click loginButton (200)
フォームの実行は submit コマンドなのだが、今回のフォームのように submit 属性のボタンが 2 つ以上click コマンドで明示的にボタンを指定しよう。
https://www.pasmo-mypage.jp/MenuWebForm.aspx>links [0] style.css [1] ログアウト | [2] PASMO履歴照会はこちら [3] パスワード変更 https://www.pasmo-mypage.jp/MenuWebForm.aspx>open 2 (200)
ログインが成功するとメニューが表示される。links コマンドでメニューの項目を表示し、open コマンドで目的のメニューをクリックする。
https://www.pasmo-mypage.jp/CardStatusWebForm.aspx>content
目的のページについた。content コマンドでページのソースを確認しよう。ソースをファイルに保存したいときは“content ファイル名”のように書けばよい。
my $m = WWW::Mechanize->new;
$m->get( "https://www.pasmo-mypage.jp/loginwebform.aspx" );
$m->set_fields(
userIdTextBox => shift // die,
passwordTextBox => shift // die,
);
$m->click( "loginButton" );
$m->follow_link( text => "PASMO履歴照会はこちら" );
my $content = $m->content;
以上のような作業を経て、上記のようなスクリプトが得られる。
次回はこのページを Web::Scraper を使って解析する。(続く)
【Perl】WWW::Mechanize と Web::Scraper で PASMO の利用履歴を得る(その2)
https://blog.delphinus.dev/2010/10/get-pasmo-history-with-perl-2.html
