25 lines
1.3 KiB
JavaScript
25 lines
1.3 KiB
JavaScript
const key = process.env.RIDEBUS_API_KEY;
|
|
if (!key) { console.log('RideBus API key is not configured.'); process.exit(1); }
|
|
const base = (process.env.RIDEBUS_API_BASE_URL || 'https://api.ridebus.by/').replace(/\/+$/, '') + '/';
|
|
const cityId = process.env.BOARD_CITY_ID || '1';
|
|
async function get(path) {
|
|
const response = await fetch(new URL(path, base), {
|
|
headers: { 'X-API-Key': key, 'X-City-Id': cityId, Accept: 'application/json' },
|
|
signal: AbortSignal.timeout(12000), redirect: 'error',
|
|
});
|
|
if (!response.ok) throw new Error(`API returned HTTP ${response.status}`);
|
|
return response.json();
|
|
}
|
|
try {
|
|
const stops = await get('api/v1/stops');
|
|
const matches = stops.filter(stop => /швейн/i.test(stop.name));
|
|
console.log(JSON.stringify(matches.map(({ id, name, description, routes_count }) => ({ id, name, description, routes_count })), null, 2));
|
|
for (const stop of matches) {
|
|
const [details, eta] = await Promise.all([get(`api/v1/stops/${stop.id}`), get(`api/v1/eta/stop/${stop.id}`)]);
|
|
console.log(JSON.stringify({ stopId: stop.id, routes: details.routes.map(({ id, route_number, name }) => ({ id, route_number, name })), upcomingCount: eta.routes.reduce((count, route) => count + (route.arrivals?.length || 0), 0) }, null, 2));
|
|
}
|
|
} catch (error) {
|
|
console.error(error.cause?.code || error.message);
|
|
process.exitCode = 1;
|
|
}
|