定期券を 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