WWW Reader auf ständig wechselnde Links ansetzen ???

Hallo,

habe mir ein Script geschrieben das mittels Text Parser und WWW Reader den Stundenplan unser Schule auslesen kann und mir bei Veränderungen eine Pushmeldung schickt. Das funktioniert soweit auch sehr gut.

Nur habe ich ein Problem:

Für jede Kalenderwoche ist ein Stundenplan auf dem Schulserver hinterlegt und jede diese KW hat einen eigenen Link

Wie zum Beispiel:

…/all/Stundenplaene/23/c/c00006.htm

Die 23 steht hier für die aktuelle KW (der Rest bleibt gleich). Um nun den richtigen Plan auslesen zu können muss ich ja nun jede Woche den WWW Reader auf einen anderen Link ansetzen, kann mir einer sagen wie und ob das geht?

Kann man dem WWW Reader den Link mittels einer Variablen zukommen lassen?

Skript + Timer + dies: http://www.ip-symcon.de/forum/49940-post4.html :smiley:

paresy

Hallo Franky76,

ich habe etwas sehr ähnliches am Laufen (vielleicht ist es sogar das gleiche Stundenplansystem? Wie heißt das System?).
Wie auch immer: Ich werde Dir nachher mal mein Skript posten.

Joachim

@ Paresy

super, das hat mich schon mal nen ordentlichen Schritt nach vorne gebracht. Aber schon wirft das neue Problem auf.

Wir bekommen immer die aktuelle KW als Stundenplan und so zwischen Do und Fr die für die neue KW.

Also einfach nen 2. WWW Reader und KW+1 - nur gibt es den Link nicht bevor der Stundenplan online ist und ich bekomm ne Fehlermeldung im WWW Reader, dass die URL nicht erreichbar ist… Kann man das Abfangen?

Würde das auch gerne nutzen um ne Meldung zu generieren das der neue Stundenplan verfügbar ist?

@ JPaeper

Die Stundenplansoftware ist von GP-Untis 2007, bin gespannt auf deine Lösung

Hallo Franky76,

um ein GP-Untis-System (2011?) handelt es sich auch bei meinem Sohn. Ich poste nachher mal was ich da „gebastelt“ habe.

Joachim

Hallo Franky76,

hier nun der „Basiscode“:

<?

// In dieser Variablen steht "zentral" der aktuelle Wochentag als Zahl
$AktuellerWochentag = GetValueInteger(37151 /*[Sonstige Daten\Variablen\Sonstige Variablen\Aktueller Wochentag (Nr)]*/ );
// In dieser Variablen steht "zentral" die aktuelle Kalenderwoche als Zahl
$AktuelleKalenderwoche = GetValueInteger(36714 /*[Sonstige Daten\Variablen\Sonstige Variablen\Kalenderwoche des Jahres]*/ );

