• ベストアンサー

LWPを使わずに別ドメインのrssファイルを読み込む

perlで別ドメインのブログのrssファイルを HPに表示させたいと考えています。 こちらはphpですがこれと同じ事を perlでやりたいと考えています。 http://ajax.pgtop.net/category/4527871-1.html しかし、レンタルしているサーバーに LWPライブラリがインストールされておらず LWPを使っていないであろう下記サンプルを試してみたのですが HTTPエラー:500と表示されるだけでした。 http://www.kawa.net/works/perl/feedpp/feedpp.html サーバーではplファイル・cgiファイルを使っている 箇所もあり、それらは機能しているので perlはインストールされているのですが ライブラリ関連はほぼインストールされていない状況だと思います。 ちなみにPHPはインストールされていないので 使えない状況で、おそらく他の言語も厳しい状況です。 他のサンプル、方法などご存知の方 いらっしゃいましたら教えて頂きたいです。 宜しくお願い致します。

質問者が選んだベストアンサー

  • ベストアンサー
  • ralf124c
  • ベストアンサー率52% (232/446)
回答No.3

Futomiのサーバアナライザーを入れてサーバの使えるモジュールをチェックすることをお勧めします(ググればすぐ見つかります)。 PHPもLWPの無いガチガチのサーバならSocketも可能性は低いかも LWPは「libwww-perl-5.8xxx」というパッケージに入っていてCPANのサイトからダウンロードできます。ざっと見てもバイナリ部分が見つからないのでANo.1さんの方法で可能かも知れません。 以前回答した「http://hiroba.kodate.jp/qa4024132.html」もANo.2さんとダブりますがご参考までに。

yanagiman2
質問者

お礼

返信が遅くなりまして申し訳ありません。 ご回答ありがとうございます! >Futomiのサーバアナライザーを入れて こちら早速使ってみたところ サーバーの詳細状況がわかりました! ありがとうございます! >Socketも可能性は低いかも Socketはインストールされている perlモジュール一覧に出ているので インストールされておりました。 >LWPは「lib​www-perl-5.8xxx​」という >パッケージに入っていてCPANのサイトから >ダウンロードできます。 こちらなんですがちょっと見つけることができませんでした。 ANo.1さんの方法でLWPを呼び出すということですよね? 仕組みはなんとなく理解できているのですが いかんせん動いてくれません。。。 何かお心当たりがあればまたご回答をお願いします。 宜しくお願い致します。

yanagiman2
質問者

補足

ちなみにこちらの開発環境はwindowsで サーバーはFreeBSD 4.7 perlは5.00503 であることがわかりました。

その他の回答 (6)

  • ralf124c
  • ベストアンサー率52% (232/446)
回答No.7

ANo.3&ANo.6です。 > Jcodeを使わない場合以下の行を削除する以外に > 変更が必要な箇所はありますでしょうか? 出力がベタでいいならCGIのコードをRSSのコード(UTF-8)に合わせるぐらいでしょうか。 読み込むRSSが一箇所なら配列での処理は無駄になりますのでメインのループも不要になってコードもすっきりするかと思います(元は複数のRSSを読み込むようにしていたため)。 後、テーマ設定の配列が不要(これもRSSをHTMLに変換して利用していた名残)なのでこれも消しといてください。 とりあえず何事もトライしてみることが解決と学習の早道です。 失敗してから問うようにしたほうが回答を得やすいかと思います。

yanagiman2
質問者

お礼

すみません。当方の勘違いで返事が投稿されておりませんでした。 ご回答ありがとうございます! ralf124cさんをはじめ皆様のソース、 アドバイスを元に色々試してみたのですが ちょっと解決には至りませんでした。 おそらく当方のperlの知識不足だと思い 1から勉強を始めました。 その中で改めて皆さんのソース、 アドバイスを活用させて頂き 引き続き研究を重ねたいと思います。

  • ralf124c
  • ベストアンサー率52% (232/446)
回答No.6

