« アルファリポ酸のレポート | メイン | アシックス「はだしウォーカー(裸足ウォーカー)/HADASHIWALKER」 »
ナイーブネットにログインできません。…といっても普通のブラウザからではありません。
ナイーブネットって操作が結構面倒なので、自動巡回プログラムでも作れないかと思ってPerlスクリプトからログインしようとしているのですが、セッションの情報をうまく取得できないようです。
ちなみに、以下の書籍やサイトを参考にしています。
Spidering hacks―ウェブ情報ラクラク取得テクニック101選
Perlモジュール/LWP - WWW上のデータ-主としてホームページ等-を取得し、処理するためのライブラリ。
予想はしてましたが、ナイーブネットって結構手強いですね。
以下作成したスクリプトを貼り付けてみます。どなたか分かる方がいらっしゃいましたらアドバイスいただければ幸いです。
#!/usr/bin/perl -w use strict; use LWP 5.64; use HTTP::Cookies; use Encode; use encoding 'shiftjis'; # 使用しているプラットフォームにあわせてください。 binmode(STDERR, ':raw :encoding(shiftjis)'); # 同上my $url = 'https://www.naiiv.gr.jp/user_entrance/memberlink';
my $cookie_file = "./cookie.txt";
my $id = 'naiiv_id'; #ここにナイーブネットのIDを記述
my $pass = 'naiiv_password'; #ここにナイーブネットのパスワードを記述
my $browser = LWP::UserAgent->new;
my $cookie_jar = HTTP::Cookies->new(file => $cookie_file, autosave => 1, ignore_discard => 1);
$browser->cookie_jar($cookie_jar);
$browser->agent('Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0; .NET CLR 1.1.4322)'); #IEをエミュレートmy $response = $browser->post( $url,
[ 'USER_ID' => $id,
'USER_PASS' => $pass,
]
);die "$url エラー: ", $response->status_line unless $response->is_success;
die "$url のコンテンツタイプが不正です。-- ", $response->content_type
unless $response->content_type eq 'text/html';# 以降は、コンテンツの処理
# $contentを読み込む
my $content = decode('shiftjis', $response->content); # コード変換
print $content; #取得したコンテンツを表示sub URI::query_form {
my $self = shift;
my $old = $self->query;
if (@_) {
# Try to set query string
my @query;
while (my($key,$vals) = splice(@_, 0, 2)) {
$key = '' unless defined $key;
$key =~ s/([;\/?:@&=+,\$\[\]%])/$URI::Escape::escapes{$1}/g;
$key =~ s/ /+/g;
$vals = [ref($vals) ? @$vals : $vals];
for my $val (@$vals) {
$val = '' unless defined $val;
#################### ここから日本語化パッチ部分 ####################
my @work = unpack('C*', $val);
$val = '';
foreach my $c (@work) {
if ((($c >= 0x30) && ($c <= 0x39)) || # 数値はそのまま
(($c >= 0x41) && ($c <= 0x5A)) || # アルファベット(大文字)もそのまま
(($c >= 0x61) && ($c <= 0x7A))) { # アルファベット(小文字)もそのまま
$val .= chr($c);
} elsif ($c == 0x20) { # 空白は'+'に
$val .= '+';
} else { # それ以外は%XX形式に変換する。
$val .= sprintf("%%%02X", $c);
}
}
#################### 日本語化パッチ部分ここまで ####################
# この行は削除 $val =~ s/([;\/?:@&=+,\$\[\]%])/$URI::Escape::escapes{$1}/g;
# この行は削除 $val =~ s/ /+/g;
push(@query, "$key=$val");
}
}
$self->query(join('&', @query));
}
return if !defined($old) || !length($old) || !defined(wantarray);
return unless $old =~ /=/; # not a form
map { s/\+/ /g; uri_unescape($_) }
map { /=/ ? split(/=/, $_, 2) : ($_ => '')} split(/&/, $old);
}
投稿者 Dream : 2005年02月28日 01:48
この記事はあなたのお役に立ちましたか?もし気に入っていただけたのでしたら、是非人気blogランキングをクリックしてください。
このエントリーのトラックバックURL:
http://www.sf-dream.com/cgi/mt33/mt-tb.cgi/264
ナイーブネットですけど、ブラウザでそのリンクをクリックしてもエラーが出ます。
サーバートラブルではないでしょうか?
投稿者 itochan : 2005年03月02日 15:09
間違っていました。すみません。
Operaブラウザではログインできなかったのですが、InternetExplorerを使ったらログインできました。
http://www.naiiv.gr.jp/ へアクセスすると、強制的に、https のついたhttps://www.naiiv.gr.jp/ に転送されます。
そのせいでスクリプトでアクセスできていないのではないでしょうか?
投稿者 itochan : 2005年03月02日 15:26
itochanさん、いつもありがとうございます。
まずログインページですが、直接のURLは
https://www.naiiv.gr.jp/user_entrance/link?goto=login.html
です。
ここのログイン部分のソースですが、まず
<FORM method="post" action="/user_entrance/memberlink">
となっています。これを絶対パスにすると
https://www.naiiv.gr.jp//user_entrance/memberlink
ここに送信しているんだと思います。よってスクリプトではここを直接指定しています。
my $url = 'https://www.naiiv.gr.jp/user_entrance/memberlink';
続けてIDとパスワードの送信です。
<input type="text" name="USER_ID" size=20 maxlength=8>
USER_IDにIDを格納します。
<input type="password" name="USER_PASS" size=20 maxlength=8>
USER_PASSにパスワードを格納します。
<INPUT type="submit" value=" OK ">
OKボタンを表示してデータを送信するようになっています。
この動作をしているのがスクリプトの以下の部分です。
my $response = $browser->post( $url,
[ 'USER_ID' => $id,
'USER_PASS' => $pass,
]
);
という処理にしてみたのですが…、直接送信したのでは駄目なんですかね?
投稿者 Dream : 2005年03月02日 23:37
カイインノページデ idヤ パスワードヲ ニュウリョクシタノデスガ ゲストページニシカ ハイレマセン。ドウスレバ ヨイデショウカ。
投稿者 オオハラヤスコ : 2010年04月14日 11:42
今は「サピエ」という名前になってますけど。
ないーぶネットのIDとパスワードを入れておられるのでしょうか?
こちらではちゃんとログインできてます。
投稿者 Dream : 2010年04月15日 00:34