월 조회수 데이터, API로 자동화해서 나만의 툴 만들기

Author Kini
·
월 조회수 데이터, API로 자동화해서 나만의 툴 만들기

솔직히 개발자인 우리 입장에서, 블랙키위나 판다랭크 같은 툴을 결제해서 쓰는 건 좀 자존심 상하는 일 아닙니까?

“어차피 API 찔러서 JSON 받아 뿌려주는 건데, 이걸 돈 내고 쓴다고?”

네, 저도 그 생각으로 시작했습니다. 마케터들이 엑셀 켜고 하나하나 검색할 때, 우리는 스크립트 하나로 데이터를 긁어와야죠. 주말에 Node.js로 네이버 검색광고 API를 연동해 ‘나만의 키워드 분석기’를 만든 과정을 공유합니다.

생각보다 Signature 생성 부분에서 삽질을 좀 했는데, 이 글을 보는 분들은 그 시간 아끼시길 바랍니다.

1. 네이버 개발자 센터가 아닙니다

일단 번지수부터 잘 찾아야 합니다. ‘네이버 로그인’이나 ‘지도 API’가 있는 developers.naver.com이 아니라, 네이버 검색광고 API 센터로 가야 합니다.

여기서 API Key, Secret Key, 그리고 Customer ID를 발급받으세요.

💡 Tip: API 호출 기본 URL도 다릅니다. https://api.naver.com을 씁니다. 습관적으로 openapi.naver.com 치면 404 뜹니다.

2. 최대 난관: HMAC-SHA256 서명(Signature) 생성

API 문서를 보면 헤더에 X-Signature를 넣으라고 나옵니다. 그냥 API Key만 던지면 좋겠는데, 보안 때문에 타임스탬프랑 URL이랑 섞어서 암호화를 해야 하죠.

여기서 가장 많이 막힙니다. 포인트는 딱 두 가지입니다.

  1. 타임스탬프: Date.now()를 쓰되, 문자열로 변환할 것.
  2. 메서드/URL: 요청하는 메서드(GET)와 API URL이 정확히 일치해야 함.

제가 작성한 서명 생성 코드는 이렇습니다. crypto 모듈만 있으면 됩니다.

/* * [네이버 검색광고 API 서명 생성 예시]
 * Node.js 환경: crypto 모듈 사용
 */

const crypto = require('crypto');

function generateSignature(timestamp, method, url, secretKey) {
	// 1. 요청할 메서드, URL, 타임스탬프를 조합
	const message = `${timestamp}.${method}.${url}`;
    
	// 2. HMAC-SHA256 알고리즘으로 암호화 후 Base64 인코딩
	const signature = crypto.createHmac('sha256', secretKey)
		.update(message)
		.digest('base64');

	return signature;
}

3. Axios로 데이터 긁어오기 (RelKeyword)

인증 헤더만 통과하면 나머지는 쉽습니다. 우리가 필요한 건 ‘연관 키워드 조회’ (/keywordstool)입니다.

여기에 내가 조회하고 싶은 ‘시드 키워드(hintKeywords)’를 던지면, 네이버가 알아서 연관된 키워드들의 PC/Mobile 월간 검색수, 클릭수 등을 리턴해줍니다.

/* * [API 호출 로직]
 * 작성하신 코드를 바탕으로 핵심 로직을 구성했습니다.
 */

import axios from 'axios';
import crypto from 'crypto';

/**
 * 1. 설정값 (실무에서는 .env 파일로 관리하는 것이 정석입니다)
 */
const CONFIG = {
  API_KEY: 'YOUR_API_KEY',
  SECRET_KEY: 'YOUR_SECRET_KEY',
  CUSTOMER_ID: 'YOUR_CUSTOMER_ID',
  BASE_URL: 'https://api.naver.com',
} as const;

/**
 * 2. 타입 정의 (Naver API 응답 명세 반영)
 * 네이버는 검색수가 적으면 숫자가 아니라 "< 10" 문자열을 줍니다.
 */
