サーチエンジン+自前単語検索を実現するには
[上に]
[前に]
[次に]
真樹
[E-Mail]
1999/11/22(月) 16:24:31
解りづらいタイトルで済みません。
infoseekなどで、自分のページにフォームを張り付けて使用して、
submitするとinfoseekの検索結果ページが表示できるようなキットがありますが、
あのフォームを流用して、
"サーチエンジン + 自前で用意した単語検索"
を実現したいのですが、なかなかスクリプトがまとまりません。
具体的に言うと、
<form>に入った単語が、"ほげげ" だったら、その単語用の解説ページを自前で用意して表示し、
それ以外だったらinfoseekへ単語を送って普通通り処理を任せてしまう、と言うことです。
htmlとcgi(perl)を使用可能な環境です。
cgiの中で、
print " <form method=\"post\" action=\"&サブ関数\">";
print " <input type=\"text\" name=\"word\" size=\"35\" maxlength=\"256\">";
print " <input type=\"submit\" value=\"seek\">";
print " </form>";
sub サブ関数
{
if ($word eq "ほげげ")
{
print <<"END";
(自前の検索結果を表示)
END
exit;
}
else
{
(infoseekへ処理を受け渡す)
}
}
みたいなことをやれば実現できると思うのですが・・・。
参考までに、infoseekのキットは以下のようになっています。
<form method="post" action="http://www.infoseek.co.jp/Titles">
<input type="text" name="qt" size="35" maxlength="256"><input type="hidden" name="sv" value="jp">
<input type="hidden" name="lk" value="noframes"><input type="hidden" name="rt" value="jg">
<input type="submit" value="seek">
</form>
仮にelseの下にこれを挿入しようとするならば、
また別画面を展開しなくてはならなくてスマートではありません。
ユーザ側には1枚のhtml(cgi)を見せて、1回のsubmitだけで完了させたいです。
問題なのが、
・cgiの中で、<form>のactionでサブ関数へのデータの受け渡し方
・infoseekへのデータの受け渡し方
です。
2番目の問題は、document.form.submit()を使うという手がありますが、
せっかくcgiを使えるので、
JavaScriptをoffにしているユーザでも使えるようにしたいので避けたいです。
わがままな仕様ですが、アドバイスをお願いいたします。
andi
1999/11/22(月) 17:52:58
print "Location: http://www.infoseek.co.jp/Titles?qt=うんぬん&lk=noframe\n\n"
・・・ってやって出来たら良いな(笑)。
真樹
[E-Mail]
1999/11/24(水) 13:32:04
なるほど・・・。
Locationのurlにそのまま文字列をくっつけてしまうわけですね。
これだと文字コード変換スクリプトが必要ですね。
作るのが大変です・・・・。
どちらかに、この機能を果たすモジュールを公開されてないですかね?
andi
1999/11/24(水) 17:52:33
>これだと文字コード変換スクリプトが必要ですね。
jcodeコンバート前と後の文字列を別に持てば可能だと思います。
意味あってますか?
真樹
[E-Mail]
1999/11/24(水) 18:36:54
>jcodeコンバート前と後の文字列を別に持てば可能だと思います。
>意味あってますか?
どうなのでしょうか・・・。
実は詳しくないので解らないです・・・・。
infoseekなどで検索をかけると、
http://www.infoseek.co.jp/Titles?qt=%A4%C8%A4%DB%A4%DB&lk=noframes&svx=10&col=JW&qp=0&nh=10
みたいになりますよね。
この、
%A4%C8%A4%DB%A4%DB
の部分みたいに、
FORMから受け取ったデータから変換しなければならないのかと思ったのですが、
合っているでしょうか?
andi
1999/11/24(水) 19:26:21
とりあえず試してみては如何でしょう?
>作るのが大変です・・・・。
さっき直接
http://www.infoseek.co.jp/Titles?qt=あいうえお&lk=noframes&svx=10&col=JW&qp=0&nh=10
ってやったら検索できたから作らなくてもできるかも(笑)。
どうでしょうね。
ふじ
1999/11/24(水) 21:22:37
>FORMから受け取ったデータから変換しなければならないのかと思ったのですが、
URLエンコード(エスケープ)ですね。
http://www.tohoho-web.com/wwwcgi3.htm#CgiEncode
http://www.din.or.jp/~ohzaki/perl.htm#JP_Escape
こちらをどうぞ。
真樹
[E-Mail]
1999/11/25(木) 15:50:19
andiさん、ふじさん、ありがとうございます。
とりあえずinfoseekに情報を渡すのは大丈夫そうですね・・・。
残る問題なのですが、
同じcgiファイルの中での、
フォームに入れて貰ったデータの渡し方がうまくできません。
これをクリアすれば実現できそうなのですが・・・。
真樹
[E-Mail]
1999/11/25(木) 16:22:26
andiさん、ふじさん、ありがとうございます。
とりあえずinfoseekに情報を渡すのは大丈夫そうですね・・・。
残る問題なのですが、
同じcgiファイルの中での、
フォームに入れて貰ったデータの渡し方がうまくできません。
これをクリアすれば実現できそうなのですが・・・。
真樹
[E-Mail]
1999/11/29(月) 01:42:01
時間が開いてしまいました。
試行錯誤の結果、このようなスクリプトを作成いたしました。
(参考スクリプト:CGIレスキュー CGIでアクセス制限)
infoseekに渡す検索対象文字列ですが、
スクリプトの途中で何カ所もalartで変数の値をチェックいたしましたが、
URIエンコードしなくても動作するようです。
もし、「こんな時にエラーになるよ」という情報がございましたらお教えください。
また、他のケースで、「このスクリプトには問題がある!!」というご意見もお待ちしております。
自分で作っておいてなんですが、不安でテスト以降常設はしておりません。(苦笑)
#!/usr/local/bin/perl
if ($ENV{'QUERY_STRING'} ne '')
{
&error;
}
$method = 'post'; read(STDIN,$buffer,$ENV{'CONTENT_LENGTH'});
if ($buffer eq '')
{
print <<"EOF";
Content-type: text/html\n
<html><head><title>検索単語入力</title></head><body>
<h3>検索単語入力</h3>
<form method=$method action="$ENV{'SCRIPT_NAME'}">
<input type=text name="word" size=30><input type=submit value=" O K ">
</form>
</body></html>
EOF
exit;
}
($name, $word) = split(/=/, $buffer);
if ($word eq "hoge")
{
print "Content-type: text/html\n\n";
print "<html><head><title>hoge</title></head>\n";
print "<body>\n";
print "<h1>hogeについて</h1>\n";
print "</body></html>\n";
exit;
}
elsif ($word eq "fuga")
{
print "Content-type: text/html\n\n";
print "<html><head><title>fuga</title></head>\n";
print "<body>\n";
print "<h1>fugaについて</h1>\n";
print "</body></html>\n";
exit;
}
else
{
print "Location: http://www.infoseek.co.jp/Titles?qt=$word&lk=noframes&svx=10&col=JW&qp=0&nh=10\n\n";
exit;
}
真樹
[E-Mail]
1999/11/29(月) 01:44:52
しまった、エラー関数呼んでおいて関数定義するの忘れている。(^_^;
あのエラーチェックは要らないかな?
ふじ
1999/11/29(月) 03:15:31
上記のスクリプトで、URL エンコードしないでも正常に動作するのは、
もともと $word に入って来る値がエンコードされているからです。
ブラウザが送って来たのをそのまま使ってるから。
# スクリプト内で URL デコードしている(値の取り出しに一
# 般のモジュールなど(cgi-lib.plとか)を使っている)場合は、
# Location ヘッダに書き出す前に URL エンコードしましょう。
真樹
[E-Mail]
1999/11/29(月) 15:48:35
[[解決]]
>もともと $word に入って来る値がエンコードされているからです。
>ブラウザが送って来たのをそのまま使ってるから。
>
>スクリプト内でURLデコードしている(値の取り出しに一般のモジュールなど(cgi-lib.plとか)を使っている)場合は、
>Locationヘッダに書き出す前にURLエンコードしましょう。
あ、なるほど。
と言うことは、上記のif文で、判断材料にしている(2バイト文字の)単語は、
URLエンコードした状態で記述しないとダメですね。
ようやく完成にこぎ着けました。
ありがとうございます。
他に不具合等ございましたらお教えいただけるとありがたいです。
[上に]
[前に]
[次に]