ANo.3です。 以下をCGIにして配列@flsを記述してUNIXサーバ上で動かないでしょうか? 数年前に作ったのをフリーにしてはいるんですがリンク張ると規約違反になるのでソースのキモをピックアップして見ました。 このままでは使えないので改造が必要とは思いますが #!/usr/bin/perl -w ## ********************************************************************* use Jcode; use strict; use Socket; use FileHandle; ## 読込先RSS-URL my @fls = ( 'http://www.hogehoge.jp/rss.xml', 'http://www.hogehoge2.jp/rss.xml' ); ## テーマ設定 my @area_name = ( '『テーマ1』 ', '『テーマ2』 ' ); ## ********************************************************************* my @dtlist; for(my $k=0; $k <= $#fls; $k++){ my @xml_data = &getXmlData($fls[$k]); ## データ取得 my $sALLDATA = join("",@xml_data); print $sALLDATA; } ## 処理終了 exit; ## ********************************************************************* sub getXmlData{ my ($AccPage,@waste) = @_; my ($proxy_host, $proxy_port, $http); my ($con_host, $con_port); my ($host, $port, $url, $path, $ip, $sockaddr); my ($arg, $buf); my @b01; $arg = $AccPage; # デフォルトホストの設定 $host = 'www.hogehoge.jp'; ## ダミー $port = getservbyname('http', 'tcp'); $path = '/index.xml'; ## ダミー # URL解析処理 $arg =~ m!(http:)?(//)?([^:/]*)?(:([0-9]+)?)?(/.*)?!; if ($3) {$host = $3;} if ($5) {$port = $5;} if ($6) {$path = $6;} $con_host = $host; $con_port = $port; $url = $path; # ソケットの生成 $ip = inet_aton($con_host) || die "host($con_host) not found.\n"; $sockaddr = pack_sockaddr_in($con_port, $ip); socket(SOCKET, PF_INET, SOCK_STREAM, 0) || die "socket error.\n"; # ソケットの接続 connect(SOCKET, $sockaddr) || die "connect $con_host $con_port error.\n"; autoflush SOCKET (1); # HTTP要求を送信 if ($http eq '1.1') { print SOCKET "GET $url HTTP/1.1\n"; print SOCKET "Host: $host\n"; print SOCKET "Connection: close\n\n"; } else { print SOCKET "GET $url HTTP/1.0\n"; ## 以下一行、特定のWebサーバ用に追加→他で利用の際には要コメントアウト ## print SOCKET "Host: $host\n"; print SOCKET "Connection: close\n\n"; } # HTTP応答を受信 while (chomp($buf=<SOCKET>)) { push(@b01,$buf); } # 終了処理 close(SOCKET); return @b01; }

yanagiman2
質問者

お礼

ご回答ありがとうございます! >このままでは使えないので改造が必要とは思いますが URLの部分を変更する以外に 改造が必要な箇所はありますでしょうか? またサーバーはアナライザーで確認したところ UNIXなんですが、Jcodeのモジュールがありませんでしたので またエラーが表示されてしまいました。 ------------------------------------------------------ Internal Server Error The server encountered an internal error or misconfiguration and was unable to complete your request. ------------------------------------------------------ Jcodeを使わない場合以下の行を削除する以外に 変更が必要な箇所はありますでしょうか? ------------------------------------------------------ use Jcode; ------------------------------------------------------ 度々すみませんがご確認をお願い致します。

  • teapots08
  • ベストアンサー率52% (32/61)
回答No.5

