● 요약
공공데이터포털의 오픈API를 이용해 버스 도착정보를 얻는 코드와 프로그램 자체에 대한 설명입니다.
API 설명 및 사용법이 궁금하신 분들은 전 편(https://senticoding.tistory.com/44)을 봐주세요.
● Code 안내
모든 코드는 Github repository에 올려놓았습니다.
주석을 잘 달아놓았으니 따로 설명은 안할게요.
routeId까지만 구하는 과정은 꽤 쉬워서 request랑 cheerio에 대해 제대로는 모르더라고 어느 정도 따라 오실 수 있을 거라고 생각돼요.
근데 routeId -> routeName으로 바꾸어 출력하는 부분을 Promise를 이용해 구현해놓았는데
Promise와 then()에 대한 이해가 아예 없으시면 힘들 수 있습니다.
우선 코드 종류와 간단한 설명을 아래에 적을게요.
- getStationId.js
: 정류소 번호를 넘겨주면 stationId와 staionName을 출력해준다.
- getBusArrivalsOnlyRouteId.js ( 버스 도착 정보를 routeId 까지 나오는 상태까지만 출력하는 코드 )
: getStaitonId.js를 통해 얻은 stationId를 이용해 그 정류장에 도착하는 버스들의 도착 정보를 얻는다.
- getBusArrivals.js ( 버스 도착 정보를 routeId에서 routeName까지 변환해서 출력하는 코드 )
: getBusArrivalsOnlyRouteId.js와 유사하지만, routeId -> routeName으로 변환하는 과정이 다소 request및 js 입문자들에게는 까다로울 수 있음.
● getBusArrivals.js 만 하나 올려봄
var request=require("request")
var cheerio=require("cheerio")
var defaultUrl="http://openapi.gbis.go.kr/ws/rest/busarrivalservice/station" //정류소 조회 REST Api url
const SERVICE_KEY="CHECK THIS OUT" //!!!꼭 서비스키 자기꺼로 수정해서 쓰셔야합니다.
var keyword="203000125" //query로 던져지는 인자, getStationId에서 얻은 정류소 id를 넣어주면 됨.
//버스 도착 정보의 routeId를 routeName으로 바꾸기도 해주는 작업
function routeIdToName(routeId){
//routeId를 통해 버스 정보를 얻는 REST api를 이용해 그 정보 중 버스 이름을 빼올 것임
//request 모듈은 async하기 때문에 Promise를 이용해야한다.
//예를 들어 routeId를 얻었고 그것을 이 routeIdToName 함수를 이용해 routeName으로 정리한 뒤
//predictTime과 정리해서 출력하고 싶은데 Promise를 이용하지 않으면
//routeIdToName 함수가 백그라운드에서 작업하는 와중에 이미 출력은 되고 있기 때문에
//undefined 혹은 Promise pending 등으로 값이 입력될 것이다..
//Promise가 낯설면 좀 어려울 수도 ㅎㅎ.......
return new Promise( (resolve)=>{
//url은 버스노선조회 서비스의 노선정보항목조회 api url임.
request("http://openapi.gbis.go.kr/ws/rest/busrouteservice/info"+"?serviceKey="+SERVICE_KEY+"&routeId="+routeId, function(err, res, body){
var $=cheerio.load(body)
resolve($("routeName").text())
})
})
}
//getBusAriivalsOnlyRouteId와 비슷한데
//버스 도착정보의 routeId를 routeName으로 변환까지 한 뒤 출력해주는 작업
request(defaultUrl+"?serviceKey="+SERVICE_KEY+"&stationId="+keyword, function(err, res, body){
var $=cheerio.load(body)
// 각각 버스 도착 정보는 busArrivalList 태그 안에 들어있음
// 따라서 each문 이용
$("busArrivalList").each(function(index, bus){
// bus 변수를 context로 주어서 선택자 이용
// Promise와 then을 이용해 깔끔하게 표현
routeIdToName($('routeId', bus).text())
.then(function(routeName){
console.log("=====================")
console.log("routeName : "+routeName)
console.log($('predictTime1', bus).text()+" mins left "+$('predictTime2', bus).text()+" mins left")
console.log("=====================")
})
})
})
'Node.js' 카테고리의 다른 글
[오픈 API] nodejs를 이용해 버스 도착 정보 얻기 - 1. API 사용법 (0) | 2019.02.15 |
---|---|
내부함수에서 외부함수로 리턴값 전달하기, 프로미스 리턴하기 (0) | 2019.01.20 |
프론트엔드 예제 블로그 만들기 (0) | 2019.01.05 |
[nodejs] 학식 카톡봇 예제 (0) | 2018.10.06 |
Node js로 유튜브 동영상 다운로드 받기 (0) | 2018.10.02 |