// Wenn eine Onlineverbindung besteht...
If (GetValueBoolean(18029 /*[Fritz!Box\DSL\Status]*/) == True)
	{
	// Wenn Montag bis Freitag ist, dann zeige die aktuelle Kalenderwoche...
	If (($AktuellerWochentag >= 1) and ($AktuellerWochentag <= 5))
		{
		$ModKalenderwoche = $AktuelleKalenderwoche;
		}
	//...ansonsten den der nächsten Kalenderwoche
	else
		{
		$ModKalenderwoche = $AktuelleKalenderwoche + 1;
		}
	//Echo $AktuellerWochentag." ".$AktuelleKalenderwoche." ".$ModKalenderwoche;

	// Wenn die Kalenderwoche kleiner als 10 ist, muss vor die Zahl noch eine führende Null gestellt werden
	If ($ModKalenderwoche < 10)
		{
		$ModKalenderwoche = "0".$ModKalenderwoche;
		}
	//echo $ModKalenderwoche;

	$Antwort = file_get_contents("http://Benutzername:Passwort@...Link.../stundenplan/plan/$ModKalenderwoche/c/c00001.htm");


	If ($Antwort == False)
	{
		SetvalueString(34075 /*[BRGS\Stundenplan]*/ , "Es ist ein Fehler aufgetreten!");
	}
	else
	{
		// Korrektur einiger Werte...
		$StundenplanArray = get_mark($Antwort, "</head>*</TR></TABLE><TABLE");
		$Stundenplan = $StundenplanArray[0];
		$Stundenplan = str_Replace('color="#000000"', '', $Stundenplan);
		$Stundenplan = str_Replace('color="#FF0080"', '', $Stundenplan);
		$Stundenplan = str_Replace('bgcolor="#FFFFFF"', '', $Stundenplan);
		$Stundenplan = str_Replace('border="3"', 'border="1"', $Stundenplan);
		$Stundenplan = str_Replace('Arial', GetValueString(32181 /*[Server\Einstellungen\Webfront Einstellungen\Schriftart]*/ ), $Stundenplan);

		// setzen der Variablen
		SetvalueString(34075 /*[BRGS\Stundenplan]*/ , $Stundenplan);
   	$Datum = GetValueString(23632 /*[Sonstige Daten\Variablen\Sonstige Variablen\Aktuelles Datum]*/ );
		$Uhrzeit = GetValueString(37001 /*[Sonstige Daten\Variablen\Sonstige Variablen\Aktuelle Uhrzeit]*/ );
		SetValueString(33832 /*[BRGS\Letzte Aktualisierung]*/ , $Datum." ".$Uhrzeit);

		$Kalenderwochenbeginn = date("d.m.Y", getKW($ModKalenderwoche, date("Y")));
		$Kalenderwochenende = date("d.m.Y",(strtotime("+6 day", strtotime($Kalenderwochenbeginn))));
		SetValueString(23148 /*[BRGS\Kalenderwoche]*/ , $Kalenderwochenbeginn." - ".$Kalenderwochenende);

		echo $Stundenplan;
		}
	}
return;

// Diese Funktion trennt die relevanten Bereiche aus dem Ausschnitt heraus $string ist dabei der zu durchsuchende Gesamtstring,
// in $Mark sind durch "*" getrennt der Beginn des zu suchenden Strings und das Ende des zu suchende Abschnittes. Beispiel für den Text "<div>*</div></li>"
function get_mark($string,$mark)
{
    $ausgabe = array();
    $template = explode("*",$mark);
    $mark = $template[0];
    $end = $template[1];
    $string = strstr($string,$mark);

    $temp = explode($mark,$string);
    $a = 1;
        foreach ($temp as $tempx)
                    {
                    $tempx = explode($end,$tempx);
                    $tempx = $tempx[0];
                    if ($tempx)
                            {
                            array_push ($ausgabe,$tempx);
                            }
                    }
    return $ausgabe;
}

// Diese Function ermittelt den ersten Montag des Jahres für den Beginn der ersten Kalenderwoche (kann auch im Vorjahr liegen!)
function firstMonday($year = null)
{
	if(is_null($year)) $year = date("Y");
	$date = mktime(0,0,0,1,4,$year);
	return mktime(0,0,0,1, date("d", $date) + (date("w", $date) == 0 ? -6 : (1 - date("w", $date))), $year);
}

// Diese Funktion ermittelt den Montag einer bestimmten Kalenderwoche und -jahr
function getKW($kw, $year = null)
{
	if(is_null($year)) $year = date("Y");
	return firstMonday($year) + 604800 * ($kw - 1);
}



?>

Hier noch mal die Berechnung der aktuellen Kalenderwoche:

// *** Kalenderwoche setzen ***
SetValueInteger(36714 /*[Sonstige Daten\Variablen\Sonstige Variablen\Kalenderwoche des Jahres]*/  , intval(date("W")));

So, ich hoffe Du kannst damit etwas anfangen. Bei Fragen bitte fragen!
Ansonsten interessiert mich selbstverständlich auch falls Du dort noch weitere Features entdeckst.

Joachim

Na da biste ja schon ein ganzes Ende weiter als ich. Lese bis jetzt nur das Änderungsdatum des Stundenplans aus und wenn sich das verändert schicke ich per push ne Nachricht auf iPhone, per E-Mail habe ich das auch schon hinbekommen, da gibt es dann den richtigen Link, weiß aber noch nicht wie ich das an eine Mailingliste verschicke.

Überwachen kann ich die aktuelle und die folgende KW.

Ich habe gesehen du gibst das übers Webfront aus, klasse.

