-
Notifications
You must be signed in to change notification settings - Fork 3
/
reisplan.py
161 lines (129 loc) · 6.23 KB
/
reisplan.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
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
# Settings
pb_send = 1
# Importeer afhankelijkheden
import sys # Nodig voor input arguments
import requests # Nodig voor request aan API server
import datetime # Nodig voor tijd vergelijken
from xml.etree import ElementTree # Nodig om data van server mee te verwerken
# Importeer credentials van credentials.py
from credentials import *
via = False
# Controleer input
if len(sys.argv) == 3:
fromStation = sys.argv[1]
toStation = sys.argv[2]
elif len(sys.argv) == 4:
fromStation = sys.argv[1]
toStation = sys.argv[2]
viaStation = sys.argv[3]
via = True
else:
print('Gebruik: "reisplan.py Amsterdam Zwolle" of "reisplan.py Amsterdam Zwolle Groningen" voor een via')
sys.exit()
# Controleer of berichten worden verzonden
if pb_send == 0:
print 'Geen notificaties via pushbullet'
# Extraheer input data and initialise
ongeregeldheden = 0
pushTitle = 'Verstoring: ' + fromStation + ' ' + toStation
pushMsg = ''
url = 'http://webservices.ns.nl/ns-api-treinplanner?fromStation='+fromStation+'&toStation='+toStation
tijdNu = datetime.datetime.now()
# Voeg info toe van de via
if via:
pushTitle = pushTitle + ' via ' + viaStation
url = url + '&viaStation=' + viaStation
# Read token for pushbullet
if pb_send == 1:
global TOKEN
with open('pb_token.txt', 'r') as file:
TOKEN = file.read().replace('\n','')
def note(ttl,msg):
url = "https://api.pushbullet.com/v2/pushes"
data = dict(type="note", title=ttl, body=msg)
nreq = requests.post(url, json=data, auth=(TOKEN, '')).json()
data = requests.get(url, auth=(username, password))
tree = ElementTree.fromstring(data.content)
for itt in range(0,(len(tree))):
# basis attibuten van een reisadvies oppakken
Status = tree[itt].find('Status').text
melding = tree[itt].find('Melding')
vertrekTijdString = tree[itt].find('GeplandeVertrekTijd').text[0:19]
aankomstTijdString = tree[itt].find('GeplandeAankomstTijd').text[0:19]
vertrekTijdTijd = datetime.datetime.strptime(vertrekTijdString, "%Y-%m-%dT%H:%M:%S")
aankomstTijdTijd = datetime.datetime.strptime(aankomstTijdString, "%Y-%m-%dT%H:%M:%S")
vertrekTijd = vertrekTijdString[11:16]
aankomstTijd = aankomstTijdString[11:16]
if vertrekTijdTijd < tijdNu:
# Rit is al vertrokken geen last meer van die ongeregeldheden
continue
meldplicht = False
stoMsg = ''
if Status != 'VOLGENS-PLAN':
# Er is iets mis uitvinden wat
if Status == 'VERTRAAGD':
# Mogelijke problemen, uitzoeken hoe groot/relevant
AankomstVertraging = tree[itt].find('AankomstVertraging')
VertrekVertraging = tree[itt].find('VertrekVertraging')
if (AankomstVertraging is None) and (VertrekVertraging is None):
# Gedurende de treinreis rijd de trein met vertraging maar haalt dit in
continue
else:
stoMsg = stoMsg + Status + '\n'
# Er is vertraging en we gaan er last van hebben
if VertrekVertraging is not None:
if len(VertrekVertraging.text) > 6 or int(VertrekVertraging.text[1]) > 5:
# de vertrekvertraging is groot genoeg om te melden
meldplicht = True
stoMsg = stoMsg + 'Vertrek: ' + vertrekTijd + ' ' + VertrekVertraging.text + '\n'
else:
stoMsg = stoMsg + 'Vertrek: ' + vertrekTijd + ' (op tijd)\n'
if AankomstVertraging is not None:
if len(AankomstVertraging.text) > 6 or int(AankomstVertraging.text[1]) > 5:
# de aankomstvertraging is groot genoeg om te melden
meldplicht = True
stoMsg = stoMsg + 'Aankomst: ' + aankomstTijd + ' ' + AankomstVertraging.text + '\n'
else:
stoMsg = stoMsg + 'Aankomst: ' + aankomstTijd + ' (op tijd)\n'
elif Status == 'NIET-MOGELIJK':
# Reisadvies is vervallen of niet haalbaar
meldplicht = True
stoMsg = 'NIET MOGELIJK\n'
stoMsg = stoMsg + 'Vertrek: ' + vertrekTijd + ' vervalt\n'
stoMsg = stoMsg + 'Aankomst: ' + aankomstTijd + ' vervalt\n'
elif Status == 'NIET-OPTIMAAL':
# Dit is vaak niet relevant dus extra check of een bericht nodig is
stoMsg = 'NIET-OPTIMAAL \n'
actVertrektijdString = tree[itt].find('ActueleVertrekTijd').text[0:19]
actAankomsttijdString = tree[itt].find('ActueleAankomstTijd').text[0:19]
actVertrekTijdTijd = datetime.datetime.strptime(actVertrektijdString, "%Y-%m-%dT%H:%M:%S")
actAankomstTijdTijd = datetime.datetime.strptime(actAankomsttijdString, "%Y-%m-%dT%H:%M:%S")
deltaVertrekTijd = actVertrekTijdTijd - vertrekTijdTijd
deltaAankomstTijd = actAankomstTijdTijd - aankomstTijdTijd
# Controleren of de trein later dan gepland vertrekt
if deltaVertrekTijd.seconds/60 > 5:
meldplicht = True
stoMsg = stoMsg + 'Vertrek: ' + vertrekTijd + ' + ' + deltaVertrekTijd/60 + ' min\n'
else:
stoMsg = stoMsg + 'Vertrek: ' + vertrekTijd + ' (op tijd)\n'
if deltaAankomstTijd.seconds/60 > 5:
meldplicht = True
stoMsg = stoMsg + 'Aankomst: ' + vertrekTijd + ' +' + deltaAankomstTijd/60 + ' min\n'
else:
stoMsg = stoMsg + 'Aankomst: ' + aankomstTijd + ' (op tijd)\n'
else:
# Andere gevallen, impact moeilijk te bepalen
meldplicht = True
stoMsg = stoMsg + Status + '\n'
stoMsg = stoMsg + 'Vertrek: ' + vertrekTijd + '\n'
stoMsg = stoMsg + 'Aankomst: ' + aankomstTijd + '\n'
elif (melding is not None):
# In het geval van geplande werkzaamheden geeeft de API aan dat alles gaat als gepland, maar met een melding
meldplicht = True
meldingBericht = melding.find('Text').text
stoMsg = 'Geplande aanpassing\n' + vertrekTijd + ' - ' + aankomstTijd + '\n' + meldingBericht + '\n'
if meldplicht:
ongeregeldheden += 1
pushMsg = pushMsg + stoMsg + '\n'
if ongeregeldheden > 0 and pb_send == 1:
note(pushTitle, pushMsg)