묻고답하기

xe1.0.5 사용자입니다.

Top 10 네이버 검색어 순위를 보여주는 위젯 프로그램을 아래에서 다운받아 그리고 제 홈피에 설치하였습니다.
http://www.zeroboard.com/16720158

naver에서 Open API 등록키를 발급받았구요^^
widgets/rank_nexearch/rank_nexearch.class.php 파일에서
widgets/rank_nexearch/skins/ajax/nexearch.class.php 파일에서 
naver에서 발급받은 Open API 등록키를 넣어 주었습니다.
그리고 아래 그림과 같이 생성코드를 주었습니다.




구현된 페이지에서의 이미지는 아래와 같습니다.



문제는 1위에 랭크된 황재원이란 곳을 마우스오버 하면 아래와 같은 url이 표시됩니다.
http://search.naver.com/search.naver?where=nexearch&query=황재원&x=0&y=0&frm=t1

이어서 클릭하면 아래와 같이 나옵니다.



즉, 깨져서 나옵니다.
 
그리하여 http://search.naver.com/search.naver?where=nexearch&query=황재원&x=0&y=0&frm=t1를 주소창에서 복사하여
따로 다른 페이지에서 입력하면 정상적으로 나오는 것입니다.



무엇이 문제일까요?

아래, widgets/rank_nexearch/rank_nexearch.class.php 코드를 붙여 보았습니다.

