• ベストアンサー

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はインストールされていないので 使えない状況で、おそらく他の言語も厳しい状況です。 他のサンプル、方法などご存知の方 いらっしゃいましたら教えて頂きたいです。 宜しくお願い致します。

  • Perl
  • 回答数7
  • ありがとう数9

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

  • ベストアンサー
  • 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

  • Perlで言う、LWP HTTPをPHPで

    PerlでのスクリプトをPHPに移行しようかと考えております。(勉強のため) それで、PerlのモジュールでいうLWPとHTTPに代わるクラスライブラリ(API)は、どれにあたるのでしょうか? 具体的には、LWP::UserAgentとHTTP::Requestです。 ※詳しくは、 my $wa = new LWP::UserAgent; my $req = new HTTP::Request(GET => $url); my $res = $wa->request($req); PHPのドキュメント(http://www.php.net/manual/ja/)を見たのですが、いまいちピンときませんでした。 参考URLで結構ですので、よろしくお願いいたします。

    • ベストアンサー
    • PHP
  • 別ドメインのRSSを表示させたい

    こんにちは。PHP初心者です。 外部RSSを表示させたいなと思い、phpspotで紹介されている「外部RSSを読み込み」のスクリプトを実行したのですが、 Warning: fopen(http://www3.asahi.com/rss/index.rdf): failed to open stream: HTTP request failed! とURLを読み込む箇所でエラーが表示されます。何かインストール、もしくは設置する必要があるのでしょうか?それともこのサンプルソースは改変する必要があるのでしょうか? 試しにこのスクリプトで使用されているURL以外のURLを用いてみても同じエラーが表示されました。現在使っているサーバーに何か問題があるのでしょうか? 今回使用したスクリプトは以下のページのものです。 http://phpspot.net/php/pg%8AO%95%94%82q%82r%82r%82%F0%93%C7%82%DD%8D%9E%82%DD.html 動作環境 Windows XP Apache/2.0.59 PHP/4.3.2 また、その他の方法もないかと思い探してみたところLucky bagさんのページでも紹介されていたので、そのサンプルソースをそのまま使ってみました。結果は何も表示されませんでした。改変する必要があるのでしょうか? Lucky bag http://www.lucky-bag.com/archives/2005/05/hot_entry.html さらに探してみたところLet's PHPさんのところでも紹介されていました。こちらのRSSブロガーを用いればできるとのことなので、動かしてみたのですが、やはり何も表示されません。 Let's php http://php.s3.to/net/#rss 外部RSSを表示させるサンプルソース・スクリプトをとりあえず動かしたいのですがどうしたらよいでしょうか?またはどこか他に動くサンプルが置いてありますでしょうか?ご存知の方いましたら教えてください。できれば一番上の方法で実行させたいのですが・・・。よろしくお願いいたします。

    • ベストアンサー
    • PHP
  • phone.plのPHP版

    携帯電話版ホームページを作る際に機種情報(画像サイズや表示可能な画像の種類など)のライブラリで phone.pl(http://www.kawa.net/works/perl/phone/pnews.html) というものがありますが、これのPHP版はありますでしょうか?あればそのURLを教えていただきたいです。 よろしくお願いします。

    • 締切済み
    • PHP
  • LWP Cookie取得

    恐れ入ります。 LWPで、特定サイトにアクセスした時に発行されるCookieを任意のディレクトリに保存したいのですが、どのようにしたらよいかわかりません。 use HTTP::Cookies; use LWP::UserAgent; $ua = LWP::UserAgent->new(); $cookie_file = './cookie/xxx.txt'; $cookie_jar = HTTP::Cookies->new(file => $cookie_file, autosave => 1); $url = "http://~~"; $response = $ua->get($url); print $response->content; で、コンテンツは表示されますが、xxx.txtにcookieが保存されません。 #LWP-Cookies-1.0 のみが記載された白紙のxxx.txtが精製されます。 よろしくお願いします。

    • ベストアンサー
    • Perl
  • LWPで応答データを取得できない

    お世話になります。 perl5でLWPを使用しているのですが、一部のサイトでデータを取得できず困っております。 具体的には my $ua = LWP::UserAgent->new; $ua->agent('Mozilla/5.0'); my $req = HTTP::Request->new(GET => "http://misshiki.blog7.fc2.com/?xml"); my $res = $ua->request($req); my $buf = $res->content; といった感じでRSSを取得したいのですが、$bufが空になってしまいます。 しかし、 $res->as_string とすると、レスポンスヘッダも含めてRSSが取得できていることが確認できます。 また、上記以外のURLでは正常に$res->contentでデータを取得することができています。 どうもFC2ブログのRSSのみの事象のようではあるのですが、対処方法がわからず困っております。 対策をご教授いただければ幸いです。 以上、よろしくお願いいたします。

    • ベストアンサー
    • Perl
  • LWP::Simple::mirrorが実行できません。

    現在、 http://blog.bulknews.net/cookbook/blosxom/rss/rss2js.html にある「RSS feed を JavaScript で HTML に埋め込む」を 実装しようとしています。 Perlは、正常に動作しているのですが、 rss2js.pl の中の ------------------ my $status = LWP::Simple::mirror($url, $cache); if (is_error($status)) { die "$url not found!\n"; } else { rss2js($cache, $num, $encoding); } -------------------- のところで、mirror()がうまくいっていないみたいで、 not foundのエラーが表示されてしまいます。 ソース上は、特に問題ないと思うのですが、 実行環境に問題があるのでしょうか。 ちなみに、環境は  Windows 2003 Server Standard Edition  IIS  ActivePerl 5.8 を使用しています。 URLには、  http://news.goo.ne.jp/news/rss/topics/keizai/index.rdf を指定しています。 mirrorは、UNIXやLinuxでないと使えないのでしょうか?

    • ベストアンサー
    • Perl
  • Perl LWPでproxyがうまく刺さらない

    Perl初心者です。 LWPでどうしてもproxyが通りません・・・。 何が悪いのかわかりません。教えてください。 モジュールは全て導入を確認しました。 よろしくお願いします。 稚拙なミスだったらごめんなさい。 use LWP::Simple; use LWP::UserAgent; use HTTP::Request::Common; my $ua = LWP::UserAgent->new( timeout=>"5" ); #cybersyndromeさんからLWP::Simpleでproxyを取得 $_ = get('http://www.cybersyndrome.net/pla5.html'); #proxyをリストに代入 (@proxy_list)=/\"\>(.*?)\<\/a\>\<\/li\>\<li\>/g; #適当なサイトをリクエストのターゲットに $r = new HTTP::Request GET,('http://taruo.net/e/'); #前述のターゲットへリクエストしてひとつづつproxyが通るか確かめたいのに何故かすべてすぐにERRORに for($i = 0;$i <= 10;$i++){ $proxy = 'http://'.$proxy_list[$i]; $ua->proxy ([qw(http https)] , $proxy); $req = $ua->request($r); if ($req->is_success) { print "Success!\n"; }else{ print "Error\n"; } }

    • ベストアンサー
    • Perl
  • 他ドメインのRSSを自分のホームページにロゴなしで表示したいんです。

    ブログの事があまりわかってない素人です。 ブログの新規件名(リーダー)を自分のページに表示させてたいだけなんんですが、 行き詰まりました。 http://rss.tc/ (A) ここのように、簡単にできるもので、ロゴが入らないものが欲しいのです。そういうロゴの入らないものありますか? (B) http://www.kawa.net/works/ajax/rss/rss-box.html また、ここについても、他のドメインのRSSは取れないということで断念しました。 結局さがしきれませんでした。。。 ご存知のかたいらっしゃないでしょうか? よろしくお願いいたします。m(_ _)m

  • phpで外部ファイルの実行方法を教えて下さい。

    現在、linux、phpでアプリケーションの開発をしているのですが、まだまだ素人で、外部ファイルの実行がうまくできません。 どなたかご教授していただけますでしょうか。 【やりたいこと】 ・phpファイルで同じサーバー内にあるphpファイルを実行する。 以前は実行するファイルがperlであり、phpファイルで、 exec("perl /var/www/test/encoder/test.pl"); を記述することで、うまくtest.plが実行されていました。 今回、test.plをphpに書き直し、tet.phpを実行したいのですが、 なかなかうまくいきません。 exec、systemなどを色々試み、ネットでも調べてみたのですがうまくいかないので、どなたかご教授いただけますでしょうか。 よろしくお願いいたします。

    • 締切済み
    • PHP
  • .NETを使わずにRSS読み込み

    お世話になります。 外部ドメインのブログのRSS(RDF)を読み込み表示するASPを作りたいと考えています。 ただし、サーバーの管理権限の都合上、.NETの組み込みができないため、ASPだけでRSSの表示ができないか模索中です。 そのため、ASPでRSS表示をしているサンプルスクリプトはどこかに公開されていないでしょうか。また、そもそもASPのみで外部のRSS表示は可能なのでしょうか。 質問の内容も至らない点が多々あるかと思いますが、宜しくお願い致します。

専門家に質問してみよう