Telekom Entertain Receiver via Web-EPG bei programmierten Aufnahmen einschalten

Hallo zusammen,

dieses Skript ist aus dem Umstand entstanden, dass die Telekom unter Standby die Änderung die der Powerleuchte von grün auf rot versteht und nur die Videoausgänge ihrer Receiver abschaltet. Eine reine Funksteckdose hatte aber keine programmierten Aufnahmen mehr zugelassen. Da man aus dem Web-EGP an die notwendigen Daten kommt möchte ich euch dieses Skript nicht vorenthalten.

<?
$ObjectID_start 	= 40212 /*[Funksteckdosen/Schalter\Wohnzimmer\Entertain Receiver\Start]*/;
$ObjectID_end   	= 34200 /*[Funksteckdosen/Schalter\Wohnzimmer\Entertain Receiver\Ende]*/;
$ObjectID_onoff 	= 12485 /*[Funksteckdosen/Schalter\Wohnzimmer\Entertain Receiver]*/;
$ObjectID_rec	 	= 38243 /*[Funksteckdosen/Schalter\Wohnzimmer\Entertain Receiver\Aufnahme]*/; 
$ObjectID_FS20SD  = 54706 /*[Funksteckdosen/Schalter\Wohnzimmer\Entertain Receiver\ FS20 Steckdose]*/;
$offset_start 		= 300; // Bootzeit Receiver
$offset_end 		= 300;   // Nachlaufzeit Receiver
$url = "http://mobil.epg.t-home.de/EpgMobile/GeplanteAufnahmen/einzelAufnahmenUebersicht?";
$COOKIEFILE = 'cookies.txt';

$ch = curl_init();
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 30);
curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($ch, CURLOPT_COOKIEJAR, $COOKIEFILE);
curl_setopt($ch, CURLOPT_COOKIEFILE, $COOKIEFILE);
curl_setopt($ch, CURLOPT_HEADER, false);
curl_setopt($ch, CURLOPT_RETURNTRANSFER,1);
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 120);
curl_setopt($ch, CURLOPT_TIMEOUT, 120);
curl_setopt($ch, CURLOPT_NOBODY, false);
curl_setopt($ch, CURLOPT_URL,  $url);
$data = curl_exec($ch);

$curlinfo = curl_getinfo ($ch);
$url = $curlinfo ["url"];

// TID & DOMN aus Quelltext ermitteln
$tid_pos = '<input type="hidden" name="tid" value="';
$domn_pos = '<input type="hidden" name="domn" value="';

$tid=substr($data, strpos ($data, $tid_pos)+strlen($tid_pos), 24);
$domn=substr($data, strpos ($data, $domn_pos)+strlen($domn_pos), 37);

// Login auf Web EPG
curl_setopt($ch, CURLOPT_URL,  'http://mobil.epg.t-home.de/EpgMobile/TvProgramm/login');
$data = curl_exec($ch);
$user = "Beispiel robert.tonline"; // eMail-Adress T-Online Haupbenutzer ohne '@t-online.de' z.Bsp. 'robert.tonline'
$password = "Beispiel 12345678"; // Passwort Hauptbenutzer = Passwort zur DSL Einwahl z.Bsp. '12345678'
$url = $url . "&domn=".$domn."&appid=0802&skinid=12&lang=de&usr=".$user."&pwd=".$password."&gen_ac=sv-empty-value&login=Login";

curl_setopt($ch, CURLOPT_URL, $url);

//Quelltext des Web EPG abfragen
$data = curl_exec($ch);

// Anzahl der Unterseiten ermitteln
$pos = '<div class="padding">';
$process_data = $data;
$process_data = substr ($process_data, strpos ($process_data,$pos) + strlen ($pos));
$process_data = substr ($process_data,0,strpos($process_data,"<"));

//Sonderzeichen entfernen
$process_data = str_replace (chr(194), '', $process_data);
$process_data = str_replace (chr(160), '', $process_data);
$process_data = str_replace (chr(10), '', $process_data);
$process_data = str_replace (chr(9), '', $process_data);
$process_data = str_replace (chr(32), '', $process_data);
$process_data = str_replace ('Seite', '', $process_data);

//Start und Endseite
$first_site = substr($process_data, 0, strpos ($process_data,"/"));
$last_site = substr($process_data, strpos ($process_data,"/")+1);

//Link im Quelltext finden
$link = '<a href="';
$process_data = $data;

while (strpos ($process_data, $link)) { // Einzelne Unterseiten ermitteln
$check = substr ($process_data, strpos ($process_data, $link)+strlen ($link),4);

if ($check == '/Epg') { // EPG Einträge ignorien und weitersuchen
$process_data = substr ($process_data,strpos ($process_data, $link)+strlen ($link));
} else { // While Schleife abbrechen und Link zu weiteren Seiten gefunden
$url_next_page = $process_data;
$process_data = "";
} // End If
} // While Schleife

// Token extrahieren
$url_next_page = substr ($url_next_page, strpos($url_next_page,$link)+strlen($link));
$url_next_page = substr ($url_next_page, 0, strpos($url_next_page,'">'));

