- ベストアンサー
Perl WWW::Mechanizeを使って特定のサイトにアクセスできない
- PerlのWWW::Mechanizeを使用して特定のサイトにアクセスしようとすると、画面が開かずロード中のままで開かれません。
- 他のサイトでは問題なく開くことができるため、特定のサイトに関連した問題があると考えられます。
- 該当のサイトにアクセスできない原因を特定し、解決策を見つけるために、コードやメカニズムを調査する必要があります。
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
#4です。おやまあ…。 こちらは自宅のLinuxですね。 Linuxの問題か、ネットワークの問題か、パッケージの問題か、でしょうか。 一先ずcurlでも実行してみて、通るか確認してみてはいかがでしょう。 こちらも通ることを確認しています。 通らないようなら、環境に問題ありですね。 $ curl https://salonboard.com/ -H 'User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:85.0) Gecko/20100101 Firefox/85.0'
その他の回答 (4)
- shiren2
- ベストアンサー率47% (139/295)
こんにちわ。 WWW::Mechanizeとかいうひどく懐かしい名前が見えたので覗いてみました。 こちらで試したところ、単にUAで弾いているだけみたいですね。 EdgeからUAを貰ってきて、以下のコードで試したところ、特に問題なくテスト通過確認出来ましたので、よろしければ参考にどうぞ。 実行環境は特に何も弄っていないLinux環境です。 #!/usr/bin/perl use strict; use WWW::Mechanize; use Test::More; use utf8; my $url = "https://salonboard.com/"; my $ua = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.96 Safari/537.36 Edg/88.0.705.5"; my $mech = WWW::Mechanize->new(agent => $ua); $mech->get($url); is($mech->status(), 200); ok($mech->content() =~ /サロン管理システム/); done_testing();
お礼
ありがとうございます。環境はご自宅などからのLinuxによるアクセスでしょうか。私はさくらサーバー上からアクセスを行っているのですが、掲載いただいたプログラムでアクセスができないようです。IPアドレスでブロックされているのでしょうか・・。
- asciiz
- ベストアンサー率70% (6803/9674)
Net::SSleay の方でできないか試していましたが、Net::SSleay::get_https は HTTP 1.0 しかアクセスできないようで、ダメでした(汗 (今時は普通、HTTP/1.1 で host: 行が必要です) OpenSSL コマンドによる手動アクセスは試されましたでしょうか?
お礼
ありがとうございます。ご教授いただいた通り、クライアントPC(Windows10)からのOPENSSLでの接続は確認できてHTMLが表示されました。そして念のためMechanizeを動かそうとしてる外部サーバー(CentOS)からコマンドでOPENSSLで接続を試みましたが、 CONNECTED(00000003) 34381021480:error:14077438:SSL routines:SSL23_GET_SERVER_HELLO:tlsv1 alert internal error:s23_clnt.c:802: と表示されて、接続できないようです。
補足
エラーメッセージの補足です。 no peer certificate available --- No client certificate CA names sent --- SSL handshake has read 7 bytes and written 307 bytes --- New, (NONE), Cipher is (NONE) Secure Renegotiation IS NOT supported Compression: NONE Expansion: NONE No ALPN negotiated SSL-Session: Protocol : TLSv1.2 Cipher : 0000 Session-ID: Session-ID-ctx: Master-Key: Key-Arg : None PSK identity: None PSK identity hint: None SRP username: None Start Time: 1611959771 Timeout : 300 (sec) Verify return code: 0 (ok) --- 証明書の問題のように叱られているようです。。。ToT
- asciiz
- ベストアンサー率70% (6803/9674)
>ご指摘いただいた文字列が含まれていませんでした。 ええと? >my $mech = WWW::Mechanize->new( agent=>"Mozilla/5.0 (Windows NT 10.0; Win64; x64) " ); の設定でアクセスしているのに >Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_0) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.56 Safari/535.11 が表示されたのですか? それはそれでUser_Agent設定が反映されていない、というおかしい話になりますが。 $url[0] = "http://www.nagaoka.jrc.or.jp/cgi-bin/env/envcheck.cgi"; としてそのプログラムを走らせ、設定したはずのUAと、表示されたUser_Agent文字列を比較すると、どうでしょうか?
補足
説明不足で申し訳ありませんでした。現在、試しにフル記述のUser Agentをセットして、 $url[0] = "http://www.nagaoka.jrc.or.jp/cgi-bin/env/envcheck.cgi"; として実行された結果が、Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_0) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.56 Safari/535.11となっていました。
- asciiz
- ベストアンサー率70% (6803/9674)
解決に至ってはいないのですが試したことなど。 まず $mech->timeout(3); を入れておいてアクセスすると、3秒でタイムアウトエラーが表示されます。 デフォルト180秒なんで、3分待っても同じエラーが出たでしょうけども、まあテストには短い方がいいので…。 で、SSLの対応レベルかとも思って、SSLeay 内蔵のOpenSSLバージョンを表示してみたところ、私のところでは以下の通り。 >C:\>perl -MNet::SSLeay -e "warn Net::SSLeay::SSLeay_version(0)" >OpenSSL 1.0.1g 7 Apr 2014 at -e line 1. OpenSSL 1.0.1 はTLS 1.2 までの対応。 でも salonboard.com 自体は、TLS 1.1 や TLS 1.2 でも接続できたので、そこも問題ないようです。 MechanizeはJavaScript非対応なのでそこか? …と通常ブラウザでスクリプト禁止にしてアクセスしてみましたが、それも問題なく画面は表示されます。 OpenSSL をインストールして手動アクセスしてみたところ、これも問題なし。 C:\> openssl s_client -connect salonboard.com:443 ←入力 CONNECTED(00000158) (中略) GET / HTTP/1.1 ←入力 host: salonboard.com ←入力 ←空Enter入力 HTTP/1.1 200 OK Server: Apache X-Frame-Options: SAMEORIGIN Last-Modified: Wed, 18 Sep 2019 05:59:46 GMT (以下HTMLヘッダとHTML本文) ではどうして WWW::Mechanize のアクセスでタイムアウトになってしまうのか…。 ここではたと気づいたのが、ユーザーエージェント文字列。 >http://www.nagaoka.jrc.or.jp/cgi-bin/env/envcheck.cgi こちらで、サーバーが受け取っている文字列を確認してみました。 すると、プログラムでは >my $mech = WWW::Mechanize->new( agent=>"Mozilla/5.0 (Windows NT 10.0; Win64; x64) " ); となっていますが、そのサイトで表示されたのは以下の通り。 >HTTP_USER_AGENT | Mozilla/5.0 (Windows NT 10.0; Win64; x64) libwww-perl/6.05 あー、これは!! もう一度手動アクセス実験します。 C:\> openssl s_client -connect salonboard.com:443 ←入力 CONNECTED(00000158) (中略) GET / HTTP/1.1 ←入力 host: salonboard.com ←入力 User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) libwww-perl/6.05 ←入力 ←空Enter入力 …反応がありません。 どうやらこのサイトは、ロボット対策として、ユーザーエージェント文字列に「libwww-perl」が含まれると、反応を返さなくなるように仕組まれているのではないかと…? (すぐに接続を切ったりエラーを返すと1秒に何百回もアクセスされたりするので、接続したうえで反応を返さない。) Mechanize の親である LWP(library: www perl) においては、必ずこのUA文字列が付加されてしまうようです。 LWPに頼らずに、自分でhttps通信してWebページ取得すればあるいは…。 サンプル >Net::SSLeay - OpenSSLやSSLeayを使うためのPerl拡張 - perldoc.jp >https://perldoc.jp/docs/modules/Net-SSLeay-1.20/SSLeay.pod ※Mechanize でhttps接続できているならば、既にNet::SSLeay は入っています
お礼
ご丁寧な返信大変恐縮です。当方でUser Agentをセットして、http://www.nagaoka.jrc.or.jp/cgi-bin/env/envcheck.cgi へMechanizeでアクセスを行った場合、User AgentはMozilla/5.0 (Macintosh; Intel Mac OS X 10_7_0) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.56 Safari/535.11と表示されご指摘いただいた文字列が含まれていませんでした。何か他にヘッダー情報で問題が在るのかどうかが分からないのですが、とにかく挙動をみていると全く受け付けていないように見えるのはご指摘の通りかと思います。
補足
ご丁寧な返信大変恐縮です。当方でUser Agentをセットして、http://www.nagaoka.jrc.or.jp/cgi-bin/env/envcheck.cgi へMechanizeでアクセスを行った場合、User AgentはMozilla/5.0 (Macintosh; Intel Mac OS X 10_7_0) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.56 Safari/535.11と表示されご指摘いただいた文字列が含まれていませんでした。何か他にヘッダー情報で問題が在るのかどうかが分からないのですが、とにかく挙動をみていると全く受け付けていないように見えるのはご指摘の通りかと思います。
お礼
お世話になっております。$ curl https://salonboard.com/ -H 'User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:85.0) Gecko/20100101 Firefox/85.0'を実行してみましたが、やはり通らないようです。自宅のLinux側からテストを行った場合、Mechanizeもcurlも通るようです。やはりIPなのですかね。。cookieは取得できているので接続がされた後で遮断されているようです。