-
[Spring Boot, Java] 네이버 검색 광고 API 이용하기(연관키워드)웹프로그래밍/Spring 2021. 12. 20. 01:42
네이버 검색광고 API 이용하기(연관키워드)
네이버 검색 광고에서 제공하는 API를 이용하여 키워드에 대한 연관키워드를 가져올 것이다.
네이버 검색광고 :
https://saedu.naver.com/help/faq/ncc/view.naver?faqSeq=151
네이버 검색 광고 API
https://naver.github.io/searchad-apidoc/#/guides
액세스키, 시크릿키, 커스터머아이디는 네이버 검색 광고에서 로그인한 후 발급받을 수 있다. Httpheader에 Timestamp, Api-key, Customer, Signature를 세팅한다.
- Timestamp : Unix타임으로 지정해준다.
- X-Signature : 아래와 같은 형식으로 HmacSHA256 함수를 사용하여 해시 시그니처를 만든다.
X-Signature를 만드는 HASH256 함수는 네이버 깃허브에서 제공하는 클래스를 가져다 썼다.
참조 : https://github.com/naver/searchad-apidoc/tree/master/java-sample
package com.eumtrend.eumtrend.Security; import javax.crypto.Mac; import javax.crypto.spec.SecretKeySpec; import javax.xml.bind.DatatypeConverter; import java.security.GeneralSecurityException; import java.security.SignatureException; public class Signatures { private static final String PROVIDER = "BC"; private static final String HMAC_SHA256 = "HmacSHA256"; public static String of(String timestamp, String method, String resource, String key) throws SignatureException { return of(timestamp + "." + method + "." + resource, key); } public static String of(String data, String key) throws SignatureException { try { Mac mac = Mac.getInstance("HmacSHA256"); System.out.println("Hmac Hash256."); mac.init(new SecretKeySpec(key.getBytes(), "HmacSHA256")); return DatatypeConverter.printBase64Binary(mac.doFinal(data.getBytes())); } catch (GeneralSecurityException e) { throw new SignatureException("Failed to generate signature.", e); } } }
한글 키워드 검색
한글키워드를 url에 요청하려면 UTF-8로 인코딩이 필요하다.
try { keyword = URLEncoder.encode(keyword, "UTF-8"); //keyword = URLEncoder.encode(keyword, "EUC-KR"); System.out.println("keyword : "+keyword); } catch (Exception e) { throw new RuntimeException("인코딩 실패."); }
헤더 세팅과 요청
http 헤더를 세팅하고 요청한다.
con.setRequestMethod("GET"); con.setRequestProperty("X-Timestamp", times); con.setRequestProperty("X-API-KEY", accessKey); con.setRequestProperty("X-Customer", customerId); con.setRequestProperty("X-Signature", signature); con.setDoOutput(true);
전체 코드
@Service @RequiredArgsConstructor public class KeywordService { private String baseUrl = "https://api.naver.com"; private String path = "/keywordstool"; private String accessKey = ""; // 액세스키 private String secretKey = ""; // 시크릿키 private String customerId = ""; // ID public void requestKeyword(String keyword) { String parameter = "hintKeywords="; long timeStamp = System.currentTimeMillis(); URL url = null; String times = String.valueOf(timeStamp); try { keyword = URLEncoder.encode(keyword, "UTF-8"); //keyword = URLEncoder.encode(keyword, "EUC-KR"); System.out.println("keyword : "+keyword); } catch (Exception e) { throw new RuntimeException("인코딩 실패."); } try { url = new URL(baseUrl+path+"?"+parameter+keyword); System.out.println("url : "+url); String signature = Signatures.of(times, "GET", path, secretKey); HttpURLConnection con = (HttpURLConnection) url.openConnection(); con.setRequestMethod("GET"); con.setRequestProperty("X-Timestamp", times); con.setRequestProperty("X-API-KEY", accessKey); con.setRequestProperty("X-Customer", customerId); con.setRequestProperty("X-Signature", signature); con.setDoOutput(true); int responseCode = con.getResponseCode(); BufferedReader br; System.out.println("responseCode : "+responseCode); if(responseCode == 200) { br = new BufferedReader(new InputStreamReader(con.getInputStream(), "UTF-8")); } else { br = new BufferedReader(new InputStreamReader(con.getErrorStream(), "UTF-8")); } String inputLine; StringBuffer response = new StringBuffer(); while((inputLine = br.readLine()) != null) { response.append(inputLine); } br.close(); System.out.println("Response : "+response.toString()); } catch (Exception e) { System.out.println("Wrong URL."); } } }
'웹프로그래밍 > Spring' 카테고리의 다른 글
[Spring Boot] 스프링부트 빌드하고 실행하기 (0) 2022.02.15 [Spring Boot] 스프링부트 간단한 뷰(View) 만들기 (0) 2022.02.15