ABOUT ME

-

Total
-
  • SNCF Transillien 프랑스 원하는 기차/버스 시간표 웹사이트 만들기
    컴퓨터/파이썬 2024. 1. 24. 06:16
    728x90
    반응형

    소개

    프랑스 파리 중심이 아닌 외곽에서 1달을 살게 되면서, 매일 파리 가는 기차를 확인했다.

    (https://www.transilien.com/ 과 J 라인 전용 공지 (https://malignej.transilien.com/)

    transillien.com 예제

    A에서 파리, 파리에서 A 역으로 가는 모든 시간대를 실시간 업데이트로 바로 보고 싶어서 (오늘과 내일)

    SNCF API를 이용할 것이다.

    (Société Nationale des Chemins de fer Français로 프랑스 국영 철도 회사) 벨기에는 국영 transporation 회사가 3개다

     

    사용

    https://numerique.sncf.com/startup/api/

     

    API - SNCF NUMÉRIQUE

    Obtenez un accès à l'API

    numerique.sncf.com

     

    위 사이트에서 API를 키를 얻는다. (사용량 제한이 있는지는 잘 모르겠다)

    이 글에서는 Ligne J의 기차를 특정 지어서 시간표를 뽑을 것이다.

     

    만든 것

     

    API 링크를 만들기 꽤 복잡한데 문서를 하나하나 읽어가며 api playground에서 계속 테스트하고 만들어야 한다.

     

    navitia playground

    Send the request Submit or Ctrl+Enter

    playground.navitia.io

    https://doc.navitia.io/ (공식 문서)

     

    Navitia.io documentation

     

    doc.navitia.io

     

    코드

     

    from_station과 to_station은 아래와 같은 형식으로 api 문서를 살피다 보면 SNCF 가 커버하는 stop들의 id를 얻을 수 있다.

    (https://api.sncf.com/v1/coverage/sncf 참고)

     

    오늘과 내일의 스케줄을 각각 나눠서 받기 위해서 datetime 파라미터를 보면 0시 0분 0초로 설정 + max_duration을 하루로 잡는다.

    1. `to`: 여행의 목적지를 지정합니다. 이는 일반적으로 역의 고유 식별자나 이름입니다.
    2. `from`: 여행의 출발지를 지정합니다. 이 역시 역의 고유 식별자나 이름으로 표시됩니다.
    3. `datetime_represents`: 검색할 날짜가 출발 시간을 나타내는지 도착 시간을 나타내는지를 지정합니다. 여기서는 'departure'로 설정되어 있어 출발 시간을 기준으로 합니다.
    4. `allowed_id[]`: 특정 노선이나 역을 필터링하기 위해 사용됩니다. 여기서는 'SNCF:J'라는 특정 노선에 대한 정보만 요청하고 있습니다.
    5. `max_duration`: 여행의 최대 지속 시간을 초단위로 설정합니다. 여기서는 86400초(24시간)로 설정되어 있습니다.
    6. `data_freshness`: 데이터의 실시간성을 지정합니다. 'realtime'은 실시간 정보를 요청합니다.
    7. `max_nb_transfers`: 허용되는 최대 환승 횟수를 지정합니다. 여기서는 0으로 설정되어 환승 없는 여행만 검색합니다.
    8. `datetime`: 특정 날짜와 시간에 대한 검색을 지정합니다. 이 예에서는 입력된 `date`에 'T000000'을 추가하여 자정 시간을 나타냅니다.
    9. `count`: 반환할 결과의 최대 개수를 지정합니다. 여기서는 100으로 설정되어 있습니다.
    10. `timeframe_duration`: 검색 시간 프레임의 지속 시간을 초단위로 설정합니다. 여기서는 86400초(24시간)로 설정되어 있습니다.
    def fetch_and_format_schedule(from_station, to_station, date):
        # API request URL
        url = (
            f"https://api.navitia.io/v1/coverage/sncf/journeys"
            f"?to={to_station}"
            f"&from={from_station}"
            f"&datetime_represents=departure"
            f"&allowed_id%5B%5D=line%3ASNCF%3AJ"
            f"&max_duration=86400"
            f"&data_freshness=realtime"
            f"&max_nb_transfers=0"
            f"&datetime={date}T000000"
            f"&count=100"
            f"&timeframe_duration=86400"
        )
    
        # Make the request
        response = requests.get(url, headers={"Authorization": f"{SNCF_API}"})
    
        # Check if the response is successful
        if response.status_code == 200:
            data = response.json()
            return format_journey_data(data, date)
        else:
            return {
                "error": f"Failed to retrieve data: {response.status_code} - {response.text}",
                "date": date,
            }

     

    이렇게 하면 FastAPI 서버를 만들어서 아래처럼 json을 return 할 수 있다.

    @app.get("/train-schedule/vernon-to-paris")
    def get_train_schedule_vernon_to_paris():
        today = fetch_and_format_schedule(
            VERNON, PARIS, datetime.datetime.now().strftime("%Y%m%d")
        )
        tomorrow = fetch_and_format_schedule(
            VERNON,
            PARIS,
            (datetime.datetime.now() + datetime.timedelta(days=1)).strftime("%Y%m%d"),
        )
        return {"today": today, "tomorrow": tomorrow}

     

    728x90

    댓글