반응형
네이버 검색 API
네이버 검색 API는 네이버 블로그, 이미지, 뉴스 등의 검색 결과를 API 형태로 가져올 수 있습니다. 웹 서비스 혹은 앱 서비스를 만들 때 컨텐츠를 더욱 풍부하게 만들어줄 수 있는 API입니다.
1️⃣ 사전 준비하기
- https://developers.naver.com/ 네이버 개발자 커뮤니티 가입 후 내 애플리케이션 등록하기
- Client ID 및 Client Key 적어두기
- API 는 계정별 일 25,000번 한도이며, xml/json 형태로 리턴받아 사용
2️⃣ API 요청하기
- xml로 요청하기 : https://openapi.naver.com/v1/search/blog.xml
- json으로 요청하기 : https://openapi.naver.com/v1/search/blog.json
- 파라미터
- query(String) 필수 : 검색어(UTF-8 인코딩 필요)
- display(Int) : 한 번에 표시할 검색 결과 수 (기본 10, 최대 100)
- start(Int) : 검색 시작 위치(기본 1, 최대 1000)
- sort(String) : 검색 결과 정렬 방법(sim: 정확도순, date : 날짜순)
- 요청시 HTTP 헤더에 1번에 발급받은 Client ID, Key를 추가
> GET /v1/search/blog.xml?query=%EB%A6%AC%EB%B7%B0&display=10&start=1&sort=sim HTTP/1.1
> Host: openapi.naver.com
> User-Agent: curl/7.49.1
> Accept: */*
> X-Naver-Client-Id: {애플리케이션 등록 시 발급받은 클라이언트 아이디 값}
> X-Naver-Client-Secret: {애플리케이션 등록 시 발급받은 클라이언트 시크릿 값}
>
3️⃣ API 응답
- rss : RSS 컨테이너. RSS 리더기를 사용해 검색 결과를 확인할 수 있습니다.
- rss/channel : 검색 결과를 포함하는 컨테이너. channel 요소의 하위 요소인 title, link, description은 RSS에서 사용하는 정보이며, 검색 결과와는 상관이 없습니다.
- rss/channel/lastBuildDate : 검색 결과를 생성한 시간
- rss/channel/total : 총 검색 결과 개수
- rss/channel/start : 검색 시작 위치
- rss/channel/display : 한 번에 표시할 검색 결과 개수
- rss/channel/item : 개별 검색 결과. JSON 형식의 결괏값에서는 items 속성의 JSON 배열로 개별 검색 결과를 반환합니다.
- rss/channel/item/title : 블로그 포스트의 제목. 제목에서 검색어와 일치하는 부분은 <b> 태그로 감싸져 있습니다.
- rss/channel/item/link : 블로그 포스트의 URL
- rss/channel/item/description : 블로그 포스트의 내용을 요약한 패시지 정보. 패시지 정보에서 검색어와 일치하는 부분은 <b> 태그로 감싸져 있습니다.
- rss/channel/item/bloggername : 블로그 포스트가 있는 블로그의 이름
- rss/channel/item/bloggerlink : 블로그 포스트가 있는 블로그의 주소
- rss/channel/item/postdate : 블로그 포스트가 작성된 날짜
< HTTP/1.1 200 OK
< Server: nginx
< Date: Mon, 26 Sep 2016 01:39:37 GMT
< Content-Type: text/xml;charset=utf-8
< Transfer-Encoding: chunked
< Connection: keep-alive
< Keep-Alive: timeout=5
< Vary: Accept-Encoding
< X-Powered-By: Naver
< Cache-Control: no-cache, no-store, must-revalidate
< Pragma: no-cache
<
<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
<channel>
<title>Naver Open API - blog ::'리뷰'</title>
<link>http://search.naver.com</link>
<description>Naver Search Result</description>
<lastBuildDate>Mon, 26 Sep 2016 10:39:37 +0900</lastBuildDate>
<total>8714891</total>
<start>1</start><display>10</display>
<item>
<title>명예훼손 없이 <b>리뷰</b>쓰기</title>
<link>http://openapi.naver.com/l?AAABWLyw6CMBREv+ayNJe2UrrogvJwg8aYKGvACiSUalNR/t6azGLO5Mzrrd0moVSQJZDl/6I4KIxGpx9y9P4JNANShXSzHXZLu2q3660Jw2bt0k1+aF1rgFYXfZ+c7j3QorYDkCT4JxuIEEyRUYGcxpGXMeMs3VPBOUEWGXntynUW03k7ohBYfG+mOdRqbPL6E84/apnqgaEAAAA=</link>
<description>명예훼손 없이 <b>리뷰</b>쓰기 우리 블로그하시는 분들께는 꽤 중요한 내용일 수도 있습니다 그것도 주로 <b>리뷰</b> 위주로 블로그를 진행하신 분이라면 더욱 더 말이죠
오늘 포스팅은, 어떻게 하면 객관적이고 좋은 <b>리뷰</b>를... </description>
<bloggername>건짱의 Best Drawing World2</bloggername>
<bloggerlink>http://blog.naver.com/yoonbitgaram</bloggerlink>
<postdate>20161208</postdate>
</item>
...
</channel>
</rss>
4️⃣ 구현 예제(JAVA)
// 네이버 검색 API 예제 - 블로그 검색
import java.io.*;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLEncoder;
import java.util.HashMap;
import java.util.Map;
public class ApiExamSearchBlog {
public static void main(String[] args) {
String clientId = "YOUR_CLIENT_ID"; //애플리케이션 클라이언트 아이디
String clientSecret = "YOUR_CLIENT_SECRET"; //애플리케이션 클라이언트 시크릿
String text = null;
try {
text = URLEncoder.encode("그린팩토리", "UTF-8");
} catch (UnsupportedEncodingException e) {
throw new RuntimeException("검색어 인코딩 실패",e);
}
String apiURL = "https://openapi.naver.com/v1/search/blog?query=" + text; // JSON 결과
//String apiURL = "https://openapi.naver.com/v1/search/blog.xml?query="+ text; // XML 결과
Map<String, String> requestHeaders = new HashMap<>();
requestHeaders.put("X-Naver-Client-Id", clientId);
requestHeaders.put("X-Naver-Client-Secret", clientSecret);
String responseBody = get(apiURL,requestHeaders);
System.out.println(responseBody);
}
private static String get(String apiUrl, Map<String, String> requestHeaders){
HttpURLConnection con = connect(apiUrl);
try {
con.setRequestMethod("GET");
for(Map.Entry<String, String> header :requestHeaders.entrySet()) {
con.setRequestProperty(header.getKey(), header.getValue());
}
int responseCode = con.getResponseCode();
if (responseCode == HttpURLConnection.HTTP_OK) { // 정상 호출
return readBody(con.getInputStream());
} else { // 오류 발생
return readBody(con.getErrorStream());
}
} catch (IOException e) {
throw new RuntimeException("API 요청과 응답 실패", e);
} finally {
con.disconnect();
}
}
private static HttpURLConnection connect(String apiUrl){
try {
URL url = new URL(apiUrl);
return (HttpURLConnection)url.openConnection();
} catch (MalformedURLException e) {
throw new RuntimeException("API URL이 잘못되었습니다. : " + apiUrl, e);
} catch (IOException e) {
throw new RuntimeException("연결이 실패했습니다. : " + apiUrl, e);
}
}
private static String readBody(InputStream body){
InputStreamReader streamReader = new InputStreamReader(body);
try (BufferedReader lineReader = new BufferedReader(streamReader)) {
StringBuilder responseBody = new StringBuilder();
String line;
while ((line = lineReader.readLine()) != null) {
responseBody.append(line);
}
return responseBody.toString();
} catch (IOException e) {
throw new RuntimeException("API 응답을 읽는 데 실패했습니다.", e);
}
}
}
반응형
'개발자, 탐구생활 > 개발자, 코딩' 카테고리의 다른 글
쿠팡 파트너스 API 기본[베스트 상품별 정보 가져오기] (4) | 2024.01.17 |
---|---|
네이버 지도 API 사용하기 / 네이버 MAP API / NAVER MAP API (0) | 2023.10.18 |
SSL 인증서에 대하여 (0) | 2023.08.18 |
[ELK Stack]우분투 엘라스틱서치 설치하기/ElasticSearch (0) | 2023.07.13 |
[js] 깔끔하고 사용하기 쉬운 알림 sweetalert2.js (0) | 2023.07.12 |