アプリ版:「スタンプのみでお礼する」機能のリリースについて

LWP::UserAgentを使用してHTTPSサイトから、
コンテンツを取得して解析処理をしたいのですが、
取得できなくて困っています。
Crypt::SSLeayやopensslを入れてアクセスは出来るようになったのですが、
HTTPサイトの場合

$ua = LWP::UserAgent->new;
my $Req = HTTP::Request->new('GET', 'http://~');
my $Res = $ua->request($Req);
my $content = $Res->content;

これで、コンテンツのソースを取得できたのですが、
同じ用にhttpsサイトから取得しようしても
「<HTML></HTML>」だけしか取得できませんでした。

ちなみに
my $content = $Res->as_string;
としてみると、

HTTP/1.0 200 OK
Content-Type: text/html
Client-Date: Thu, 08 Dec 2005 08:01:10 GMT
Client-Peer: *.*.*.*:8080 ←隠させてもらいます
Client-Response-Num: 1
Refresh: 0; URL=https://~

という取得したいHTTPSサイトにジャンプするような
内容が取得できました。

どうにかしてコンテンツ内容を取得したいのですが、
そもそもHTTPSのコンテンツ内容を取得すること自体
出来ないのでしょうか?
その場合代案等もありましたら、教えてください。

とても困っています。
よろしくお願いいたします。

A 回答 (6件)

プロキシサーバー使っているんですか?


参考URLにあるように、Crypt::SSLeayの場合、
設定の仕方が少し違います。

# PROXY SUPPORT
$ENV{HTTPS_PROXY} = 'http://proxy_hostname_or_ip:port';

# PROXY_BASIC_AUTH
$ENV{HTTPS_PROXY_USERNAME} = 'username';
$ENV{HTTPS_PROXY_PASSWORD} = 'password';

私の会社でもプロキシサーバー入っていますが、
そのプロキシを通してSSLのサイトにアクセスできています。ただし、プロキシは8000です。
8080の場合の影響は分かりません。って、プロキシが8080ってあるんですか。

で、一度プロキシの無い、直にインターネットにつながった環境で、ご自分のスクリプトがちゃんとSSLにアクセスできているかは本当に確認されてますか?
S1.plは、参考URLのそのままです。最初エラーになったけど、2回目OKでした。


S1.pl

#!Perl
use LWP::UserAgent;
my $ua = new LWP::UserAgent;
my $req = new HTTP::Request('GET', 'https://www.nodeworks.com');
my $res = $ua->request($req);
print $res->code."\n";
__END__

D:\@ai\@Perl\refresh_redirect>S1.pl
500

D:\@ai\@Perl\refresh_redirect>S1.pl
200

D:\@ai\@Perl\refresh_redirect>

参考URL:http://search.cpan.org/~chamas/Crypt-SSLeay-0.51 …
    • good
    • 0
この回答へのお礼

再びご回答ありがとうございます。

プロキシの設定は私のプログラムでもちゃんと出来ていて、$res->codeは私の方でも”200”が返ってきています。

かなり、何度もご質問をして申し訳ないですが、
最後に1つだけ教えて下さい。

HTTPSサイトに接続して$res->contentで、ソースの内容は取得できますか?
私のところでは「<HTML></HTML>」のみしか返ってこなくて、困っています。

もう4日近く悩んでいまして、どうしてもだめなら
やったことないですが、VBScriptで頑張るしかないかなと考えています。

お礼日時:2005/12/13 11:44

この15行のスクリプトをそのまま実行してみて下さい。


但し、5~7行目はご自分の環境に合わせて下さい。
URLを何処にしようかと迷ったのですが、これはCrypt::SSLeayの
ドキュメントにでてくるので、最適でしょう。
これができないなら、Crypt::SSLeayのインストールがおかしいか、
貴方のプロキシまたはネットワークに問題があると思います。

#!Perl
# LWP_SAMP_SSL.pl: LWP sample acess to https
use LWP::UserAgent;
print "start to access: 'https://www.nodeworks.com'\n";
$ENV{HTTPS_PROXY} = '10.1.2.3:8080'; # For Crypt::SSLeay
$ENV{HTTPS_PROXY_USERNAME} = 'user';
$ENV{HTTPS_PROXY_PASSWORD} = 'pass';
my $ua = new LWP::UserAgent;
my $req = new HTTP::Request('GET', 'https://www.nodeworks.com');
my $res = $ua->request($req);
my $content = $res->content;
my $code = $res->code;
$content =~ s/[\r\n]//g;
print "=========\n content:\n $content \n===========\nStatus: $code\n";
__END__

C:\>LWP_SAMP_SSL.pl
start to access: 'https://www.nodeworks.com'
=========
content:
<html><head><meta HTTP-EQUIV="Content-Type" content="text/html; charset=iso-885
9-1"><meta name="keywords" content="link checker, link checking, link check, dea
d links, broken links, link qa, web qa, link verify, link verification"><meta na

(長いので途中省略)

