-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathParser.php
87 lines (66 loc) · 2.53 KB
/
Parser.php
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
<?php
const SERVER_IP = '212.18.193.124';
/**
* Liefert ein Array mit den nächsten Bussen.
*
* @param String $sStreet
* @return Array
*/
function getData($sStreet) {
$sUrl = 'http://' . SERVER_IP . '/onlineinfo/onlineinfo/stopData';
$aContext = stream_context_create(
array(
'http' => array(
'method' => 'POST',
'header' => "Content-Type: text/x-gwt-rpc; charset=UTF-8\r\nX-GWT-Permutation: 45BD068FAC09AE03D1AD107BB98F4B13",
'content' => "7|0|6|http://" . SERVER_IP . "/onlineinfo/onlineinfo/|887B910CE21D9A30864A7AC4A6DF1AF7|com.initka.onlineinfo.client.services.StopDataService|getDepartureInformationForStop|java.lang.String/2004016611|" . $sStreet . "|1|2|3|4|1|5|6|"
)
));
$sResult = file_get_contents($sUrl, false, $aContext);
// Es fahren zur Zeit keine Busse?
if (strlen($sResult) < 100) {
return;
}
// "OK//" am Anfang abschneiden.
$sResult = substr($sResult, 4);
// [0,1, vorne abschneiden
$sResult = substr($sResult, 5);
// ,0,7] hinten abschneiden
$sResult = substr($sResult, 0, -5);
// Zahlen von Info-Block trennen.
$sResult = explode("[", $sResult);
// Zahlen-Block zerschneiden anhand der immer gleichen ersten drei Zahlen.
$aData = explode("3,2,0,1", $sResult[0]);
// Leere Array-Elemente entfernen.
$aData = array_diff($aData, array(''));
foreach ($aData as &$sTmp) {
$sTmp = array_values(array_diff(explode(",", $sTmp), array('')));
}
$aInfo = explode('","', substr($sResult[1], 0, -1));
$aResult = array();
foreach ($aData as $mKey => $aBus) {
$aResult[$mKey]["dateReally"] = decodeTime(str_replace("'", "", $aBus[4]));
$aResult[$mKey]["datePlanned"] = decodeTime(str_replace("'", "", $aBus[0]));
/*
* TODO: Vorhandene Gaensefuesschen werden hier entfernt.
* Das sollte schon vorher durch ordentliches Parsen verhindert werden.
*/
$aResult[$mKey]["target"] = str_replace('"', "", $aInfo[$aBus[3] - 1]);
$aResult[$mKey]["line"] = str_replace('"', "", $aInfo[$aBus[2] - 1]);
}
// Das mehrdimensionale Array nach Datum sortieren.
usort($aResult, "cmp");
return $aResult;
}
// https://bitbucket.org/webhamster/swt-trier-echtzeitauskunft/src/4cb1115a519158561613f81c151dbc9a04d7d24e/swtdecode.py?at=master
function decodeTime($sTime) {
$sBase = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789_$";
$iSum = 0;
for ($i = 0; $i < strlen($sTime); $i++) {
$iSum += strpos($sBase, $sTime{$i}) * pow(strlen($sBase), strlen($sTime) - $i - 1);
}
return $iSum / 1000;
}
function cmp($a, $b) {
return strcmp($a["dateReally"], $b["dateReally"]);
}