본문 바로가기

Development/Coding

네이버 블로그 검색 API 연동 (PHP)

네이버 블로그 검색 API 를 사용할 일이 있어서 삽을 들었습니다.


처음에는 이미지 검색 API 를 사용하여 이미지를 뿌려주려했으나 원치않는 이미지들이 보여지기도 하고 그 퀄리티가 다소 낮은 문제가 있으며 결정적으로 네이버 자체에서 검색한 이미지의 결과와 오픈API 를 통해 검색된 이미지의 결과가 너무 달라 사용할 수가 없었습니다. (이건 제 문제일 수도 있고 네이버 오픈API 의 문제일 수도 있습니다.)

작업 과정은 이러했습니다.
  1. 네이버 API 키 발급
  2. 크로스 도메인 문제로 XML 데이터를 바로 받을 수 없기에 PHP 에서 데이터 받음
  3. XML 객체로 전달
  4. 뷰 페이지 전달
  5. 루프
PHP 에서 XML 을 사용하기는 이번이 처음이어서 검색을 좀 했습니다. 오픈 일정이 여의치 않아 세밀하게 검토하지는 못했지만 내장 객체에 SimpleXMLElement 라는 것이 있어 사용하기로 했습니다.

이 객체가 파일 시스템에 직접 접근이 가능한지 확인하지 않았지만 안될 것 같았습니다. 그래서 다른 함수를 통해 네이버 오픈 API 사이트를 직접 접근하게 되었습니다.

사용하고 있는 호스팅 서버에서 외부 도메인으로 직접 fopen() 을 지원하였기 때문에 검색할 주소를 조합하여 RAW 데이터를 받았습니다.

참고로 CODEIGNITOR 프레임워크를 사용 중입니다.

$query = $this->uri->segment(3,'');
// 네이버 검색 키
$key = '1111112222222222333333333344444444444;
$url = 'http://openapi.naver.com/search?key='.$key;
$url .= '&target=blog&display=4';
$url .= '&query='.$query;

$content = file_get_contents($url);

콘텐트를 받은 변수를 xml 데이터로 처리하기 위해 SimpleXMLElement 객체를 생성하였습니다.

$reader = new SimpleXMLElement($content);

생성된 객체를 통해 필요한 데이터를 파싱하는 작업을 진행합니다.
로우 데이터를 살펴보니 channel 엘리먼트를 사용하는 것이 가장 적절하여 이 엘리먼트만 추출합니다.

$view_data['api_search'] = $reader->channel;

추출된 내용을 뷰 페이지로 전달합니다.

$this->load->view('/spot/api_search', $view_data);

뷰 페이지에서 값을 출력하기 위한 루프를 돕니다.

<p class="boardSubject">블로그 검색 결과 </p>
<? foreach($api_search->item as $list): ?>
    <p><a href="<?= $list->link ?>" target='_blank'><?= $list->title ?></a></p>
<? endforeach; ?>

이 데이터를 불러오기 위한 호출 페이지 코드도 함께 달아 두었으니 참고하세요.

$(document).ready(function(){
    var name = '<?= $spot_data['spot_title'] ?>';
    $('#naverImg').load('/spot/naver_api_search/'+name);
});