ew,courier;font-size:12px"><input tabindex=1008 type="submit" name="submit" valu
e="Account Login"></font> </td> </tr></td></tr> </form></table> <tr><td
colspan=2><center><hr size=1 width='90%' noshade></center></td></tr></table><fon
t style="font-family:verdana,helvetica;font-size:12px">Please fill out the <a hr
ef="remind.asp?session-id=026945e4c20a702e78e19f85b8cf10c9">password request for
m</a>,if you cannot remember your password.</font> </font> </td></tr></table
> </td></tr></table></td></tr> <tr><td align=center> <br> <font
style="font-family:verdana,helvetica;font-size:10px" ><b>&copy; 2005 Chamas Ente
rprises Inc.</b></font> </td></tr></table></BODY></HTML>
===========
Status: 200

C:\>
    • good
    • 0
この回答へのお礼

guci-okさん。本当にありがとうございました!!

本当にすいません。やはりプロキシの設定のやり方が
悪かったようでした。
ステータスが200で返ってきていたので、
プロキシは問題ないと思い込んでいました。

1週間近く悩んだ問題がやっと解決して、
すっきりしました。
本当に助かりました。
また機会があれば、よろしくお願いいたします。

お礼日時:2005/12/14 11:55

> そもそもHTTPSのコンテンツ内容を取得すること自体


> 出来ないのでしょうか?

Crypt::SSLeayで普通に処理できます。

サーバーが、"304 moved"のような応答を返した場合、LWPは自動でジャンプ
するのですが、応答ヘッダのrefreshには対応していないようです。
(これは私が実際に試したところの話です)
ならば、refreshに答えてジャンプすれば良いのではないでしょうか?
リクエストの後で、
my $refresh_header = $res->header("Refresh");
if ($refresh_header =~ m|url\=(.+)$|i) {
print "\nMust refresh to: '$1'\n";
...
} else {
print "\nNo refresh found...\n";
}

しかし、質問の内容は、
URL、https://~にアクセスしたら、その応答ヘッダで、
Refresh: 0; URL=https://~
と最初のアクセスと同じURLを返してきた、のように見えます。
これだと、Refreshをたどってジャンプしてもどうどう巡りになって
しまいそうです。
本当にそのような状況なのでしょうか?
何かの条件を判断して再アクセスさせようとしているようにも見えますが、
単に同じURLを再アクセスさせとうとするサーバーの意図が分かりません。


以下は、LWPが自動でリダイレクト先にジャンプする応答を返すCGIです。

#!Perl
use CGI qw/:all/;
print redirect("https://.....co.jp/");
__END__

以下は、LWPが自動でリダイレクトしない応答を返すCGIです。

#!Perl
use CGI qw/:all/;
print header({ -refresh => "0;url=https:////.....co.jp//"} );
__END__

私はこの2つのCGIを使って最初のコード、
my $refresh_header = $res->header("Refresh");
...
を書きました。
状況がよく分からないのですが参考になれば...

この回答への補足

確かに、私の方でリクエストしている内容に不備があり再度リフレッシュでアクセスさせているのかと思い考えましたが、やはりわからず困っています。

ソースを下記に書きますので、これを参考に
もう少しアドバイスをお願いします。

#プロキシサーバー
use constant PROXY => 'http://proxy:8080/';

#URL
use constant URL =>'https://~';

my $Ua = LWP::UserAgent->new();
$Ua->agent("Schmozilla/v9.14 Platinum");
$Ua->proxy(['https', 'http', 'ftp'], PROXY);
$Ua->cookie_jar();

my $Req = HTTP::Request->new('GET', URL);
my $Res = $Ua->request($Req);

print "content-type:text/html\n\n";
if( $Res->is_success() ) {
print $Res->content;
} else {
print "Error";
}

補足日時:2005/12/12 13:10
    • good
    • 0

サイト側で、クッキーやリファラ、エージェント情報をみて、コンテンツを返してるかも。


LWP::UserAgent->cookie_jar()をセットアップした上で、ステップを分でサイトにアクセスしてみては。

この回答への補足

LWP::UserAgent->cookie_jar()を追加してみましたが、
だめでした。

補足日時:2005/12/12 13:07
    • good
    • 0

>Refresh: 0; URL=https://~


からリダイレクト先のアドレスを抽出して再度取得を試みるとかはやってみました?

この回答への補足

リダイレクト先のURLは最初にRequestで指定したアドレスとまったく同じでした。
なので、再度やっても同じです。

ん~やっぱり、HTTPSのサイトは取得じゃなくジャンプしないといけないのかもしれませんね。

補足日時:2005/12/09 17:04
    • good
    • 0

実際にhttpsからLWPってやってみたことはないのですが、


Crypt::SSLeay
をインストールするとLWPは自動でhttpsを使うということらしいので、別の問題なのではないかと思います。
例えば、IEでは、そのコンテンツが取得できるということであれば、
my $IE = Win32::OLE->GetActiveObject('InternetExplorer.Application');
でIEに取らせるということもできるかもしれません。
    • good
    • 0
この回答へのお礼

さっそく、回答ありがとうございます。

Win32::OLEも調べてみましたが、
IEを操作というのは
私がやりたい意図とはちょっと違っていましたので
あきらめました。

他に案ややり方をご存知の方どうかよろしくお願いいたします。

お礼日時:2005/12/09 11:15

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!