プロが教える店舗&オフィスのセキュリティ対策術

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はインストールされていないので
使えない状況で、おそらく他の言語も厳しい状況です。

他のサンプル、方法などご存知の方
いらっしゃいましたら教えて頂きたいです。

宜しくお願い致します。

A 回答 (7件)

Futomiのサーバアナライザーを入れてサーバの使えるモジュールをチェックすることをお勧めします(ググればすぐ見つかります)。


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

この回答への補足

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

補足日時:2008/09/19 16:51
    • good
    • 0
この回答へのお礼

返信が遅くなりまして申し訳ありません。
ご回答ありがとうございます!

>Futomiのサーバアナライザーを入れて
こちら早速使ってみたところ
サーバーの詳細状況がわかりました!
ありがとうございます!

>Socketも可能性は低いかも
Socketはインストールされている
perlモジュール一覧に出ているので
インストールされておりました。

>LWPは「lib​www-perl-5.8xxx​」という
>パッケージに入っていてCPANのサイトから
>ダウンロードできます。
こちらなんですがちょっと見つけることができませんでした。
ANo.1さんの方法でLWPを呼び出すということですよね?
仕組みはなんとなく理解できているのですが
いかんせん動いてくれません。。。

何かお心当たりがあればまたご回答をお願いします。
宜しくお願い致します。

お礼日時:2008/09/19 16:50

ANo.3&ANo.6です。


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

すみません。当方の勘違いで返事が投稿されておりませんでした。

ご回答ありがとうございます!
ralf124cさんをはじめ皆様のソース、
アドバイスを元に色々試してみたのですが
ちょっと解決には至りませんでした。

おそらく当方のperlの知識不足だと思い
1から勉強を始めました。
その中で改めて皆さんのソース、
アドバイスを活用させて頂き
引き続き研究を重ねたいと思います。

お礼日時:2008/10/05 14:40

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;
}
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます!

>このままでは使えないので改造が必要とは思いますが
URLの部分を変更する以外に
改造が必要な箇所はありますでしょうか?

またサーバーはアナライザーで確認したところ
UNIXなんですが、Jcodeのモジュールがありませんでしたので
またエラーが表示されてしまいました。
------------------------------------------------------
Internal Server Error
The server encountered an internal error or misconfiguration and was unable to complete your request.
------------------------------------------------------

Jcodeを使わない場合以下の行を削除する以外に
変更が必要な箇所はありますでしょうか?
------------------------------------------------------
use Jcode;
------------------------------------------------------

度々すみませんがご確認をお願い致します。

お礼日時:2008/09/23 15:51

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で行っていないのですか?
面倒でもサーバーと出来る限り似た環境を用意すると問題解決に役立つと思いますよ。

この回答への補足

すみません。
開発環境の補足です。

OS:windows
サーバ:Apache2.2
perl 5.10.0.1002

上記になります。
他にも必要でしたら申し付け下さい。

補足日時:2008/09/21 01:23
    • good
    • 0
この回答へのお礼

早速のご回答ありがとうございます!

>まず、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";
--------------------------------------------
こちらは保存しましたら表示されました。

環境はやはりバージョン古いものに落として
試すほうがよさそうですね。
また時間を作ってやりたいと思います。

何度もすみません。
また何かお気づきの点がありましたら
書き込みをお願い致します!

お礼日時:2008/09/21 02:04

こんにちは、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 さんの勧めるやり方を参照されたら良いと思います。
    • good
    • 0
この回答へのお礼

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

上記三行を消して実行してみたのですが
やはり前回同様のエラーが出てしまいます。

Socketに関してはサーバーの詳細を確認したところ
インストールされているようです。

う~ん、こちらのサーバーの
perlのバージョンが古過ぎるんですかね^^;
サーバー替えられるなら替えたい心境です(苦笑

またなにかありましたら
些細なことでもかまいませんので
ぜひ書き込みをお願い致します!
ありがとうございました!

お礼日時:2008/09/19 21:46

こんにちは、


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_ranki …

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_ranki …
# からのレスポンスを 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を使わないで取得するまでは参考になるかもしれません。
取得後の加工はテキトーなので、参考にならないでしょう。

この回答への補足

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

補足日時:2008/09/19 16:38
    • good
    • 0
この回答へのお礼

返信が遅くなりまして申し訳ありません。
ご回答ありがとうございます!

こちらのソースをコピーペーストして
test.cgiというファイルを作成。
http://******/test.cgi
ブラウザにてアクセスしましたが
以下エラーメッセージが表示されてしまいました。

The server encountered an internal error or misconfiguration and was unable to complete your request.

使い方が間違っていましたら教えて頂きたいです。
宜しくお願い致します。

お礼日時:2008/09/19 16:37

> LWPライブラリがインストールされておらず...


あまり詳しいわけではないですが、
use lib './lib';
とかやると、自分のディレクトリに置いたモジュールが使えるようになるみたいです。

http://hail2u.net/blog/coding/push_at_inc_and_us …
http://d.hatena.ne.jp/magicalhat/20070419/117695 …

例として、FreeStyleWikiでは、LWPモジュールを同梱して、LWPモジュールがサーバーにインストールしてあるかどうかにかかわらず動くようにしているので、ちょっと参考にしてみるといいかと思います。

この回答への補足

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

補足日時:2008/09/19 16:30
    • good
    • 0
この回答へのお礼

返信が遅くなりまして申し訳ありません。
ご回答ありがとうございます!
以下のようにしてみましたが
動きませんでした。
どこか間違っている箇所がありましたら教えて頂きたいです。

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で設定しています。

宜しくお願い致します。

お礼日時:2008/09/19 16:27

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