테스트 사이트 - 개발 중인 베타 버전입니다

네이버 OPEN API 웹검색 짜집기

· 19년 전 · 7459 · 10
링크 1/2를 참고해서 짜집기 -_-; 했습니다

문제가 있다면 자삭하겠습니다.;;

네이버 Open API 사용시 제약조건
- 하루 쿼리 5000건 이하
- 절대적 건전하고, 비상업적인 용도
- 네이버 OpenAPI를 사용하고 있음을 표기
라고 합니다.

http://openapi.naver.com 에서 key값을 받아야됩니다.

아래 내용을 파일로 저장해서
filename.php?query=검색단어 하면 됩니다.


<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>네이버 OPEN API</title>
</head>

<body>
네이버 OpenAPI를 사용하였습니다.<br /><br />
<?

/*///////////////////////////////////////////////////////////////

작성자 : 손상모<smson@ihelpers.co.kr>
최초작성일 : 2004.10.25
변경내용 : 없슴

/////////////////////////////////////////////////////////////////*/

/**
* RSS parser class.
*
* This class is a parser for Resource Description Framework (RDF) Site
*
* @author Sang Mo,Son <smson@ihelpers.co.kr>
* @version 0.9 beta
* @access public
*/
class RSSParser {

var $parser;

var $insideTag = '';
var $activeTag = '';
var $channel = array();

var $items = array();
var $item = array();

var $images = array();
var $image = array();

var $textinput = array();
var $textinputs = array();

// 2004.10.25 RSS 2.0 적용
var $parentTags = array('CHANNEL', 'ITEM', 'IMAGE', 'TEXTINPUT');
var $channelTags = array('TITLE', 'LINK', 'DESCRIPTION', 'LANGUAGE','COPYRIGHT','MANAGINGEDITOR',
'WEBMASTER','PUBDATE','LASTBUILDDATE','CATEGORY','GENERATOR','DOCS','CLOUD',
'TTL','RATING','SKIPHOURS','SKIPDAYS','IMAGE','ITEMS', 'TEXTINPUT');
var $itemTags = array('TITLE', 'LINK', 'DESCRIPTION',
'AUTHOR','CATEGORY','COMMENTS','ENCLOSURE','GUID','PUBDATE','SOURCE');
var $imageTags = array('TITLE', 'URL', 'LINK','WIDTH','HEIGHT','DESCRIPTION');
var $textinputTags = array('TITLE', 'DESCRIPTION', 'NAME', 'LINK');
var $moduleTags = array('DC:TITLE', 'DC:CREATOR', 'DC:SUBJECT', 'DC:DESCRIPTION',
'DC:PUBLISHER', 'DC:CONTRIBUTOR', 'DC:DATE', 'DC:TYPE',
'DC:FORMAT', 'DC:IDENTIFIER', 'DC:SOURCE', 'DC:LANGUAGE',
'DC:RELATION', 'DC:COVERAGE', 'DC:RIGHTS',
'BLOGCHANNEL:BLOGROLL', 'BLOGCHANNEL:MYSUBSCRIPTIONS',
'BLOGCHANNEL:MYSUBSCRIPTIONS', 'BLOGCHANNEL:CHANGES');

/**
* Constructor
*
* @access public
* @return void
*/
function RSSParser(){
$this->_create();
}

/**
* create the XML parser resource
*
* @access private
* @return boolean
*
* @see xml_parser_create
*/
function _create(){
$this->parser = @xml_parser_create();
if (is_resource($this->parser)) {
xml_set_object($this->parser, &$this);
xml_set_element_handler($this->parser, "startHandler", "endHandler");
xml_set_character_data_handler($this->parser, "cdataHandler");
return true;
}
return false;
}

/**
* Free the internal resources associated with the parser
*
* @return null
**/
function free(){
if (is_resource($this->parser)) {
xml_parser_free($this->parser);
unset( $this->parser );
}
return null;
}

/**
* Start element handler for XML parser
*
* @access private
* @param object XML parser object
* @param string XML element
* @param array Attributes of XML tag
* @return void
*/
function startHandler($parser, $element, $attr){
switch ($element) {
case 'CHANNEL':
case 'ITEM':
case 'IMAGE':
case 'TEXTINPUT':
$this->insideTag = $element;
break;

default:
$this->activeTag = $element;
}
}

/**
* End element handler for XML parser
*
* @access private
* @param object XML parser object
* @param string
* @return void
*/
function endHandler($parser, $element){
if ($element == $this->insideTag) {
$this->insideTag = '';
$this->struct[] = array_merge(array('type' => strtolower($element)),
$this->last);
}

if ($element == 'ITEM') {
$this->items[] = $this->item;
$this->item = '';
}

if ($element == 'IMAGE') {
$this->images[] = $this->image;
$this->image = '';
}

if ($element == 'TEXTINPUT') {
$this->textinputs = $this->textinput;
$this->textinput = '';
}

$this->activeTag = '';
}

/**
* Handler for character data
*
* @access private
* @param object XML parser object
* @param string CDATA
* @return void
*/
function cdataHandler($parser, $cdata){
if (in_array($this->insideTag, $this->parentTags)) {
$tagName = strtolower($this->insideTag);
$var = $this->{$tagName . 'Tags'};

if (in_array($this->activeTag, $var)){
$this->_add($tagName, strtolower($this->activeTag),$cdata);
} elseif(in_array($this->activeTag, $this->moduleTags)) {
$this->_add($tagName, strtolower($this->activeTag),$cdata);
}
}
}

/**
* Add element to internal result sets
*
* @access private
* @param string Name of the result set
* @param string Fieldname
* @param string Value
* @return void
* @see cdataHandler
*/
function _add($type, $field, $value)
{
if (empty($this->{$type}) || empty($this->{$type}[$field])) {
$this->{$type}[$field] = $value;
} else {
$this->{$type}[$field] .= $value;
}
$this->last = $this->{$type};
}

/**
* Central parsing function.
*
* @access public
* @param string XML Content
* @return boolean
*/
function parse($data){
xml_parse($this->parser,$data);
return true;
}

/**
* Get complete structure of RSS file
*
* @access public
* @return array
*/
function getStructure()
{
return (array)$this->struct;
}

/**
* Get general information about current channel
*
* @access public
* @return array
*/
function getChannel()
{
return (array)$this->channel;
}

/**
* Get items from RSS file
*
* @access public
* @return array
*/
function getItems()
{
return (array)$this->items;
}

/**
* Get images from RSS file
*
* @access public
* @return array
*/
function getImages()
{
return (array)$this->images;
}

/**
* Get text input fields from RSS file
*
* @access public
* @return array
*/
function getTextinputs()
{
return (array)$this->textinputs;
}
}
?>
<?
$key =""; //http://openapi.naver.com 회원가입후 키를 받아야 됩니다.
$display="20"; //20개 출력
$query = $_GET[query];
$ary[] = "UTF-8";
$ary[] = "EUC-KR";
$ary[] = "ASCII";
if(mb_detect_encoding($query, $ary)=="EUC-KR") $query = iconv("EUC-KR","UTF-8",$query);
$query = urlencode($query);
$file = "http://openapi.naver.com/search?key=$key&query=$query&display=$display&start=1&target=webkr";
$fp = fopen($file, "r") or die("file not found");
while (!feof ($fp)) {
$buffer .= fgets($fp, 4096);
}
fclose ($fp);

