wrongmove/crawler/rec/routing.py

64 lines
1.6 KiB
Python
Raw Normal View History

import enum
import os
from typing import Any
import requests
from rec.utils import nextMonday
from rec.exceptions import RoutingApiError
ROUTES_API_URL = "https://routes.googleapis.com/directions/v2:computeRoutes"
API_KEY_ENVIRONMENT_VARIABLE = "ROUTING_API_KEY"
ROUTES_FIELD_MASK = (
"routes.distanceMeters,"
"routes.duration,"
"routes.staticDuration,"
"routes.legs.steps.distanceMeters,"
"routes.legs.steps.staticDuration,"
"routes.legs.steps.travelMode"
)
class TravelMode(enum.StrEnum):
TRANSIT = "TRANSIT"
BICYCLE = "BICYCLE"
WALK = "WALK"
DRIVE = "DRIVE"
2024-03-25 20:48:48 +00:00
def transit_route(
origin_lat: float,
origin_lon: float,
dest_address: str,
travel_mode: TravelMode,
compute_alternative_routes: bool = True,
) -> dict[str, Any]:
2024-03-25 20:48:48 +00:00
monday9am = nextMonday()
# must be set
api_key = os.environ[API_KEY_ENVIRONMENT_VARIABLE]
2024-03-25 20:48:48 +00:00
header = {
"X-Goog-Api-Key": api_key,
"Content-Type": "application/json",
"X-Goog-FieldMask": ROUTES_FIELD_MASK,
2024-03-25 20:48:48 +00:00
}
body = {
"origin": {
2025-05-31 23:50:43 +00:00
"location": {"latLng": {"latitude": origin_lat, "longitude": origin_lon}}
},
"destination": {
"address": dest_address
},
"travelMode": travel_mode.value,
2024-03-25 20:48:48 +00:00
"departureTime": monday9am.strftime("%Y-%m-%dT%H:%M:%S.%fZ"),
"computeAlternativeRoutes": compute_alternative_routes,
"languageCode": "en-US",
"units": "METRIC",
}
r = requests.post(ROUTES_API_URL, json=body, headers=header)
2024-03-25 20:48:48 +00:00
if r.status_code == 200:
return r.json()
raise RoutingApiError(r.status_code, r.json())