ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Spring Boot, Java] 네이버 검색 광고 API 이용하기(연관키워드)
    웹프로그래밍/Spring 2021. 12. 20. 01:42

    네이버 검색광고 API 이용하기(연관키워드)

    네이버 검색 광고에서 제공하는 API를 이용하여 키워드에 대한 연관키워드를 가져올 것이다.

     

    네이버 검색광고 :

    https://saedu.naver.com/help/faq/ncc/view.naver?faqSeq=151

     

    네이버 광고

     

    saedu.naver.com

    네이버 검색 광고 API

    https://naver.github.io/searchad-apidoc/#/guides

     

    searchad-apidoc

     

    naver.github.io

     

    액세스키, 시크릿키, 커스터머아이디는 네이버 검색 광고에서 로그인한 후 발급받을 수 있다. Httpheader에 Timestamp, Api-key, Customer, Signature를 세팅한다.

    • Timestamp : Unix타임으로 지정해준다.
    • X-Signature : 아래와 같은 형식으로 HmacSHA256 함수를 사용하여 해시 시그니처를 만든다. 
      X-Signature 만드는 형식
      httpheader 구조

    X-Signature를 만드는 HASH256 함수는 네이버 깃허브에서 제공하는 클래스를 가져다 썼다. 

    참조 : https://github.com/naver/searchad-apidoc/tree/master/java-sample

     

    GitHub - naver/searchad-apidoc

    Contribute to naver/searchad-apidoc development by creating an account on GitHub.

    github.com

    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.");
            }
    
        }
    
    }

     

Designed by Tistory.