Ich nutze zwar kein Webfront aber es wäre für mich schon schön zu wissen wann die erste Stunde des jeweiligen Tages beginnt.

Wollte damit meinen Sonos System zum Wecker machen, ohne jeden Abend das ganze neu einzustellen. Aber ich habe ja auch erst heute angefangen… :wink:

Und mein PHP ist auch nicht das beste…

hier mal meine Version:

<?
include('ProwlPHP.php');

$KW = date("W");

$LastModifiedRefferenzwert = GetValueString (28613 /*[- Angelegte Datenbank von My Home -\.Main Skripte\Projekt Stundenplan\Aktuelle KW\Last modified - Refferenzwert 1]*/);
$LastModifiedParser = GetValueString (45417 /*[- Angelegte Datenbank von My Home -\.Main Skripte\Projekt Stundenplan\Aktuelle KW\Last modified - Text Parser]*/);

if ($LastModifiedParser == $LastModifiedRefferenzwert)
	{
	return;
	}
else
	{
	
	
	SetValueString(28613 /*[- Angelegte Datenbank von My Home -\.Main Skripte\Projekt Stundenplan\Aktuelle KW\Last modified - Refferenzwert 1]*/, $LastModifiedParser);

	$prowl = new Prowl('******Prowl-Code******');  // hier dein Magic-Key rein
	$prowl->push(array(
 	'application'=>'IP-Symcon',
 	'event'=>'Meldung',
 	'description'=>utf8_encode("Stundenplanänderung in dieser KW"),
 	'priority'=>0
   ));

   SMTP_SendMail(47160 /*[- Angelegte Datenbank von My Home -\.Main Skripte\Projekt Stundenplan\Stundenplan - E-Mail senden (SMTP)]*/, "Stundenplanänderung $KW. KW!", "Wir haben eine Änderung. http://www.****/all/Stundenplaene/$KW/c/c00006.htm  Dieser Service wird gesponsort von Holodeck Homeserver.");

   TTS_Speak(53873 /*[- Angelegte Datenbank von My Home -\Flur\.Multimedia\Text To Speech - Ausgabe der Statusmeldungen]*/, "Stundenplanänderung", true); //Warten bis zu Ende gesprochen wurde

	}

?>

So, habe mich mal mit deinem Vorschlag auseinander gesetzt. Mein PHP ist noch nicht ganz so gut und ich steh noch ganz am Anfang. Das meiste in deinem Script kann ich wohl schon recht gut zuordnen, zumindest den Anfang.

Interessant ist für mich der Bereich in dem du anscheinend den Stundenplan ausließt.

$Antwort = file_get_contents("http://Benutzername:Passwort@...Link.../stundenplan/plan/$ModKalenderwoche/c/c00001.htm");

Der Aufbau meines Links ist ja der selbe…

Nur versteh ich nicht ganz wie du aus dem HTML Code, habe dazu ja auch nen neuen Thread aufgemacht, die Werte auslesen und sortieren kannst.

Ich brauch das ja nicht zu visualisieren, aber ich möchte zum einen wissen wann die erste Stunde ist, um meinen Wecker (Sonos) zu stellen, und ob sich was im Plan geändert hat. Möchte also zyklisch den ausgelesenen Inhalt auf Veränderungen prüfen um so Meldungen generieren

Die Anzeige habe ich über HTML Box eingebunden, allerdings nutze ich auch nur iFront.

Ah…! Du trennst alles raus was bedingt durch HTML in „<“ und „>“ eingefasst ist…

aber so ganz genau blicke ich da noch nicht durch…

Hab grad versucht dein Script für mich umzubauen, aber ich habe noch zu viele Bereiche die mir nix sagen, kann du mir vielleicht nur den Teil geben der aus dem HTML Text die Rohdaten liefert?

Dann sollte eine Stringvariable über bleiben die den reinen Text enthält:

uhrzeit, Fach Mo, Lehrer Mo, Raum Mo, Fach Di…
uhrzeit, Fach Mo, Lehrer Di…

Die muss ich dann ja auch noch zerlegen… so das ich hmm… 6 Arrays (Wochentage) mit allen Daten bekomme, aber da bin ich noch nicht… :wink: