#!/usr/local/bin/perl #!C:/Perl/bin/perl.exe #--------------------------------------------------------------------------------- # SSI用検索文字抽出と文字コード変換Perlスクリプト(Encodeモジュールを使用) # URL:http://sakaguch.com 電子メール:http://sakaguch.com/cgi/postmail/ より送信して下さい。 # ファイル名:GetSearchWord.cgi 2004.06.08 作成:鷹の巣 http://sakaguch.com/ #--------------------------------------------------------------------------------- # 改版記録: # 2004.06.08 Rev.1.000 初版で公開。 # 2004.06.12 Rev.1.001 主な検索サイトに対応。 $ver = 'GetSearchWord.cgi Rev.1.001(作成:鷹の巣)'; #--------------------------------------------------------------------------------- # 1.用途 # # このPerlスクリプトはSSI用です。Webページにアクセスして来たアクセス元のURLより # 検索文字を抽出し、Webページと同じ文字コードに変換します。 # 検索エンジン等のアクセス元の検索文字をWebページの検索窓に引き継げます。 # # このPerlスクリプトは、フリーソフトです。詳細は、項4をご一読願います。 # #--------------------------------------------------------------------------------- # 2.使用例と特徴 # # Webページの検索窓に設置した検索フォームにアクセス元の検索文字を設定します。 # 使用例を以下のURLに設置しています。 # http://sakaguch.com/utf1.html # # ○利点:検索エンジンからアクセスして来た方にサイト内の検索窓に検索文字を # 引き継げる。 # # ○欠点:SSIを利用するので、Webページの表示時間が多少長くなる。 # # 使用例 # # #--------------------------------------------------------------------------------- # 3.ご注意事項 # # このスクリプトは、Windows 2000 ProfessionalとWindows XP Home Editionの # ActivePerl-5.8.4.810-MSWin32-x86.msi の環境にて動作確認を行っております。 # UTF-8のコード変換は、Perl 5.8の標準の組み込みモジュールで実現しています。 # # UTF-8Nの検索文字列に変換した場合、「-」や「~」等の一部の全角記号は、 # 変換されませんので、ご注意願います。 # # このスクリプトに対するご質問や不具合がございましたら、電子メールで、 # webmaster@sakaguch.com まで、お寄せ下さい。 # また、「鷹の巣」の自宅サーバー掲示板 # http://sakaguch.com/cgi/bbs/ # にご投稿して頂いても結構です。 # #--------------------------------------------------------------------------------- # 4.著作権 # # このスクリプトの一部には、著作権が設定されています。 # 著作権が設定されているスクリプトは、記載のURLの配布規定を遵守して下さい。 # このスクリプトの全体は、鷹の巣が作成しましたが、鷹の巣の作成した部分の著作権は # 放棄しています。スクリプトの再配布や改造は自由ですが、無償として下さい。 # いかなる目的であっても、このスクリプトに付加価値をつけて、 # 有償配布してはなりません。 # #--------------------------------------------------------------------------------- # 5.使用方法(namazuの例) # # WebサーバーのCGI実行パス下(本例では、/cgi-bin/)に本CGIのGetSearchWord.cgiを設置し、 # Webページの検索フォームを下記の様に変更します。 # #
# # value=''をvalue=''に # 変更すると検索エンジン等のアクセス元の検索文字を検索窓に引き継げます。 # #--------------------------------------------------------------------------------- #--------------------------- #■□■ 基本設定 ■□■ #--------------------------- # 検索フォームを設置しているWebページの文字コードの設定 # $PAGE_CODE = '7bit-jis'; # $PAGE_CODE = 'shiftjis'; # $PAGE_CODE = 'euc-jp'; $PAGE_CODE = 'utf8'; #------------------------------- #■□■ 基本設定の終わり ■□■ #------------------------------- # 各検索サイト毎の検索キーワードの設定 # 検索キーワードが'q'や'p'や'query'以外のサイトを設定する。 %SEARCH_WORD_KEY = ( 'http://search.goo.ne.jp/web.jsp' => 'MT', 'http://www.infoseek.co.jp/ITitles' => 'qt', 'http://www.excite.co.jp/search.gw' => 'search', 'http://search.dmoz.org/cgi-bin/search' => 'search', 'http://search.fresheye.com/' => 'kw', 'http://search.naver.co.jp/search.naver' => 'query', ); # Guessには、asciiとutf8は初期値として設定済みの為、省略可能。 use Encode::Guess qw/ shiftjis euc-jp 7bit-jis /; use Encode qw/ from_to /; # プログラムの先頭で実行、長くても5秒で終了する # 参考URL-http://www.aka.ne.jp/~deguchi/hobby/iden/cgi.html#timeout alarm(5); $SIG{'ALRM'} = 'kill_process'; # 引数に検索文字列を含んだURIの文字コードの変換を行う。 $SearchWord = &GetSearchString ($PAGE_CODE); # SSI出力 print "Content-type: text/plain\n\n"; print "$SearchWord"; exit; #----------------# # 終了処理 # #----------------# sub kill_process { # …適切な終了処理… exit; } #-----------------------# # URIの文字コード変換 # #-----------------------# sub GetSearchString { # 処理:アクセス元のURLより検索文字を抽出し、Webページと同じ文字コードに変換します。 # # 入力:Webページの文字コード($query_code) # 出力:アクセス元の検索文字列($search_string) # # KentWebさんのWeb Forumのdecodeサブルーチンを流用。 # 著作権:Copyright (c) KentWeb http://www.kent-web.com/ my ($query_code) = @_; my ($url, $hikisuu, $key, $val ,$enc ,$search_string); if ( $ENV{'HTTP_REFERER'} =~ /(.+)\?(.+)/ ) { $url = $1; $hikisuu = $2; foreach (split(/&/, $hikisuu)) { ($key, $val) = split(/=/); # 文字コードの変換 if ($key eq 'q' or $key eq 'p' or $key eq 'query' or $key eq $SEARCH_WORD_KEY{$url}) { $val =~ tr/+/ /; $val =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg; # タグ処理 $val =~ s/&/&/g; $val =~ s/"/"/g; $val =~ s/</g; $val =~ s/>/>/g; # パイプ記号の無効化など $val =~ s/\0|\|//g; # 改行処理 $val =~ s/\r//g; $val =~ s/\n//g; $enc = guess_encoding ( $val ); # UTF8フラグを付けずに文字コードを変換 if ( ref $enc ) { from_to ( $val , $enc->name , $query_code ); } $search_string = $val; last; } } } # 検索文字列($search_string)を出力する。 return $search_string; }