interface NaverKeywordItem {
  relKeyword: string;
  monthlyPcQcCnt: string | number;
  monthlyMobileQcCnt: string | number;
  compIdx: 'HIGH' | 'MID' | 'LOW'; // 경쟁정도
}

interface KeywordResult {
  keyword: string;
  totalSearch: number;
  competition: string;
}

/**
 * 3. 유틸리티 함수: 서명(Signature) 생성
 */
const generateSignature = (timestamp: string, method: string, uri: string): string => {
  const message = `${timestamp}.${method}.${uri}`;
  return crypto
    .createHmac('sha256', CONFIG.SECRET_KEY)
    .update(message)
    .digest('base64');
};

/**
 * 4. 유틸리티 함수: 검색수 파싱
 * '< 10' 같은 문자열이나 숫자를 받아서 안전한 number로 변환
 */
const parseSearchCount = (count: string | number): number => {
  if (typeof count === 'number') return count;
  // 문자열인 경우 ('< 10') -> 보수적으로 0으로 처리하거나 10으로 처리
  return 0; 
};

/**
 * 5. 메인 로직: 키워드 검색량 조회 함수
 */
const getKeywordData = async (hintKeywords: string): Promise<KeywordResult[] | void> => {
  const uri = '/keywordstool';
  const method = 'GET';
  const timestamp = Date.now().toString();

  try {
    const { data } = await axios.get(`${CONFIG.BASE_URL}${uri}`, {
      params: {
        hintKeywords,
        showDetail: 1,
      },
      headers: {
        'X-Timestamp': timestamp,
        'X-API-KEY': CONFIG.API_KEY,
        'X-Customer': CONFIG.CUSTOMER_ID,
        'X-Signature': generateSignature(timestamp, method, uri),
      },
    });

    const keywordList: NaverKeywordItem[] = data.keywordList;

    // 데이터 가공 및 필터링
    const results: KeywordResult[] = keywordList
      .map((item) => {
        const pcCount = parseSearchCount(item.monthlyPcQcCnt);
        const moCount = parseSearchCount(item.monthlyMobileQcCnt);

        return {
          keyword: item.relKeyword,
          totalSearch: pcCount + moCount,
          competition: item.compIdx,
        };
      })
      .sort((a, b) => b.totalSearch - a.totalSearch) // 검색량 내림차순
      .slice(0, 5); // 상위 5개만

    console.table(results); // 결과 출력
    return results;

  } catch (error: any) {
    console.error('❌ API 호출 실패:', error.response?.data || error.message);
  }
};

// 6. 실행 (ts-node index.ts)
getKeywordData('스마트스토어');

4. 이걸로 뭘 만들 수 있나? (Feat. 인디 해커)

단순히 콘솔에 찍어보고 “와 데이터 나왔다” 하고 끝내면 그냥 코딩 연습이고요. 이걸 ‘내 비즈니스’에 써먹어야죠.

저는 이렇게 활용하고 있습니다.

  • 자동 필터링: 월 검색량 3,000 이상 & 경쟁도 낮음 조건인 키워드만 뽑아서 매주 월요일 슬랙으로 전송.
  • 블로그 글감 추천: 내가 운영하는 블로그 주제와 연관된 ‘상승 키워드’를 자동으로 추출.

남들이 유료 툴 쓰면서 “무슨 키워드가 좋지?” 고민할 때, 저는 제가 짠 봇이 물어다 주는 키워드 리스트 보고 바로 글 쓰러 갑니다. 이게 개발자가 가진 최고의 레버리지 아닐까요.

3줄 요약

  • 키워드 분석 툴, 유료 결제하지 말고 직접 만들어서 쓰자.
  • 네이버 검색광고 API의 핵심은 Signature 생성이다. (위 코드 참고)
  • Action Item: 주말에 딱 2시간만 투자해서 나만의 ‘키워드 추출기’를 구축해 볼 것.

Share this post