-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathtrafiochrana.py
103 lines (83 loc) · 3.55 KB
/
trafiochrana.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
# -*- coding: utf-8 -*-
# !/usr/bin/python
import json
import urllib
import time
import random
from math import fabs
import sys
reload(sys)
sys.setdefaultencoding("utf-8")
LAST_SEEN_ = u'lastSeen'
LOCATION_ = u'location'
FUEL_ = u'fuel'
LONGITUDE_ = u'longitude'
LATITUDE_ = u'latitude'
REG_NUMBER_ = u'regNumber'
API_URL = 'https://api.traficar.pl/eaw-rest-api/car?shapeId=5'
cars = {}
last_check = time.gmtime()
def get_data(url):
response = urllib.urlopen(url)
response_string = response.read()
data_file = open('./data/' + current_time() + '.json', 'w')
data_file.write(response_string)
data_file.close()
return json.loads(response_string)
def time_string(time_time):
return time.strftime("%Y-%m-%d %H:%M:%S", time_time)
def current_time():
return time_string(time.gmtime())
def log(text):
print('[%s] %s' % (current_time(), text))
def car_changed(old_entry, car):
if fabs(old_entry[LATITUDE_] - car[LATITUDE_]) > 0.001 or fabs(old_entry[LONGITUDE_] - car[LONGITUDE_]) > 0.001 or (
old_entry[FUEL_] != car[FUEL_]):
return True
return False
def car_reappeared(old_entry):
return old_entry[LAST_SEEN_] != time_string(last_check)
def parse_car_data(car_info):
global last_check
check_time = time.gmtime()
returned_cars = car_info[u'cars']
log('Found cars: %d; all cars in system: %d' % (len(returned_cars), len(cars)))
for car in returned_cars:
if car[REG_NUMBER_] in cars:
old_entry = cars[car[REG_NUMBER_]]
if car_changed(old_entry, car):
log(
'Car changed. Plates: %s; old lat: %f; new lat: %f; old lon: %f; new lon: %f; old fuel: %d; new fuel: %d; old location: %s; new location: %s; last_seen: %s' % (
car[REG_NUMBER_], old_entry[LATITUDE_], car[LATITUDE_], old_entry[LONGITUDE_],
car[LONGITUDE_], old_entry[FUEL_], car[FUEL_], old_entry[LOCATION_], car[LOCATION_],
old_entry[LAST_SEEN_]))
cars[car[REG_NUMBER_]][LATITUDE_] = car[LATITUDE_]
cars[car[REG_NUMBER_]][LONGITUDE_] = car[LONGITUDE_]
cars[car[REG_NUMBER_]][LOCATION_] = car[LOCATION_]
cars[car[REG_NUMBER_]][FUEL_] = car[FUEL_]
elif car_reappeared(old_entry):
log('Car reappeared. Plates: %s; lat: %f; lon: %f; fuel: %d; location: %s; last seen: %s' % (
car[REG_NUMBER_], car[LATITUDE_], car[LONGITUDE_], car[FUEL_], car[LOCATION_],
old_entry[LAST_SEEN_]))
cars[car[REG_NUMBER_]][LAST_SEEN_] = time_string(check_time)
else:
log('New car. Plates: %s; lat: %f; lon: %f; fuel: %d; location: %s' % (
car[REG_NUMBER_], car[LATITUDE_], car[LONGITUDE_], car[FUEL_], car[LOCATION_]))
cars[car[REG_NUMBER_]] = {
REG_NUMBER_: car[REG_NUMBER_],
LATITUDE_: car[LATITUDE_],
LONGITUDE_: car[LONGITUDE_],
FUEL_: car[FUEL_],
LOCATION_: car[LOCATION_],
LAST_SEEN_: time_string(check_time)
}
for key, car in cars.iteritems():
if car[LAST_SEEN_] == time_string(last_check):
log('Car disappeared. Plates: %s; lat: %f; lon: %f; fuel: %d; location: %s' % (
car[REG_NUMBER_], car[LATITUDE_], car[LONGITUDE_], car[FUEL_], car[LOCATION_]))
last_check = check_time
sys.stdout.flush()
while True:
car_info = get_data(API_URL)
parse_car_data(car_info)
time.sleep(random.randint(120, 180))