공공데이터(openapi) 사용법 (특정 정류소, 버스의 남은 좌석 확인 하기)


회사가 출퇴근 자율제에 주 40시간 근무 규정이 생긴지 몇달이 되어간다.

출근할 때 버스의 남은 좌석을 안다면 편한 나의 출근 시간을 정할 수 있을텐데..

우선 남은 버스 좌석 데이터를 모으면 어떻게(통계, Regression, 딥러닝 등) 해서라도 위 궁금증을 해결할 수 있으리라 생각한다.

그래서 아래와 같이 데이터 취합을 시도했다

1. 공공데이터 사이트에 가입하기
 - https://www.data.go.kr/
  - 파일데이터/OpenAPI/표준데이터 제공

2. 로그인 => 데이터셋 => Open API 선택 => 기관별 선택
 => "버스도착정보 조회" 검색 후 개발 계정 신청 (IE 9 이상에서만 신청 가능)
 - 정류소와 노선번호를 기준으로 첫번째, 두번째 도착 예정 버스의 위치정보와 도착 예정시간, 빈자리 지상버스 정보를 REST SOAP 방식의 API로 제공
 - 일반/서버 유형 선택 가능
 - 일일 트래픽 1000 제한 (?) (why? 개발 계정이기 때문에)
   - 운영(서비스)계정 활용 신청 시 필요한 트래픽을 요청할 수 있음

3. 마이페이지 => OpenAPI => 개발계정 => 인증키 신청 후 => 인증키 발급 현황에서 확인 가능
 - 나의 인증키 : OSE.....%3D

4. 경기버스정보에서 Rest API를 통해서 데이터 수집 가능
- 버스도착정보항목조회
- https://www.gbis.go.kr/gbis2014/publicService.action?cmd=tBusArrivalItem
- 노선 ID와 정류소 ID는 어떻게 아는 거지?
  - 기반정보조회 테스트에서 다운로드 링크 확인 후 txt 파일 다운로드해서 확인 가능
    - routeId=204000057
    - stationId=209000160

5. 아래 URL로 데이터 확인 가능
 - URL: http://openapi.gbis.go.kr/ws/rest/busarrivalservice?serviceKey=test&routeId=204000057&stationId=209000160


6. http 툴 설치해서 CLI로 테스트 수행 => 정상동작
 - $ sudo apt-get install httpie
 - $ http "http://openapi.gbis.go.kr/ws/rest/busarrivalservice?serviceKey=OSE...3D&routeId=204000057&stationId=209000160"


7. 아래와 같이 동작을 잘 하는군

<?xml version="1.0" ?>
<response>
    <comMsgHeader>
        <errMsg>NORMAL SERVICE.</errMsg>
        <returnCode>00</returnCode>
    </comMsgHeader>
    <msgHeader>
        <queryTime>2017-01-11 14:06:15.245</queryTime>
        <resultCode>0</resultCode>
        <resultMessage>정상적으로 처리되었습니다.</resultMessage>
    </msgHeader>
    <msgBody>
        <busArrivalItem>
            <delayYn1>N</delayYn1>
            <delayYn2>N</delayYn2>
            <drvEnd>N</drvEnd>
            <flag>PASS</flag>
            <locationNo1>5</locationNo1>
            <locationNo2>10</locationNo2>
            <lowPlate1>0</lowPlate1>
            <lowPlate2>0</lowPlate2>
            <plateNo1>경기70아7449</plateNo1>
            <plateNo2>경기70아6295</plateNo2>
            <predictTime1>10</predictTime1>
            <predictTime2>18</predictTime2>
            <remainSeatCnt1>21</remainSeatCnt1>
            <remainSeatCnt2>40</remainSeatCnt2>
            <routeId>204000057</routeId>
            <staOrder>29</staOrder>
            <stationId>209000160</stationId>
        </busArrivalItem>
    </msgBody>
</response>

댓글

  1. 안녕하세요? 저도 최근에 같은 생각으로 데이터를 모으기 시작했는데, 반갑습니다. :)
    진행은 잘 되셨는지요?

    답글삭제

댓글 쓰기

이 블로그의 인기 게시물

SSH 연결 Delay 해결

[ELK] search guard를 이용한 보안 설정 (사용자 권한)