$rss = new RSSParser();
$rss->parse($buffer);

$structure =($rss->getStructure());
$channel = ($rss->getChannel());
$items = ($rss->getItems());

for($i = 0 ; $i < count($items) ; $i++){
echo "<a href='http://".$items[$i][link]."' target='_blank'>".$items[$i][title]."</a><br />";
echo "http://".$items[$i][link]."<br />";
echo $items[$i][description]."<br />";
echo "<br /><br /><br />";
}
?>
</body>
</html>

댓글 작성

댓글을 작성하시려면 로그인이 필요합니다.

로그인하기

댓글 10개

고생하셨습니다.
OPEN API에 관한 좋은 글이 있어서 링크하나 붙혀 넣습니다. ^^


Open API, 어떻게 써먹을 것인가?
http://lunaris.egloos.com/1292802
네이버 OPEN API를 이용해서 PHP로 검색부분을 개발중인 사이트

http://api.fopen.co.kr
php도 잘모르지만;;XML은 OTL입니다;;
공부좀 해야겠습니다.

izen님 감사합니다. ^^
헉~~~
서기님께서 저에게 무슨 감사할 일이 있다고 그러십니까?
제가 오히려 고맙죠.

특정 팁에 대해서 두루두루 관련 사이트를 둘러보는것도 꽤 재미가 있어서 다른 분들도 참고나 하시라는 뜻입니다.
^^;
과제물이 자꾸만 늘어가는 군요 ^^/;
좋네요.
쿼리제한이나 상업적인 용도 제한이 아니면
좋은데....
그렇죠?
Iconv를 지원하지않는 php 버젼에서는 사용이 어렵조 - - ㅜ 대략 좌절했다는....OTL
상업적인용도 제한이라도 좋으니 쿼리제한만이라도 어떡게 ??ㅋㅋ

게시판 목록

그누4 팁자료실

그누보드4와 관련된 팁을 여러분들과 함께 공유하세요.
나누면 즐거움이 커집니다.
글쓰기
🐛 버그신고