한국관광공사_국문 관광정보 서비스_GW
오픈API 상세
전체적인 흐름은 아래와 같다
이때 지역정보는 지역코드 조회 서비스
를 통해 화면에 표시된다.
타입정보는 타입코드표
를 통해 화면에 표시된다.
분류정보는 서비스분류코드조회
를 통해 화면에 표시된다.
파라미터를 조합해서 다양한 방식으로 관광 정보를 조회할 수 있다
나는 이중 키워드 검색
을 사용하려고 한다.
상세정보화면
내가 가장 주의깊게 봐야될 상세정보 화면이다. 상세정보에는 아래와 같은 정보가 포함되어 있다.
상세정보는 공통정보, 소개정보, 반복정보, 이미지정보의 4개 api로 제공된다.
2015년 1월 이후에 공공데이터포털에서 받은 인증키 경우, 인코딩불필요
MobileApp 파라미터는 서비스(웹,앱등) 별로 활용통계를 산출하기 위한 항목입니다. URL요청시 반드시 기재
지역코드조회
관광지 검색 시 필요한 지역코드(예: 서울, 부산 등)
또는
특정 지역 내 시군구코드(예: 강남구, 강서구 등)
목록을 조회하는 기능을 제공
서비스분류코드조회
관광지, 숙박 등 콘텐츠 유형(contentTypeId)
에 따른 대분류, 중분류, 소분류 코드 및 명칭 조회.
지역기반관광정보조회
지역(시/도 + 시군구)
기반으로 관광정보 목록을 조회
이떄 contentTypeId, 대중소 분류
로 필터링도 가능하다!
위치기반관광정보조회
내주변 좌표를 기반으로 관광정보 목록을 조회
키워드검색조회
키워드를 이용해 관광정보를 검색하는 기능
Plango에서 사용자가 “시장”, “폭포”, “궁궐”
등 특정 키워드를 입력했을 때 관광지를 찾아주는 데 사용할수 있겠다!
이때 지역(시/도 + 시군구), contentTypeId, 대중소 분류
로 필터링도 가능하다!
행사정보조회
행사/공연/축제정보를 날짜로 조회하는 기능
숙박정보조회
숙박 정보 목록을 조회
공통정보조회
관광지 ID(contentId)를 이용해 제목, 주소, 연락처, 개요, 이미지, 좌표 등 상세 정보를 조회
contentId는 각 관광지를 고유하게 식별하는 ID 값
소개정보조회
특정 관광지의 상세 소개 정보(예: 운영시간, 주차시설, 축제 기간, 관람 연령 등)를 관광 타입에 따라 다르게 조회할 수 있는 기능.
관광지, 숙박, 음식점, 축제 등 타입에 따라 다르게 제공되는 상세 소개 정보 조회.
반복정보조회
관광지 유형에 따라 반복되는 상세 정보(예: 숙박의 객실 목록, 축제의 프로그램 리스트 등)를 조회
숙박 (contentTypeId=32)
객실 정보 반복
roomtitle, roomintro, roomimg1, roombasecount, roomaircondition 등
여행코스 (contentTypeId=25)
코스 구간 정보 반복
subname, subdetailoverview, subdetailimg 등
그 외 (관광지, 축제, 문화시설 등)
제목-내용 쌍 정보 반복
입장료, 관람료, 주차요금 등
이미지정보조회
이미지URL 목록을 조회하는기능.
따라서 나는 장소소개 페이지를 만들기 위해 아래의 서비스를 사용하기로 결정했다
개발 하다 보니 추가적으로 키워드검색조회가 필요하다는것을 알게 되었다.
국문콘텐츠타입(ContentTypeId) 코드표
공공데이터포털에러코드
Request Parameter는 아래와 같다
다) 응답메시지 (Response Message)
예를들어 컨텐츠ID가 “126508”인 관광정보의 “기본정보”, “주소”, “개요” 정보를 조회하고 싶다면 아래와 같이 요청하면 된다.
http://apis.data.go.kr/B551011/KorService1/detailCommon1?serviceKey=인증키&contentId=126508&defaultYN=Y&addrinfoYN=Y&overviewYN=Y&MobileOS=ETC&MobileApp=AppTest
위와 같이 요청을 하면 아래와 같은 정보를 받아 볼 수 있다.
또는 json으로 요청한다면
따라서 나는 아래와 같이 호출할 예정이다.
numOfRows (한페이지결과수) = 1
pageNo (페이지번호) = 1
MobileOS (OS 구분) = ETC
MobileApp (서비스명) = plango
serviceKey (인증키(서비스키)) = 내 인증키
_type (응답메세지 형식) = Json
contentId (콘텐츠ID) = 키워드 기반 조회를 통해 얻은 콘텐츠ID
contentTypeId (관광타입 ID) = 키워드 기반 조회를 통해 얻은 관광타입 ID
defaultYN (기본정보조회) = Y
firstImageYN (대표이미지조회) = Y
areacodeYN (지역코드조회) = N
catcodeYN (서비스분류코드조회) = N
addrinfoYN (주소조회) = Y
mapinfoYN (좌표조회) = Y
overviewYN (개요조회) = Y
따라서 나는 아래와 같이 요청을 할 예정이다!
https://apis.data.go.kr/B551011/KorService1/detailCommon1
?numOfRows=1
&pageNo=1
&MobileOS=ETC
&MobileApp=plango
&serviceKey=
&_type=Json
&contentId=126508
&contentTypeId=15
&defaultYN=Y
&firstImageYN=Y
&areacodeYN=N
&catcodeYN=N
&addrinfoYN=Y
&mapinfoYN=Y
&overviewYN=Y
브라우져 상에서 테스트한 결과 아래와 같이 성공적으로 데이터를 얻을 수 있었다!
{
"response": {
"header": {
"resultCode": "0000",
"resultMsg": "OK"
},
"body": {
"items": {
"item": [
{
"contentid": "2674675",
"contenttypeid": "15",
"title": "수원화성의 비밀",
"createdtime": "20201006015851",
"modifiedtime": "20240111152040",
"tel": "031-290-3563",
"telname": "수원문화재단",
"homepage": "\u003Ca href=\"https://www.swcf.or.kr/?p=74&viewMode=view&idx=192\" target=\"_blank\" title=\"새창: 홈페이지로 이동\"\u003Ehttps://www.swcf.or.kr/\u003C/a\u003E",
"booktour": "",
"firstimage": "http://tong.visitkorea.or.kr/cms/resource/74/2674674_image2_1.jpg",
"firstimage2": "http://tong.visitkorea.or.kr/cms/resource/74/2674674_image2_1.jpg",
"cpyrhtDivCd": "Type3",
"addr1": "경기도 수원시 팔달구 행궁로 11",
"addr2": "(남창동)",
"zipcode": "16261",
"mapx": "127.0152812635",
"mapy": "37.2810769133",
"mlevel": "6",
"overview": "스마트폰으로 수원화성 일원에서 진행하는 방탈출 게임 형식의 콘텐츠로 증강현실 등 다양한 정보통신기술과 역사를 직접 체험할 수 있는 관광 콘텐츠"
}
]
},
"numOfRows": 1,
"pageNo": 1,
"totalCount": 1
}
}
}
import requests
service_key = "비밀"
url = f"http://apis.data.go.kr/B551011/KorService1/detailCommon1?serviceKey={service_key}"
params = {
"MobileApp": "plango",
"MobileOS": "ETC",
"numOfRows": 1,
"pageNo": 1,
"contentId": 2674675,
"contentTypeId": 15,
"defaultYN": "Y",
"firstImageYN": "Y",
"addrinfoYN": "Y",
"mapinfoYN": "Y",
"overviewYN": "Y",
"areacodeYN": "N",
"catcodeYN": "N",
"_type": "json"
}
response = requests.get(url, params=params)
print(response.status_code)
print(response.json())
위 코드를 실행 시키면
앞으로 api.visitkorea.or.kr
이 페이지에 있는 아래의 정보를 가져와 보겠다!
하나
항목 | 내용 |
---|---|
우편번호 | 16261 |
전화명 | 수원문화재단 |
전화번호 | 031-290-3563 |
주소 | 경기도 수원시 팔달구 행궁로 11 (남창동) |
개요:
스마트폰으로 수원화성 일원에서 진행하는 방탈출 게임 형식의 콘텐츠로 증강현실 등 다양한 정보통신기술과 역사를 직접 체험할 수 있는 관광 콘텐츠
둘
항목 | 내용 |
---|---|
주최자 정보 | 수원문화재단 |
주최자 연락처 | 031-290-3563 |
주관사 정보 | 경기관광공사, 수원문화재단 |
행사 시작일 | 2022-01-01 |
행사 종료일 | 2024-12-31 |
공연 시간 | 연중 (밤 10시 이후 제한) |
행사 장소 | 수원화성 일원 |
진행 형태 | 선택안함 |
축제 형태 | 상시 |
셋
이제 가져오는 과정을 살펴보자
응답메시지
나는 아래와 같이 호출할 예정이다.
1
1
ETC
plango
내 인증키
Json
조회한 콘텐츠 id
조회한 관광타입 ID
따라서
http://apis.data.go.kr/B551011/KorService1/detailIntro1
?numOfRows=1
&pageNo=1
&MobileOS=ETC
&MobileApp=plango
&serviceKey=내 인증키
&_type=Json
&contentId=2674675
&contentTypeId=15
결과는 아래와 같다!
{
"response": {
"header": {
"resultCode": "0000",
"resultMsg": "OK"
},
"body": {
"items": {
"item": [
{
"contentid": "2674675",
"contenttypeid": "15",
"sponsor1": "수원문화재단",
"sponsor1tel": "031-290-3563",
"sponsor2": "경기관광공사, 수원문화재단",
"sponsor2tel": "",
"eventenddate": "20241231",
"playtime": "연중(밤 10시 이후 제한)",
"eventplace": "수원화성 일원",
"eventhomepage": "",
"agelimit": "",
"bookingplace": "",
"placeinfo": "",
"subevent": "",
"program": "",
"eventstartdate": "20220101",
"usetimefestival": "7,500원",
"discountinfofestival": "",
"spendtimefestival": "",
"festivalgrade": ""
}
]
},
"numOfRows": 1,
"pageNo": 1,
"totalCount": 1
}
}
}
import requests
service_key = "비밀"
url = f"http://apis.data.go.kr/B551011/KorService1/detailIntro1?serviceKey={service_key}"
params = {
"MobileApp": "plango",
"MobileOS": "ETC",
"numOfRows": 1,
"pageNo": 1,
"contentId": 2674675,
"contentTypeId": 15,
"_type": "json"
}
response = requests.get(url, params=params)
print(response.status_code)
print(response.json())
위 코드를 실행 시키면
응답메시지
나는 아래와 같이 호출할 예정이다.
1
1
ETC
plango
내 인증키
Json
조회한 콘텐츠 id
조회한 관광타입 ID
따라서
http://apis.data.go.kr/B551011/KorService1/detailInfo1
?numOfRows=1
&pageNo=1
&MobileOS=ETC
&MobileApp=plango
&serviceKey=내 인증키
&_type=Json
&contentId=2674675
&contentTypeId=15
결과는 아래와 같다!
{
"response": {
"header": {
"resultCode": "0000",
"resultMsg": "OK"
},
"body": {
"items": {
"item": [
{
"contentid": "2674675",
"contenttypeid": "15",
"serialnum": "0",
"infoname": "행사소개",
"infotext": "스마트폰으로 수원화성 일원에서 진행하는 방탈출 게임 형식의 콘텐츠로 증강현실 등 다양한 정보통신기술과 역사를 직접 체험할 수 있는 관광 콘텐츠",
"fldgubun": "2"
}
]
},
"numOfRows": 1,
"pageNo": 1,
"totalCount": 1
}
}
}
추가적으로 컨텐츠ID가 2504510
이고, 타입이 32(숙박)
인 상세반복정보(객실정보) 조회(한페이지에 10개씩, 첫페이지 조회)를 해보자.
http://apis.data.go.kr/B551011/KorService1/detailInfo1
?numOfRows=10
&pageNo=1
&MobileOS=ETC
&MobileApp=plango
&serviceKey=내 인증키
&_type=Json
&contentId=2504510
&contentTypeId=32
import requests
service_key = ""
url = f"http://apis.data.go.kr/B551011/KorService1/detailInfo1?serviceKey={service_key}"
params = {
"MobileApp": "plango",
"MobileOS": "ETC",
"numOfRows": 10,
"pageNo": 1,
"contentId": 2674675,
"contentTypeId": 15,
"_type": "json"
}
response = requests.get(url, params=params)
print(response.status_code)
print(response.json())
응답메시지
나는 아래와 같이 호출할 예정이다.
10
1
ETC
plango
내 인증키
Json
조회한 콘텐츠 id
따라서
http://apis.data.go.kr/B551011/KorService1/detailImage1
?numOfRows=10
&pageNo=1
&MobileOS=ETC
&MobileApp=plango
&serviceKey=내 인증키
&_type=Json
&contentId=2674675
&imageYN=Y
&subImageYN=Y
결과는 아래와 같다!
{
"response": {
"header": {
"resultCode": "0000",
"resultMsg": "OK"
},
"body": {
"items": {
"item": [
{
"contentid": "2674675",
"originimgurl": "http://tong.visitkorea.or.kr/cms/resource/05/2674805_image2_1.jpg",
"imgname": "수원화성의 비밀 2020(2)",
"smallimageurl": "http://tong.visitkorea.or.kr/cms/resource/05/2674805_image2_1.jpg",
"cpyrhtDivCd": "Type3",
"serialnum": "2674805_2"
},
{
"contentid": "2674675",
"originimgurl": "http://tong.visitkorea.or.kr/cms/resource/06/2674806_image2_1.jpg",
"imgname": "수원화성의 비밀 2020(1)",
"smallimageurl": "http://tong.visitkorea.or.kr/cms/resource/06/2674806_image2_1.jpg",
"cpyrhtDivCd": "Type3",
"serialnum": "2674806_3"
},
{
"contentid": "2674675",
"originimgurl": "http://tong.visitkorea.or.kr/cms/resource/07/2674807_image2_1.jpg",
"imgname": "수원화성의 비밀 2020(3)",
"smallimageurl": "http://tong.visitkorea.or.kr/cms/resource/07/2674807_image2_1.jpg",
"cpyrhtDivCd": "Type3",
"serialnum": "2674807_1"
}
]
},
"numOfRows": 3,
"pageNo": 1,
"totalCount": 3
}
}
}
이미지 링크 들어가보면 잘 나온다!
import requests
service_key = ""
url = f"http://apis.data.go.kr/B551011/KorService1/detailImage1?serviceKey={service_key}"
params = {
"MobileApp": "plango",
"MobileOS": "ETC",
"numOfRows": 10,
"pageNo": 1,
"contentId": 2674675,
"imageYN": "Y",
"subImageYN": "Y",
"_type": "json"
}
response = requests.get(url, params=params)
print(response.status_code)
print(response.json())
공통정보, 소개정보, 반복정보, 이미지정보를 조회하기 위해서는 contentid
와 contenttypeid
가 필요하다.
지역기반관광정보조회(areaBasedList1)
- 특정 지역 내 관광지 리스트 조회 키워드검색조회(searchKeyword1)
- 키워드로 관광지 검색으로 얻을 수 있다.
둘중 키워드검색조회(searchKeyword1)
을 아용하기로 결정했다!
처음부터 공통정보, 소개정보, 반복정보, 이미지정보를
아르떼뮤지엄
과 같이 검색해서 얻을 수 있으면 참 좋을텐데
키워드검색조회(searchKeyword1)
를 거쳐
contentid
와contenttypeid
를 얻어낸후
이거를 통해서 공통정보, 소개정보, 반복정보, 이미지정보 얻을 수 있다는게 참 아쉽다!
따라서 결론적으로
Plango에서 관광지 이름(예: “아르떼뮤지엄”)을 입력받고, 해당 관광지의 상세한 정보를 화면에 표시하려면 아래와 같이 총 5개 TourAPI 서비스를 사용 해야 된다.
사용자 입력: 아르떼뮤지엄
searchKeyword1(키워드검색조회)
→ contentId, contentTypeId 획득
detailCommon1(공통정보조회)
→ 이름, 주소, 개요, 위치
detailIntro1(소개정보조회)
→ 운영시간, 휴무일, 요금 등
detailInfo1(반복정보조회)
→ 안내/객실/프로그램 등의 반복 정보
detailImage1(이미지정보조회)
→ 이미지 리스트
응답메시지
나는 아래와 같이 호출할 예정이다.
10
1
ETC
plango
내 인증키
Json
Y
A
필요x
필요x
필요x
필요x
필요x
필요x
시장
따라서
http://apis.data.go.kr/B551011/KorService1/searchKeyword1
?numOfRows=10
&pageNo=1
&MobileOS=ETC
&MobileApp=plango
&serviceKey=내 인증키
&_type=Json
&listYN=Y
&arrange=A
&keyword=시장
{
"response": {
"header": {
"resultCode": "0000",
"resultMsg": "OK"
},
"body": {
"items": {
"item": [
{
"addr1": "충청북도 청주시 흥덕구 가경동",
"addr2": "1438",
"areacode": "33",
"booktour": "",
"cat1": "A04",
"cat2": "A0401",
"cat3": "A04010200",
"contentid": "1433504",
"contenttypeid": "38",
"createdtime": "20111111014944",
"firstimage": "",
"firstimage2": "",
"cpyrhtDivCd": "",
"mapx": "127.4341171334",
"mapy": "36.6286485111",
"mlevel": "6",
"modifiedtime": "20250311152005",
"sigungucode": "10",
"tel": "",
"title": "가경 터미널시장"
}
]
},
"numOfRows": 1,
"pageNo": 1,
"totalCount": 790
}
}
}
import requests
service_key = "비밀"
url = f"http://apis.data.go.kr/B551011/KorService1/searchKeyword1?serviceKey={service_key}"
params = {
"MobileApp": "plango",
"MobileOS": "ETC",
"numOfRows": 1,
"pageNo": 1,
"listYN": "Y",
"arrange": "A",
"keyword": "시장",
"_type": "json"
}
response = requests.get(url, params=params)
print(response.status_code)
print(response.json())
위 코드를 실행 시키면