본문 바로가기

Node.js

[오픈 API] nodejs를 이용해 버스 도착 정보 얻기 - 2. 코드

● 요약


공공데이터포털의 오픈API를 이용해 버스 도착정보를 얻는 코드와 프로그램 자체에 대한 설명입니다.

API 설명 및 사용법이 궁금하신 분들은 전 편(https://senticoding.tistory.com/44)을 봐주세요.



● Code 안내


모든 코드는 Github repository에 올려놓았습니다.

umi0410/busApiTutorial 참고

주석을 잘 달아놓았으니 따로 설명은 안할게요.

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("=====================")
            })
    })
})