api key 통합
parent
b1f8061811
commit
050d0631bb
14
README.md
14
README.md
|
|
@ -28,20 +28,14 @@ pip install -r requirements.txt
|
||||||
1. `.env` 파일에 API 키 설정:
|
1. `.env` 파일에 API 키 설정:
|
||||||
```
|
```
|
||||||
# OpenAI API 키
|
# OpenAI API 키
|
||||||
OPENAI_API_KEY=your-actual-api-key
|
OPENAI_API_KEY=your-openai-api-key
|
||||||
|
|
||||||
# 공공데이터 API 키 (국토교통부)
|
# 공공데이터 API 키 (국토교통부)
|
||||||
APT_TRADE_API_KEY=your-key # 아파트 매매
|
PUBLIC_DATA_API_KEY=your-public-data-api-key
|
||||||
APT_RENT_API_KEY=your-key # 아파트 전월세
|
|
||||||
OFFI_TRADE_API_KEY=your-key # 오피스텔 매매
|
|
||||||
OFFI_RENT_API_KEY=your-key # 오피스텔 전월세
|
|
||||||
SH_TRADE_API_KEY=your-key # 연립/다세대 매매
|
|
||||||
SH_RENT_API_KEY=your-key # 연립/다세대 전월세
|
|
||||||
HOUSE_TRADE_API_KEY=your-key # 단독/다가구 매매
|
|
||||||
HOUSE_RENT_API_KEY=your-key # 단독/다가구 전월세
|
|
||||||
```
|
```
|
||||||
|
|
||||||
2. 공공데이터포털(data.go.kr)에서 각 API 서비스키 발급
|
2. 공공데이터포털(data.go.kr)에서 국토교통부 실거래가 API 서비스키 발급
|
||||||
|
- 하나의 키로 모든 부동산 API 사용 가능
|
||||||
|
|
||||||
## 실행
|
## 실행
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -14,72 +14,30 @@ class PublicDataAPIClient:
|
||||||
"""API 키 및 기본 설정 초기화"""
|
"""API 키 및 기본 설정 초기화"""
|
||||||
self.base_url = "http://apis.data.go.kr/1613000"
|
self.base_url = "http://apis.data.go.kr/1613000"
|
||||||
|
|
||||||
|
# 통합 API 키
|
||||||
|
self.api_key = os.getenv("PUBLIC_DATA_API_KEY")
|
||||||
|
|
||||||
# API 엔드포인트 매핑
|
# API 엔드포인트 매핑
|
||||||
self.endpoints = {
|
self.endpoints = {
|
||||||
# 아파트
|
# 아파트
|
||||||
("아파트", "매매"): {
|
("아파트", "매매"): f"{self.base_url}/RTMSDataSvcAptTrade/getRTMSDataSvcAptTrade",
|
||||||
"url": f"{self.base_url}/RTMSDataSvcAptTrade/getRTMSDataSvcAptTrade",
|
("아파트", "전세"): f"{self.base_url}/RTMSDataSvcAptRent/getRTMSDataSvcAptRent",
|
||||||
"key": os.getenv("APT_TRADE_API_KEY")
|
("아파트", "월세"): f"{self.base_url}/RTMSDataSvcAptRent/getRTMSDataSvcAptRent",
|
||||||
},
|
|
||||||
("아파트", "전세"): {
|
|
||||||
"url": f"{self.base_url}/RTMSDataSvcAptRent/getRTMSDataSvcAptRent",
|
|
||||||
"key": os.getenv("APT_RENT_API_KEY")
|
|
||||||
},
|
|
||||||
("아파트", "월세"): {
|
|
||||||
"url": f"{self.base_url}/RTMSDataSvcAptRent/getRTMSDataSvcAptRent",
|
|
||||||
"key": os.getenv("APT_RENT_API_KEY")
|
|
||||||
},
|
|
||||||
# 오피스텔
|
# 오피스텔
|
||||||
("오피스텔", "매매"): {
|
("오피스텔", "매매"): f"{self.base_url}/RTMSDataSvcOffiTrade/getRTMSDataSvcOffiTrade",
|
||||||
"url": f"{self.base_url}/RTMSDataSvcOffiTrade/getRTMSDataSvcOffiTrade",
|
("오피스텔", "전세"): f"{self.base_url}/RTMSDataSvcOffiRent/getRTMSDataSvcOffiRent",
|
||||||
"key": os.getenv("OFFI_TRADE_API_KEY")
|
("오피스텔", "월세"): f"{self.base_url}/RTMSDataSvcOffiRent/getRTMSDataSvcOffiRent",
|
||||||
},
|
|
||||||
("오피스텔", "전세"): {
|
|
||||||
"url": f"{self.base_url}/RTMSDataSvcOffiRent/getRTMSDataSvcOffiRent",
|
|
||||||
"key": os.getenv("OFFI_RENT_API_KEY")
|
|
||||||
},
|
|
||||||
("오피스텔", "월세"): {
|
|
||||||
"url": f"{self.base_url}/RTMSDataSvcOffiRent/getRTMSDataSvcOffiRent",
|
|
||||||
"key": os.getenv("OFFI_RENT_API_KEY")
|
|
||||||
},
|
|
||||||
# 빌라/연립
|
# 빌라/연립
|
||||||
("빌라", "매매"): {
|
("빌라", "매매"): f"{self.base_url}/RTMSDataSvcSHTrade/getRTMSDataSvcSHTrade",
|
||||||
"url": f"{self.base_url}/RTMSDataSvcSHTrade/getRTMSDataSvcSHTrade",
|
("빌라", "전세"): f"{self.base_url}/RTMSDataSvcSHRent/getRTMSDataSvcSHRent",
|
||||||
"key": os.getenv("SH_TRADE_API_KEY")
|
("빌라", "월세"): f"{self.base_url}/RTMSDataSvcSHRent/getRTMSDataSvcSHRent",
|
||||||
},
|
("연립주택", "매매"): f"{self.base_url}/RTMSDataSvcSHTrade/getRTMSDataSvcSHTrade",
|
||||||
("빌라", "전세"): {
|
("연립주택", "전세"): f"{self.base_url}/RTMSDataSvcSHRent/getRTMSDataSvcSHRent",
|
||||||
"url": f"{self.base_url}/RTMSDataSvcSHRent/getRTMSDataSvcSHRent",
|
|
||||||
"key": os.getenv("SH_RENT_API_KEY")
|
|
||||||
},
|
|
||||||
("빌라", "월세"): {
|
|
||||||
"url": f"{self.base_url}/RTMSDataSvcSHRent/getRTMSDataSvcSHRent",
|
|
||||||
"key": os.getenv("SH_RENT_API_KEY")
|
|
||||||
},
|
|
||||||
("연립주택", "매매"): {
|
|
||||||
"url": f"{self.base_url}/RTMSDataSvcSHTrade/getRTMSDataSvcSHTrade",
|
|
||||||
"key": os.getenv("SH_TRADE_API_KEY")
|
|
||||||
},
|
|
||||||
("연립주택", "전세"): {
|
|
||||||
"url": f"{self.base_url}/RTMSDataSvcSHRent/getRTMSDataSvcSHRent",
|
|
||||||
"key": os.getenv("SH_RENT_API_KEY")
|
|
||||||
},
|
|
||||||
# 주택
|
# 주택
|
||||||
("주택", "매매"): {
|
("주택", "매매"): f"{self.base_url}/RTMSDataSvcSHTrade/getRTMSDataSvcSHTrade",
|
||||||
"url": f"{self.base_url}/RTMSDataSvcSHHouseTrade/getRTMSDataSvcSHHouseTrade",
|
("주택", "전세"): f"{self.base_url}/RTMSDataSvcSHRent/getRTMSDataSvcSHRent",
|
||||||
"key": os.getenv("HOUSE_TRADE_API_KEY")
|
("단독주택", "매매"): f"{self.base_url}/RTMSDataSvcSHTrade/getRTMSDataSvcSHTrade",
|
||||||
},
|
("다가구주택", "매매"): f"{self.base_url}/RTMSDataSvcSHTrade/getRTMSDataSvcSHTrade"
|
||||||
("주택", "전세"): {
|
|
||||||
"url": f"{self.base_url}/RTMSDataSvcSHHouseRent/getRTMSDataSvcSHHouseRent",
|
|
||||||
"key": os.getenv("HOUSE_RENT_API_KEY")
|
|
||||||
},
|
|
||||||
("단독주택", "매매"): {
|
|
||||||
"url": f"{self.base_url}/RTMSDataSvcSHHouseTrade/getRTMSDataSvcSHHouseTrade",
|
|
||||||
"key": os.getenv("HOUSE_TRADE_API_KEY")
|
|
||||||
},
|
|
||||||
("다가구주택", "매매"): {
|
|
||||||
"url": f"{self.base_url}/RTMSDataSvcSHHouseTrade/getRTMSDataSvcSHHouseTrade",
|
|
||||||
"key": os.getenv("HOUSE_TRADE_API_KEY")
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
def get_real_estate_data(
|
def get_real_estate_data(
|
||||||
|
|
@ -109,21 +67,19 @@ class PublicDataAPIClient:
|
||||||
# 매물 형태 정규화
|
# 매물 형태 정규화
|
||||||
property_type = self._normalize_property_type(property_type)
|
property_type = self._normalize_property_type(property_type)
|
||||||
transaction_type = self._normalize_transaction_type(transaction_type)
|
transaction_type = self._normalize_transaction_type(transaction_type)
|
||||||
print(property_type)
|
|
||||||
print(transaction_type)
|
|
||||||
|
|
||||||
# 엔드포인트 찾기
|
# 엔드포인트 찾기
|
||||||
endpoint_info = self.endpoints.get((property_type, transaction_type))
|
endpoint_url = self.endpoints.get((property_type, transaction_type))
|
||||||
if not endpoint_info:
|
if not endpoint_url:
|
||||||
return []
|
return []
|
||||||
|
|
||||||
if not endpoint_info["key"] or endpoint_info["key"] == "your-api-key-here":
|
if not self.api_key or self.api_key == "your-public-data-api-key-here":
|
||||||
print(f"Warning: API key not configured for {property_type} {transaction_type}")
|
print(f"Warning: PUBLIC_DATA_API_KEY not configured")
|
||||||
return []
|
return []
|
||||||
|
|
||||||
# API 호출
|
# API 호출
|
||||||
params = {
|
params = {
|
||||||
"serviceKey": endpoint_info["key"],
|
"serviceKey": self.api_key,
|
||||||
"LAWD_CD": region_code,
|
"LAWD_CD": region_code,
|
||||||
"DEAL_YMD": deal_ymd,
|
"DEAL_YMD": deal_ymd,
|
||||||
"pageNo": 1,
|
"pageNo": 1,
|
||||||
|
|
@ -131,7 +87,7 @@ class PublicDataAPIClient:
|
||||||
}
|
}
|
||||||
|
|
||||||
try:
|
try:
|
||||||
response = requests.get(endpoint_info["url"], params=params, timeout=10)
|
response = requests.get(endpoint_url, params=params, timeout=10)
|
||||||
response.raise_for_status()
|
response.raise_for_status()
|
||||||
|
|
||||||
# XML 파싱
|
# XML 파싱
|
||||||
|
|
|
||||||
|
|
@ -47,6 +47,21 @@
|
||||||
- docs/project_plan.md 업데이트 (API 가이드 문서 추가)
|
- docs/project_plan.md 업데이트 (API 가이드 문서 추가)
|
||||||
- 웹 검색 및 브라우저를 통한 실제 API 정보 수집
|
- 웹 검색 및 브라우저를 통한 실제 API 정보 수집
|
||||||
|
|
||||||
|
[2025-08-19 15:51:03] 공공데이터 API 키 통합 작업 완료
|
||||||
|
- .env 파일 수정
|
||||||
|
- 8개의 개별 API 키를 PUBLIC_DATA_API_KEY 하나로 통합
|
||||||
|
- 공공데이터포털 서비스키는 모든 API에서 공통 사용 가능
|
||||||
|
- backend/public_data_api.py 수정
|
||||||
|
- 통합 API 키 사용하도록 변경
|
||||||
|
- endpoints 구조 단순화 (URL만 저장)
|
||||||
|
- 불필요한 print 문 제거
|
||||||
|
- README.md 업데이트
|
||||||
|
- API 키 설정 방법 간소화
|
||||||
|
- 하나의 키로 모든 부동산 API 사용 가능함을 명시
|
||||||
|
|
||||||
|
[2025-08-19 15:46:53] 공공데이터 API 키 통합 작업 시작
|
||||||
|
- 여러 개의 API 키를 하나로 통일
|
||||||
|
|
||||||
[2025-08-19 15:22:10] OpenAI 기반 매물 필터링 기능 추가 완료
|
[2025-08-19 15:22:10] OpenAI 기반 매물 필터링 기능 추가 완료
|
||||||
- backend/openai_parser.py 수정
|
- backend/openai_parser.py 수정
|
||||||
- filter_listings 메서드 추가
|
- filter_listings 메서드 추가
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue