Perl WWW::Mechanize で yahoo にログイン

2013/07/12

Perl WWW::Mechanize で外部サイトにアクセス

概要

今回は Perl で外部サイトにアクセスしてその情報を取得する方法を紹介します。
サンプルコードでは、Yahoo にログインし、ログイン状態を保持しています。
また画像認証が出てきたときのために、Mechanize オブジェクトをファイルに保存しています。

サンプルコードはこちらです。

PHP でのログイン、セッション保持方法はこちら

今回は以下の3つのCPAN モジュールを使用しています。

WWW::Mechanize
HTTP::Cookies
Storable

WWW::Mechanize

WWW::Mechanize(mach) は、WEBサイトとのやりとりを行います。
サイトへの接続や、Form の送信も可能です。
また、mach では訪れたサイトのURLを保持しますので、後々呼び出すことも可能です。

今回はこの mach を使用して、Form を送信することでログイン処理を行っています。

HTTP::Cookies

Cookie とはサーバー側がクライアント側に情報を格納し、また取り出すことができる機能です。
これを使用してログイン後の情報を保存することで、ログイン状態を保持しています。

Storable

Storable はデータ構造体の永続化を行うモジュールです。

store を使用して保存し、retrieve を使用して読み込みます。

Yahoo では画像認証が表示されることがあります。
画像認証の文字を、プログラムで解析して自動で入力するのはとても難しいことです。

これを行うには、一旦画像を画面に表示して入力処理を行い認証処理を行う必要があります。

しかし、画像認証の文字列はアクセスするたびに毎回かわります。
正しく行うには、画像認証が表示されたときと、画面に表示して入力したときで同じ状態にする必要があります。

そのために Storable を使用して、Mechanize オブジェクトをファイルに保存し、次回読み込み時もこの Mechanize オブジェクトを使用することで、状態を保持します。

今回のサンプルコードでは画像認証の処理については記述していませんが、Machanize オブジェクトを保存して状態を保持するようにしています。

サンプルコード

※重要な個所のみピックアップして記述しています。

ログイン処理


use WWW::Mechanize;
use HTTP::Cookies;
use Storable;
use Storable qw(nstore store_fd nstore_fd freeze thaw dclone);

our $login_page = 'http://user.auctions.yahoo.co.jp/jp/show/mystatus';
our $cookie_file = 'cookie.dat';
our $mech_file = '20130712101010';

our $user_id = 'user';
our $password = 'pass';

my $cookies = HTTP::Cookies->new(file => $cookie_file, autosave => 1, ignore_discard => 1);
my $mech = WWW::Mechanize->new();

$mech->agent_alias('Windows IE 6');
$cookies->load($cookies);
$mech->cookie_jar($cookies);

$mech->get($login_page);

if ($mech->content =~ m/<title>ログイン \- Yahoo! JAPAN<\/title>/) {
	$mech->form_name('login_form');
	$mech->field('login', $user_id);
	$mech->field('passwd', $password);
	$mech->click();
}

$cookies->extract_cookies($mech->response());
$cookies->save($cookie_file);

store ($mech, 'data/' . $mech_file) or die;

2回目の処理


use WWW::Mechanize;
use HTTP::Cookies;
use Storable;
use Storable qw(nstore store_fd nstore_fd freeze thaw dclone);

our $login_page = 'http://user.auctions.yahoo.co.jp/jp/show/mystatus';
our $cookie_file = 'cookie.dat';
our $work_session_file = '20130712121212';

my $cookies = HTTP::Cookies->new(file => $cookie_file, autosave => 1, ignore_discard => 1);
my $mech = retrieve 'data/' . $mech_file;
my $content;

$mech->cookie_jar($cookies);
$mech->get($login_page);

$content = $mech->content;
Related

Vagrant+Docker+PHP環境で「session.save_path」指定時に、セッションファイルが空になるエラー

ファイル共有でのフォルダの所有者を設定 結論 PHP5.4.28 からセッションファイルのownerはrootもしくはWebサーバのユーザに限るという制限が...

LINEと連携したテイクアウト事前注文システム徹底比較!

目次 テイクアウト予約・注文受付システムのトレンド LINEと連携したテイクアウト事前注文システムの価格表 L.B.B.Cloud テイクイーツ ...

PHPで動画の撮影日を取得

PHPで動画の撮影日を取得 概要 PHPからffprobeコマンドを実行し、動画の撮影日時を取得します。 コード $posted_at = ...

FullCalendarでGoogleカレンダーのようなUIを実装

jQueryプラグインFullCalendarのサンプル 概要 FullCalendarを使用して、GoogleカレンダーのようなUIを実装する使用例を...

PHP Laravel5.2でmulti-auth(複数テーブルでの認証)を実装

Laravel5.2でマルチ認証 概要 LaravelとはPHPの中で今最も伸びているフレームワークです。 処理速度が遅いなどありますが、かなり使い安く拡...

PHP 正規表現でIPアドレス形式の文字列か判定

正規表現でIPアドレスの入力チェック 概要 フォームで入力されたIPアドレスが正当な文字列か判定するためのバリデーション処理を実装します。 基本的...
トップへ戻る