No.1のteapotsです。 まず、use FindBin;とありますが、FindBinモジュールは使える状態なのでしょうか? ########## > 【lib】  ここにFreeStyleWikiから落としたSource.pmを配置 なぜ敢えてSource.pmを選んだのかがよくわからないです。 FreeStyleWikiを落としたのでしたら、その中にあるlibフォルダの中身全部を【lib】に入れて試してください。 (モジュール内の依存関係を調べるのが面倒だから。) また、 「HTTPエラー:500」や「The server encountered an internal error or misconfiguration and was unable to complete your request.」では、プログラムのどの部分でエラーが出ているのかわかりませんから、use lib "$FindBin::RealBin/lib";の下に use CGI::Carp qw(fatalsToBrowser); を追加してください。 (エラーの内容を詳しくブラウザに出力するモジュールです。もちろん、【lib】内に、モジュールの本体が無ければいけません。freestylewikiのwiki.cgiの中にもありますが、エラーが出なければ必要ないのでコメントアウトしてあります。) ######### perlが5.00503って、かなり古いような気がします。 サーバー上で「perl -c test.cgi」のように、エラーのチェックを行うと、何かわかるかもしれません。 ところで、開発環境(windows)でのwebサーバーのソフト名やperlのバージョンが書いてありませんが、プログラムのテストは自分のPCで行っていないのですか? 面倒でもサーバーと出来る限り似た環境を用意すると問題解決に役立つと思いますよ。

yanagiman2
質問者

お礼

早速のご回答ありがとうございます! >まず、use FindBin;とありますが、 >FindBinモジュールは使える状態なのでしょうか? こちらなんですが、NO.3さんのアドバイスで頂きました サーバアナライザーで確認したところ大丈夫でした。 > 【lib】  ここにFreeStyleWikiから落としたSource.pmを配置 >なぜ敢えてSource.pmを選んだのかがよくわからないです。 すみません。落とすものを間違えておりました。 wiki3_6_2.zipこちらを落としなおしたところ たくさん入っておりました^^; >use CGI::Carp qw(fatalsToBrowser); >を追加してください。 ありがとうございます! こちらを加えたところパスの指定間違いが発見できました! -------------------------------- use lib "$FindBin::RealBin/../lib"; ←のように修正しました。 -------------------------------- しかし、またエラーが出てしまいます。 ---------------------------------------------------- aborted due to compilation errors. ---------------------------------------------------- >サーバー上で「perl -c test.cgi」のように、 >エラーのチェックを行うと、何かわかるかもしれません。 こちらなんですが下記のファイルのようなことでしょうか? -------------------------------------------- #!/usr/bin/perl print "Content-type: text/html\n\n"; print "<html>\n"; print "<body>\n"; print "これが見えたら成功です\n"; print "</body>\n"; print "</html>\n"; -------------------------------------------- こちらは保存しましたら表示されました。 環境はやはりバージョン古いものに落として 試すほうがよさそうですね。 また時間を作ってやりたいと思います。 何度もすみません。 また何かお気づきの点がありましたら 書き込みをお願い致します!

yanagiman2
質問者

補足

すみません。 開発環境の補足です。 OS:windows サーバ:Apache2.2 perl 5.10.0.1002 上記になります。 他にも必要でしたら申し付け下さい。

  • g_p_
  • ベストアンサー率53% (28/52)
回答No.4

こんにちは、ANo.2 です。 use 5.008;してるので、5.8未満のバージョンではエラーになります。 IO::Socket がいつから標準モジュールなのか知らないので、 アレなんですが、 とりあえず、 use 5.008; use Encode qw(from_to); from_to($res, 'UTF-8', 'Shift_JIS'); の3行を消してみたらどうなりますか? ※元々、shift-jis にエンコードして正規表現にかけるのはまずかったですね。とりあえず UTF-8 のままで。 なんかダメそうな気がしますが… ダメなら、ANo.3 さんの勧めるやり方を参照されたら良いと思います。

yanagiman2
質問者

お礼