// Werte größer als '$last_site' im URL Aufruf ergeben eine Gesamtübersicht ohne Unterseiten
$global_page = $last_site + 1;
$url_next_page = substr ($url_next_page,0,strlen($url_next_page)-2).$global_page.'/';

$url = "http://mobil.epg.t-home.de".$url_next_page;
curl_setopt($ch, CURLOPT_URL, $url);

//Quelltext des Web EPG abfragen als Gesamtübersicht ohne Unterteilung in Unterseiten
$data = curl_exec($ch);


$time_mark = '<div class="paddingLeRi">';
$process_data = $data;

while (strpos ($process_data , $time_mark)) { // einzelne Aufnahmezeiten ermitteln

$recording = substr($process_data, strpos ($process_data, $time_mark) + strlen($time_mark),23);
// echo($recording)."
"; // nur für Testzwecke
$day = substr ($recording,0,2);
$month = substr ($recording,3,2);
$year = substr ($recording,6,2);
$date = mktime (0,0,0, $month, $day, $year);
$hour = substr ($recording,10,2);
$minute = substr ($recording,13,2);
$start = mktime ($hour , $minute, 0 , $month, $day, $year) - $offset_start;
$hour = substr ($recording,18,2);
$minute = substr ($recording,21,2);
$end = mktime ($hour , $minute, 0 , $month, $day, $year) + $offset_end;

//Endzeit nach 24:00h und +1 Tag (24 * 3600 Sekunden) auf Zeit addieren
if ($end < $start) $end = $end + 24 * 3600;

$programmed_start = GetValueInteger ($ObjectID_start);
$programmed_end   = GetValueInteger ($ObjectID_end);

// abgelaufener Timer, programmierter Timer in der Vergangenheit, Timer immer setzen (zukünftiger Wert)
if (time() > $programmed_start and time() > $programmed_end) {
	SetValueInteger ($ObjectID_start, $start);
	SetValueInteger ($ObjectID_end,   $end);
	goto skip_mark;
} // if

// laufender Timer, sich überschneidende Aufnahmen
if (time() > $programmed_start and time() < $programmed_end and $start < $programmed_end and $end > $programmed_end) {
	SetValueInteger ($ObjectID_end,   $end);
	goto skip_mark;
} // if

// früherer zuküftiger Timer, neue Startzeit vor programmierter Startzeit
if ($start < $programmed_start) {
SetValueInteger ($ObjectID_start, $start);
SetValueInteger ($ObjectID_end,   $end);
} // if

skip_mark:
//Daten überspringen
$process_data = substr ($process_data, strpos ($process_data, $time_mark) + strlen ($time_mark));
$process_data = substr ($process_data, strpos ($process_data, $time_mark) + strlen ($time_mark));

} // while

curl_close($ch);

$programmed_start = GetValueInteger ($ObjectID_start);
$programmed_end   = GetValueInteger ($ObjectID_end);

// Recording ON
if (time () > $programmed_start and time () < $programmed_end) {
   SetValueBoolean ($ObjectID_rec, True);
} // if

// Recording OFF
if (time () < $programmed_start or time () > $programmed_end) {
   SetValueBoolean ($ObjectID_rec, False);
} // if

?>

Hier ein Screenshot vom Objektbaum mit Variablen und Ereignissen

13345 Ist eine FS20 Steckdose für den Fernseher
14151 ist ein Ereignis welches bei der Variable 19969=True immer die Variable 12485 auf True setzt Fernseher an => Receiver an
12845 ist der Schalter für das Ein- und Ausschalten des Receivers i.V.m. dem Skript 43358
54706 ist die FS20 Steckdose des Receivers
38243 zeigt mir im WebFront eine laufende Aufnahme an. Ist für den WAF … sonst kommt immer die Frage: Warum geht der Receiver nicht aus. Antwort: Weil er aufnimmt.
40212 und 34200 zeigen den Zeitraum der nächsten Aufnahme an
37011 =False prüft 38243 auf False, falls das gegeben ist schaltet 54706 aus
44898 =True schaltet 54706 an
20446 prüft 12485 auf False, 38243 auf False und 14549 auf True und schaltet dann 54706 aus

Viel Spass beim Basteln und Feedback ist willkommen (Ich weiss SSL mit CURL ist nicht perfekt gelöst).

Gruß

Henning

P.S.: Bis 120 programmierte Aufnahmen müßte alles funktionieren. Normalerweise ist das Weg-EPG in Seiten a 15 Aufnahmen unterteilt. Wenn man bei 3 Seiten die 4. Seite aufruft (max. +1, per Zufall rausgefunden) kommen ein Gesamt-EPG ohne Seitenunterteilung. Ob die URL-Syntax zweistellig Seitenzahlen annimmt habe ich nicht getestet (>120 Aufnahmen min. 9 Seiten)!

Hallo.

Offensichtlich funktioniert die URL und damit das Script nicht mehr. Leider.
Gibt es denn ein update des Scriptes? Ich wäre sehr an dessen Funktion interessiert.

Herzlichen Dank.
Peter