#!/bin/bash # Konfiguracja url="https://gtfsrt.transportgzm.pl:5443/gtfsrt/gzm/vehiclePositions" proto_file="/home/debian/tgzm.live/gtfs-realtime.proto" download_dir="/tmp" output_dir="/home/debian/tgzm.live/vehiclePositions" # Utwórz katalog na dane pojazdów, jeśli nie istnieje mkdir -p "$output_dir" # Pobierz plik binarny z danymi GTFS-RT bin_file="$download_dir/vehiclePositions.bin" wget --no-check-certificate -q -O "$bin_file" "$url" # Dekoduj protobuf -> tekst decoded=$(protoc --decode=transit_realtime.FeedMessage "$proto_file" < "$bin_file") # Parsowanie danych z dekodowanego tekstu # Zmiennych pomocnicze vehicle_id="" trip_id="" lat="" lon="" ts="" # Funkcja zapisująca dane pojazdu save_vehicle_data() { # Wyciągnięcie czystego ID pojazdu (np. 28300330) clean_id=$(echo "$vehicle_id" | grep -oP '\d{5,}') [ -z "$clean_id" ] && return file="$output_dir/${clean_id}.txt" # Linia do zapisu line="${trip_id}|${lat}|${lon}|${ts}" # Jeśli brak danych – pomiń if [ -z "$trip_id" ] || [ -z "$lat" ] || [ -z "$lon" ] || [ -z "$ts" ]; then return fi # Jeśli plik istnieje i pierwsza linia ma taki sam timestamp – pomiń if [ -f "$file" ]; then first_ts=$(head -n 1 "$file" | awk -F'|' '{print $4}') if [ "$first_ts" = "$ts" ]; then return fi fi # Ogranicz do 719 starych linii (bo dodamy nową) if [ -f "$file" ]; then # Usuń najstarszą linię, jeśli plik ma 720 linii lines=$(wc -l < "$file") if [ "$lines" -ge 720 ]; then head -n 719 "$file" > "$file.tmp" && mv "$file.tmp" "$file" fi # Dodaj nową linię na początku { echo "$line"; cat "$file"; } > "$file.tmp" && mv "$file.tmp" "$file" else echo "$line" > "$file" fi } # Przechodzimy przez linie dekodowanego pliku while IFS= read -r line; do case "$line" in "entity {"*) # Nowy pojazd – zresetuj zmienne vehicle_id="" trip_id="" lat="" lon="" ts="" ;; "id: "*) if [ -z "$vehicle_id" ]; then vehicle_id=$(echo "$line" | sed 's/id: "\(.*\)"/\1/') fi ;; "trip_id: "*) trip_id=$(echo "$line" | sed 's/trip_id: "\(.*\)"/\1/') ;; "latitude: "*) lat=$(echo "$line" | awk '{print $2}') ;; "longitude: "*) lon=$(echo "$line" | awk '{print $2}') ;; "timestamp: "*) ts=$(echo "$line" | awk '{print $2}') ;; "}"*) # Koniec bloku pojazdu if [ -n "$vehicle_id" ] && [ -n "$trip_id" ] && [ -n "$lat" ] && [ -n "$lon" ] && [ -n "$ts" ]; then save_vehicle_data fi ;; esac done <<< "$decoded"