サーチエンジン+自前単語検索を実現するには

[上に] [前に] [次に]
真樹 [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エンコードした状態で記述しないとダメですね。



ようやく完成にこぎ着けました。
ありがとうございます。


他に不具合等ございましたらお教えいただけるとありがたいです。

[上に] [前に] [次に]