-
SNCF Transillien 프랑스 원하는 기차/버스 시간표 웹사이트 만들기컴퓨터/파이썬 2024. 1. 24. 06:16728x90반응형
소개
프랑스 파리 중심이 아닌 외곽에서 1달을 살게 되면서, 매일 파리 가는 기차를 확인했다.
(https://www.transilien.com/ 과 J 라인 전용 공지 (https://malignej.transilien.com/)
A에서 파리, 파리에서 A 역으로 가는 모든 시간대를 실시간 업데이트로 바로 보고 싶어서 (오늘과 내일)
SNCF API를 이용할 것이다.
(Société Nationale des Chemins de fer Français로 프랑스 국영 철도 회사)
벨기에는 국영 transporation 회사가 3개다사용
https://numerique.sncf.com/startup/api/
위 사이트에서 API를 키를 얻는다. (사용량 제한이 있는지는 잘 모르겠다)
이 글에서는 Ligne J의 기차를 특정 지어서 시간표를 뽑을 것이다.
API 링크를 만들기 꽤 복잡한데 문서를 하나하나 읽어가며 api playground에서 계속 테스트하고 만들어야 한다.
https://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'컴퓨터 > 파이썬' 카테고리의 다른 글
네이버 이메일 회원가입 인증 시 존재 유무 확인하기 (0) 2024.04.18 Python: VBA로 엑셀 차트 이미지 이메일에 첨부하여 보내기 (0) 2023.07.25 Python: Global Interpreter Lock (GIL) (0) 2023.01.05