<?php
    /**
     * @class rank_nexearch
     * @author Simulz (k10206@naver.com)
     * @brief 실시간 검색어
     **/

    class rank_nexearch extends WidgetHandler {
        /**
         * @brief 위젯의 실행 부분
         *
         * ./widgets/위젯/conf/info.xml 에 선언한 extra_vars를 args로 받는다
         * 결과를 만든후 print가 아니라 return 해주어야 한다
         **/
        function proc($args) {
            // 위젯 자체적으로 설정한 변수들을 체크
            $title = $args->title;
            $query = $args->query;
            $target = (in_array($query, array("nexearch", "cafeblog", "dic", "image", "kin", "music", "video", "webkr", "news"))) ? "rank" : "ranktheme";
           
            $APIkey = "등록키";//네이버 OpenAPI 등록키

            $URL_parsed = parse_url("http://openapi.naver.com/search?key=".$APIkey."&query=".$query."&target=".$target);

            $host = $URL_parsed["host"];
            $port = $URL_parsed["port"];

            if ($port == 0) $port = 80;

            $path = $URL_parsed["path"];

            if ($URL_parsed["query"] != "") $path .= "?".$URL_parsed["query"];

            $out = "GET $path HTTP/1.0\r\nHost: $host\r\n\r\n";

            $fp = fsockopen($host, $port, $errno, $errstr, 30);
            if(!$fp) return new Object(-1, 'msg_fail_to_socket_open');
           
            fputs($fp, $out);

            $buff = ''+ '+ ';

            while (!feof($fp)) {
                $str = fgets($fp, 128);
                if ( $start ) $buff .= $str;
                if ( $str == "\r\n" ) $start = true;
            }

            fclose($fp);

            $buff = str_replace('<?xml version="1.0" encoding="UTF-8" ?>', '', $buff);

            $oXmlParser = new XmlParser();
            $xml_doc = $oXmlParser->parse($buff);

            $item = $xml_doc->result->item;

            for($i = 1; $i <= 10; $i++) {
                unset($items);
                $items->k = $item->{'+ 'r'.$i}->k->body;
                $items->s = $item->{'r'.$i}->s->body;
                $items->v = $item->{'r'.$i}->v->body;
               
                $items->href = "http://search.naver.com/search.naver?where=nexearch&query=".urlencode($items->k)."&x=0&y=0&frm=t1";

                $rank_list[$i] = $items;
            }

            $widget_info->rank_list = $rank_list;
            $widget_info->title = $title;

            Context::set('widget_info', $widget_info);

            // 템플릿의 스킨 경로를 지정 (skin, colorset에 따른 값을 설정)
            $tpl_path = sprintf('%sskins/%s', $this->widget_path, $args->skin);
            Context::set('colorset', $args->colorset);

            // 템플릿 컴파일
            $oTemplate = &TemplateHandler::getInstance();
            $output = $oTemplate->compile($tpl_path, 'list');
            return $output;
        }
    }
?>

그리고 widgets/rank_nexearch/skins/ajax/nexearch.class.php 를 붙여봅니다.

<?php
/****************************************************************
먼저 네이버의 OpenAPI 사용 등록 후 인증키를 받으셔야 합니다.
http://openapi.naver.com/
위의 주소로 가셔서, API 이용등록 하시면 발급됩니다.

하단의 23 ~ 46번 줄을 수정하시면 디자인 변경이 가능합니다.
단, 한글은 입력하지 마세요.

라이센스 같은 건 없고, 소스 수정 및 배포도 자유입니다.
단, 문제 발생 시 책임은 사용자에게 있습니다.
*****************************************************************/
$APIkey = "등록키";//네이버 OpenAPI 등록키

$content = get_url_fsockopen("http://openapi.naver.com/search?key=$APIkey&query=nexearch&target=rank");

$content = str_replace(" ","",$content);
$content = str_replace("\n","",$content);

$trans = array (
     "<?xml version=\"1.0\" encoding=\"UTF-8\"?>" => "",
     " " => "",
     "<result>" => "<table width='100%' border='0' cellspacing='0' cellpadding='0'>",
     "<item>" => "",
     "<R1>" => "<tr><td><img src='http://sstatic.naver.com/search/images10/num_realtime01.gif'> ",
     "<R2>" => "<tr><td><img src='http://sstatic.naver.com/search/images10/num_realtime02.gif'>  ",
     "<R3>" => "<tr><td><img src='http://sstatic.naver.com/search/images10/num_realtime03.gif'>  ",
     "<R4>" => "<tr><td><img src='http://sstatic.naver.com/search/images10/num_realtime04.gif'> ",
     "<R5>" => "<tr><td><img src='http://sstatic.naver.com/search/images10/num_realtime05.gif'> ",
     "<R6>" => "<tr><td><img src='http://sstatic.naver.com/search/images10/num_realtime06.gif'> ",
     "<R7>" => "<tr><td><img src='http://sstatic.naver.com/search/images10/num_realtime07.gif'> ",
     "<R8>" => "<tr><td><img src='http://sstatic.naver.com/search/images10/num_realtime08.gif'> ",
     "<R9>" => "<tr><td><img src='http://sstatic.naver.com/search/images10/num_realtime09.gif'> ",
     "<R10>" => "<tr><td><img src='http://sstatic.naver.com/search/images10/num_realtime10.gif'> ",
     "</R1>" => "</td></tr>",
     "</R2>" => "</td></tr>",
     "</R3>" => "</td></tr>",
     "</R4>" => "</td></tr>",
     "</R5>" => "</td></tr>",
     "</R6>" => "</td></tr>",
     "</R7>" => "</td></tr>",
     "</R8>" => "</td></tr>",
     "</R9>" => "</td></tr>",
     "</R10>" => "</td></tr>",
     "<item>" => "",
     "</result>" => "</table>",
     "</K>" => ""
    );
$content = strtr($content, $trans);

$search = array ('/<K>(.[^ \n\<\"\']+)/',
        '@<S>.*?</S>@si',
        '@<V>.*?</V>@si');

$replace = array ('<a href=http://search.naver.com/search.naver?where=nexearch&query=\\1&x=0&y=0&frm=t1 target=_blank class=jung10><strong>\\1<strong /></a>','','');

$content = preg_replace($search, $replace, $content);

if($utf8) echo $content;
else echo iconv('UTF-8', 'EUC-KR', $content);//iconv 함수가 지원하지 않는다면, charset=UTF-8 으로 선언해 주셔야 한글이 안깨집니다.
echo date("Y-m-d H:i:s");

function get_url_fsockopen($url) {
    $URL_parsed = parse_url($url);

    $host = $URL_parsed["host"];
    $port = $URL_parsed["port"];

    if ($port == 0)
        $port = 80;

    $path = $URL_parsed["path"];

    if ($URL_parsed["query"] != "")
        $path .= "?".$URL_parsed["query"];

    $out = "GET $path HTTP/1.0\r\nHost: $host\r\n\r\n";

    $fp = fsockopen($host, $port, $errno, $errstr, 30);
    if (!$fp)
  {
      echo "$errstr ($errno)<br>\n";
    }
  else
  {
        fputs($fp, $out);
        $body = false;

        while (!feof($fp))
    {
            $s = fgets($fp, 128);
            if ( $body )
                $in .= $s;
            if ( $s == "\r\n" )
                $body = true;
        }

        fclose($fp);

        return $in;        // string으로 받고싶을땐...
    }
}
?>