さっそくのご回答ありがとうございます! 上記三行を消して実行してみたのですが やはり前回同様のエラーが出てしまいます。 Socketに関してはサーバーの詳細を確認したところ インストールされているようです。 う~ん、こちらのサーバーの perlのバージョンが古過ぎるんですかね^^; サーバー替えられるなら替えたい心境です(苦笑 またなにかありましたら 些細なことでもかまいませんので ぜひ書き込みをお願い致します! ありがとうございました!

  • g_p_
  • ベストアンサー率53% (28/52)
回答No.2

こんにちは、 perl5.8 では一応動きました。 #! /usr/bin/perl use 5.008; use strict; use warnings; use IO::Socket; use Encode qw(from_to); my $url = 'http://oshiete.goo.ne.jp/rss/qa_ranking/qa_ranking_255.xml'; my( $host , $path ) = $url =~ m{^http://([^/]+)(.*)}; my $port = 80; my $socket = IO::Socket::INET->new("$host:$port") or die "socket error!"; print {$socket} << "END_OF_REQUEST"; GET $path HTTP/1.1 Host: $host Connection: close END_OF_REQUEST $socket->flush(); my $res; { local $/ = undef; $res = <$socket>; } $socket->close; # # 以下かなりテキトーに http://oshiete.goo.ne.jp/rss/qa_ranking/qa_ranking_255.xml # からのレスポンスを html のリストに加工してます。 # from_to($res, 'UTF-8', 'Shift_JIS'); my @items = (); for my $item ( $res =~ m{<item\s[^>]+>(.+?)</item>}gms ) { push @items , {$item =~ m{<([^>]+)>([^<]+?)</\1>}gms}; } # html 出力 print "Content-Type: text/html\n\n"; print "<ul style=\"list-style-type:decimal\">\n"; for my $item ( @items ) { print q{<li><a href="} . $item->{link} . q{">} . $item->{title} . qq{</a></li>\n}; } print "</ul>" __END__ とりあえず、LWPを使わないで取得するまでは参考になるかもしれません。 取得後の加工はテキトーなので、参考にならないでしょう。

yanagiman2
質問者

お礼

返信が遅くなりまして申し訳ありません。 ご回答ありがとうございます! こちらのソースをコピーペーストして test.cgiというファイルを作成。 http://******/test.cgiと ブラウザにてアクセスしましたが 以下エラーメッセージが表示されてしまいました。 The server encountered an internal error or misconfiguration and was unable to complete your request. 使い方が間違っていましたら教えて頂きたいです。 宜しくお願い致します。

yanagiman2
質問者

補足

ちなみにこちらの開発環境はwindowsで サーバーはFreeBSD 4.7 perlは5.00503 であることがわかりました。

  • teapots08
  • ベストアンサー率52% (32/61)
回答No.1

> LWPライブラリがインストールされておらず... あまり詳しいわけではないですが、 use lib './lib'; とかやると、自分のディレクトリに置いたモジュールが使えるようになるみたいです。 http://hail2u.net/blog/coding/push_at_inc_and_use_lib.html http://d.hatena.ne.jp/magicalhat/20070419/1176951401 例として、FreeStyleWikiでは、LWPモジュールを同梱して、LWPモジュールがサーバーにインストールしてあるかどうかにかかわらず動くようにしているので、ちょっと参考にしてみるといいかと思います。

yanagiman2
質問者

お礼

返信が遅くなりまして申し訳ありません。 ご回答ありがとうございます! 以下のようにしてみましたが 動きませんでした。 どこか間違っている箇所がありましたら教えて頂きたいです。 cgi-binの下に以下2フォルダを配置 【pl-cgi】 pl,cgiファイルを格納しているフォルダ 【lib】  ここにFreeStyleWikiから落としたSource.pmを配置 pl-cgiフォルダには以下cgiファイルを格納 #!/usr/bin/perl use FindBin; use lib "$FindBin::RealBin/lib"; use LWP::UserAgent; $ua = LWP::UserAgent->new; $req = HTTP::Request->new(GET => "http://pc.watch.impress.co.jp/sublink/pc.rdf"); $res = $ua->request($req); print "Content-Type: text/xml\n\n"; if ($res->is_success) { print $res->content; } else { print "<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n"; print "<Error>an error occurred</Error>\n"; } 上記結果をjavascriptで解析してみましたが 実行結果はHTTPエラー:500となってしまいます。 あとcgiのパーミッションは755で設定しています。 宜しくお願い致します。

yanagiman2
質問者

補足

ちなみにこちらの開発環境はwindowsで サーバーはFreeBSD 4.7 perlは5.00503 であることがわかりました。

関連するQ&A