Added Project

This commit is contained in:
nedko 2024-04-15 13:25:46 +03:00
commit 97256477e3
2 changed files with 129 additions and 0 deletions

3
go.mod Normal file
View File

@ -0,0 +1,3 @@
module git.internedko.net/nedko/sofiatraffic_cache
go 1.22.1

126
main.go Normal file
View File

@ -0,0 +1,126 @@
package main
import (
"encoding/json"
"errors"
"fmt"
"io"
"log"
"net/http"
"os"
"strconv"
"time"
)
type Favourite struct {
Name string `json:"name"`
Code string `json:"code"`
ID string `json:"id"`
}
type CarFlags struct {
Disabled bool `json:"disabled"`
AirConditioner bool `json:"klimatik"`
BicycleRack bool `json:"bicycle_rack"`
DoubleDecker bool `json:"doubledecker"`
ByTimeTable bool `json:"by_timetable"`
}
type Car struct {
DepartureTime string `json:"departure_time"`
Flags CarFlags `json:"flags"`
Destination int `json:"destination"`
CourseID int `json:"course_id"`
DestinationName string `json:"destination_name"`
CalculatedTime string `json:"calc_time"`
DirectionFlag int `json:"direction_flag"`
TTCourseStopID int `json:"ttcoursestop_id"`
}
type Line struct {
Transport string `json:"transport"`
ID int `json:"id"`
Name string `json:"name"`
Cars []Car `json:"cars"`
Color string
}
type VirtualPanelData struct {
ID int `json:"id"`
Lines []Line `json:"lines"`
}
type SofiaTraffic struct {
Data VirtualPanelData `json:"virtual_panel_data"`
}
type CacheData struct {
TargetID int `json:"target_id"`
DataID int `json:"data_id"`
}
func getSofiaTrafficData(id string) (SofiaTraffic, error) {
var data SofiaTraffic
url := fmt.Sprintf("https://www.sofiatraffic.bg/interactivecard/virtual_panel?stop_id=%s", id)
respAPI, err := http.Get(url)
if err != nil {
log.Println(err)
return data, errors.New("get failed")
}
if respAPI.StatusCode != 200 {
log.Printf("Status code for ID %v is %v", id, respAPI.StatusCode)
return data, errors.New("bad status code")
}
if respAPI.Body != nil {
defer respAPI.Body.Close()
}
body, err := io.ReadAll(respAPI.Body)
if err != nil {
log.Println(err)
return data, errors.New("failed to read body")
}
err = json.Unmarshal(body, &data)
if err != nil {
log.Println(err)
return data, errors.New("failed to unmarshal json")
}
return data, nil
}
func main() {
var cache []CacheData
for i := 1; i < 2750; i++ {
time.Sleep(time.Second)
if i % 10 == 0 {
fmt.Printf("Getting ID %d\n", i)
}
data, err := getSofiaTrafficData(strconv.Itoa(i))
if err != nil {
log.Printf("ID - %d - \"%v\"\n", i, err)
continue
}
var temp CacheData
temp.TargetID = data.Data.ID
temp.DataID = i
if temp.DataID != 0 {
cache = append(cache, temp)
}
}
data, err := json.MarshalIndent(cache, "", " ")
if err != nil {
log.Println(err)
return
}
err = os.WriteFile("cache.json", data, 0644)
if err != nil {
log.Println(err)
}
}