열심히 사진 찍고 1시간 동안 정성스럽게 글을 썼는데, 다음 날 확인해 보면 방문자가 고작 3명…
혹시 이런 경험 있으신가요?
단언컨대, 여러분의 글솜씨가 부족해서가 아닙니다.
경쟁 문서가 수십만 개씩 쌓여 있는 대형 키워드(레드오션)에 들어갔기 때문에, 내 글이 10페이지 뒤로 밀려 아무도 보지 못하는 것뿐입니다.
블로그 글을 쓰기 전, 키워드 1개만 넣으면 네이버 서버에서 실시간 월간 검색량과 총 발행 문서수를 1초 만에 긁어와 ‘빈집’인지 판별해 주는 실전 파이썬 코드를 공개합니다.
1단계: 네이버 공식 무료 API 키 발급 (2분 소요)
네이버 서버에서 직접 데이터를 받아오려면 공식 무료 API 키 2개가 필요합니다. (비용 0원, 일 25,000회 무료)
① 네이버 블로그 검색 API (NAVER API HUB)
주의: 기존 네이버 개발자센터(
developers.naver.com)가 아닌, **네이버 클라우드 플랫폼(NCP)의 ‘NAVER API HUB’**에서 발급받아야 합니다.
- 네이버 클라우드 플랫폼 콘솔 접속 및 로그인
- 좌측 메뉴: Services -> Application Services -> NAVER API HUB (또는 AI·NAVER API)
- [Application 등록] 버튼 클릭
- Application 이름: 임의 입력 (예:
my-blog-scout) - 서비스 선택: [선택] 검색 (Search) 체크
- 서비스 환경 등록: Web 서비스 URL 입력 칸에
http://localhost입력 (로컬 프로그램용이므로 localhost를 넣으시면 바로 통과됩니다!)
- Application 이름: 임의 입력 (예:
- 등록 완료 후 생성된 창에서 인증 정보 확인:
Client IDClient Secret
② 네이버 검색광고 API (SearchAD — 검색량 조회용)
- 네이버 검색광고 로그인
- 우측 상단 메뉴: [도구] -> [API 관리] 이동
- [내 계정 API 키 발급] 클릭
- 화면에 표시되는 3가지 복사:
CUSTOMER ID(우측 상단 계정명 옆 숫자 7자리)API 키 (Access License)비밀키 (Secret Key)
2단계: 황금키워드 판별 공식 (경쟁 포화도)
네이버 서버에서 가져온 데이터를 아래 공식으로 즉시 판정합니다:
$$\text{경쟁 포화도} = \frac{\text{블로그 총 문서수}}{\text{월간 총 검색량 (PC + 모바일)}}$$
| 포화도 지수 | 등급 및 판정 | 핵심 공략 가이드 |
|---|---|---|
| 0.3 이하 | S급 초특급 빈집 | 검색 3,000회에 글은 900개 미만. 쓰기만 해도 첫 페이지 노출 확률 90% |
| 0.8 이하 | A급 우수 빈집 | 경쟁이 과열되지 않아, 지수 낮은 일반 블로그도 유입을 독점하는 구간 |
| 1.5 이상 | 과열 주의 | 검색 수요보다 글이 훨씬 많아 대형 인플루언서들의 치열한 격전지 (진입 보류) |
| 3.0 이상 | 진입 비권장 | 정성껏 써도 며칠 뒤면 5페이지 밖으로 밀려 조회수 0명이 되는 레드오션 (시간 낭비) |
3단계: 단일 웹 실행 앱 제작 프롬프트
복잡한 터미널 명령어 치거나 파이썬 설치로 헤맬 필요 전혀 없습니다!
ChatGPT 데스크탑(Codex 모드), Claude Code 데스크탑, Google Antigravity 등 어떤 AI 데스크탑 앱이든 아래 프롬프트를 그대로 복사해서 붙여넣기만 하세요.
AI가 필요한 라이브러리 자동 설치부터, 내 컴퓨터 웹 브라우저(http://localhost:5000)에 깔끔한 검색창이 뜨는 나만의 미니 키워드 조회 웹 앱(app.py + run.bat)을 10초 만에 완성해 줍니다.
아래 제공된 [네이버 키워드 조회 로직]을 기반으로, 내 로컬 컴퓨터에서 브라우저로 띄워 쓰는 단일 파일 웹 애플리케이션(app.py)과 원클릭 실행 스크립트를 작성해줘.
[상세 구현 스펙]
1. 프레임워크: Flask 단일 파일(app.py)로 작성하고, 별도 템플릿 폴더 없이 HTML/CSS/JS를 app.py 내부에 인라인 렌더링할 것.
2. 사용자 인터페이스 & 동작:
- 깔끔하고 모던한 카드형 UI (중앙 검색창 + [조회하기] 버튼 + 로딩 스피너)
- 페이지 새로고침 없이 Fetch API(AJAX)로 결과를 비동기 조회하여 아래 카드 형태로 즉시 표시할 것.
- 결과 카드 표시 항목: 월간 총 검색량(PC/모바일 분리), 블로그 총 문서수, 경쟁 포화도 수치 및 등급(S급/A급/주의/레드오션 색상 배지)
- 잘못된 키나 통신 에러 발생 시 프로그램이 꺼지지 않고 화면에 친절한 오류 안내 박스를 띄울 것.
3. 자동 브라우저 실행:
- 서버 기동 시 webbrowser 모듈과 threading.Timer를 사용해 http://localhost:5000 이 기본 웹 브라우저에서 1초 뒤 자동으로 열리도록 구현할 것.
4. 원클릭 실행 스크립트 (run.bat 및 run.sh):
- Windows용(run.bat)과 Mac용(run.sh) 제공
- 파이썬 설치 여부를 먼저 체크하고, 미설치 시 다운로드 링크 안내 후 종료
- 설치되어 있다면 'pip install flask requests'를 자동 실행하여 의존성을 맞춘 뒤, 즉시 app.py를 실행하도록 작성할 것.
5. 아래 기존 네이버 API 로직(HMAC 서명, parse_cnt, 포화도 등급 판정)을 100% 원형 보존하여 이식할 것.
6. 원클릭 자동 실행: 코드 생성이 완료되면 직접 백그라운드 터미널 명령으로 서버를 구동하고 브라우저(http://localhost:5000)를 즉시 오픈할 것.
[내 네이버 API 키]
- CUSTOMER_ID: "YOUR_CUSTOMER_ID" # (검색광고 고객 ID 7자리 숫자)
- SEARCHAD_API_KEY: "YOUR_SEARCHAD_API_KEY" # (검색광고 API 라이선스 키)
- SEARCHAD_SECRET_KEY: "YOUR_SEARCHAD_SECRET_KEY" # (검색광고 비밀키)
- NAVER_CLIENT_ID: "YOUR_NCP_CLIENT_ID" # (네이버 클라우드 Client ID)
- NAVER_CLIENT_SECRET: "YOUR_NCP_CLIENT_SECRET" # (네이버 클라우드 Secret)
[기본 네이버 API 조회 로직 (35줄 파이썬)]
import time, requests, base64, hmac, hashlib
def get_keyword_scout(keyword: str):
# 키 누락 및 한글 플레이스홀더 오류 방어
if any(not k.isascii() or "YOUR" in k or "입력" in k for k in [CUSTOMER_ID, SEARCHAD_API_KEY, SEARCHAD_SECRET_KEY, NAVER_CLIENT_ID, NAVER_CLIENT_SECRET]):
return {"keyword": keyword, "pc": 0, "mob": 0, "total_search": 0, "doc_count": 0, "sat_ratio": 0, "grade": "[안내] API 키를 먼저 입력해주세요"}
# ① 네이버 검색광고 API (월간 검색량)
timestamp = str(int(time.time() * 1000))
path = "/keywordstool"
sig = base64.b64encode(hmac.new(SEARCHAD_SECRET_KEY.encode(), f"{timestamp}.GET.{path}".encode(), hashlib.sha256).digest()).decode()
headers_ad = {"X-Timestamp": timestamp, "X-API-KEY": SEARCHAD_API_KEY, "X-Customer": CUSTOMER_ID, "X-Signature": sig}
r_ad = requests.get(f"https://api.naver.com{path}", params={"hintKeywords": keyword.replace(" ", ""), "showDetail": "1"}, headers=headers_ad).json()
item = next((k for k in r_ad.get("keywordList", []) if k.get("relKeyword") == keyword.replace(" ", "")), None)
def parse_cnt(v):
if isinstance(v, str) and v.startswith("<"): return 5
try: return int(v)
except: return 0
pc = parse_cnt(item.get("monthlyPcQcCnt", 0)) if item else 0
mob = parse_cnt(item.get("monthlyMobileQcCnt", 0)) if item else 0
total_search = pc + mob
# ② 네이버 블로그 검색 API (총 발행 문서수 - 최신 NCP API HUB 우선)
headers_nv = {"X-NCP-APIGW-API-KEY-ID": NAVER_CLIENT_ID, "X-NCP-APIGW-API-KEY": NAVER_CLIENT_SECRET}
url_nv = "https://naverapihub.apigw.ntruss.com/search/v1/blog"
res_nv = requests.get(url_nv, params={"query": keyword, "display": 1}, headers=headers_nv)
if res_nv.status_code != 200:
headers_nv = {"X-Naver-Client-Id": NAVER_CLIENT_ID, "X-Naver-Client-Secret": NAVER_CLIENT_SECRET}
url_nv = "https://openapi.naver.com/v1/search/blog.json"
res_nv = requests.get(url_nv, params={"query": keyword, "display": 1}, headers=headers_nv)
doc_count = res_nv.json().get("total", 0) if res_nv.status_code == 200 else 0
# ③ 경쟁 포화도 계산
sat_ratio = round(doc_count / max(total_search, 1), 2)
if sat_ratio <= 0.3: grade = "[S급] 초특급 빈집 (추천)"
elif sat_ratio <= 0.8: grade = "[A급] 우수 공략지 (추천)"
elif sat_ratio <= 1.5: grade = "[B급] 보통 (경쟁 발생)"
else: grade = "[과포화] 진입 비권장"
return {"keyword": keyword, "pc": pc, "mob": mob, "total_search": total_search, "doc_count": doc_count, "sat_ratio": sat_ratio, "grade": grade}
참고 (웹 브라우저 사용 시): 브라우저 대화창에 넣으실 때는 맨 마지막에
"완성된 파일들을 압축한 keyword_tool.zip 다운로드 링크를 제공해줘"라는 한 줄을 덧붙이시면, 챗GPT가 다운로드 버튼을 대화창에 직접 만들어줍니다!
실행 및 유지보수 가이드 (FAQ)
- Q1. AI가 파일을 다 만들었다고 하는데 브라우저가 안 떠요. 어떻게 실행하나요?
파이썬 명령어나 검은 터미널 창을 몰라도 전혀 걱정 마세요! 지금 대화 중인 AI(Claude, Antigravity, ChatGPT 등) 채팅창에 **“방금 만든 프로그램 지금 바로 터미널에서 백그라운드로 실행해서 브라우저 띄워줘”**라고 한 줄만 치시면 AI가 알아서 서버를 켜고 화면을 띄워줍니다. - Q2. 실행 도중 빨간 글씨 오류나 통신 에러가 발생하면요?
본문에 검증된 100% 정답 코드가 다 들어있기 때문에 절대 당황하실 필요 없습니다. 터미널이나 화면에 뜬 오류 문구 전체를 그대로 복사해서 AI 대화창에 **“이 에러 수정해서 다시 실행해줘”**라고 던지시면 10초 만에 완벽히 고쳐줍니다. - Q3. 내일 컴퓨터를 껐다가 다시 켰을 때는 어떻게 다시 여나요?
코드를 다시 짤 필요가 전혀 없습니다! 기존에 작업했던 AI 대화창을 다시 열고 **“어제 만든 이 프로그램(app.py) 서버 다시 실행해서 브라우저 열어줘”**라고만 요청하시면 즉시 다시 켜집니다.
다음 2탄 예고: 상위 1~3위 발행일자의 비밀
- 검색량 5,000회에 문서수 1,000개라 “와! 빈집이다!” 하고 글을 썼는데도 조회가 안 나오는 경우가 있습니다.
- 왜일까요? 겉보기엔 문서수가 적어 보여도, 상위 1~3위를 대형 인플루언서들이 ‘어제오늘’ 꽉 잡고 있는 실시간 격전지일 수 있기 때문입니다.
- 다음 2탄에서는 상위 1~3위 글의 ‘발행일자’로 진짜 빈집과 가짜 빈집을 3초 만에 발라내는 체크리스트를 공개합니다.