Firat-Can
Untis Stundenplan Push
Untis Stundenplan Push


Untis Stundenplan Push

Open in GitHub

Das Programm sendet eine Nachricht per Telegram wenn sich etwas am Stundenplan ändert.

Es ist auf jede Schule anwendbar die keine Anmeldedaten benötigt, mit einer kleinen Änderung sollte es allerdings auch bei allen anderen Schulen klappen.

Im Beispielcode wird der Stundenplan der HI-17C des Heinz-Nixdorf-Berufskollegs unter mese.webuntis.com überprüft.

Download: untis.zip 21.02.18 23:16 Uhr

Was wird benötigt:

  • PHP
  • iCalReader
  • Telegram Bot
  • Cronjobs
  • Cronjob:

    Jede Minute von 6-15 Uhr von Mo-Fr
    Einmal jede Stunde jeden Tag.
    #m h dom mon dow command
    * 6-15 * * 1-5 wget -O /dev/null -q https://firatcan.de/untis/
    0 * * * * wget -O /dev/null -q https://firatcan.de/untis/

    PHP-Code:

    21.02.18 23:16 Uhr
     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
    <?php
      $schoolname = "_bml4ZG9yXXXXXXXXXXNlbg=="; // Schulname - Zu finden in den Cookies
      $datum = date('Y-m-d', strtotime(' + 1 days')); // Aufbau des Datums für den iCal-Kalender, Plus 1 Tag damit am Sonntag die Nachricht für den neuen Stundenplan am Montag kommt.
      $url = "https://mese.webuntis.com/WebUntis/Ical.do?elemType=1&elemId=XXX&rpt_sd=". $datum; // Die URL zum Kalender, elemId ersetzen
    
      setlocale(LC_TIME, array('de_DE.UTF-8','[email protected]','de_DE','german')); // Setzen der Sprache und Zeitzone (optional)
    
      // Cookie setzen
      $opts = array(
        'http'=>array(
          'method'=>"GET",
          'header'=>"Cookie: schoolname=".$schoolname.""
        )
      );
      $context = stream_context_create($opts);
      // Datei mit dem oben gesetzen Cookie öffnen (erforderlich, wird ohne Cookie nicht erlaubt)
      $file = file_get_contents($url, false, $context);
      if ($file === false) {
        echo "Fehler";
        die();
      }
      // Datei als aktuell.ics speichern
      file_put_contents('aktuell.ics', $file);
    
      /*
        ICS_Parser (nur mit kenntnis verändern)
    
        @category Example
        @package  Ics-parser
        @author   Martin Thoma < [email protected] >
        @license  http://www.opensource.org/licenses/mit-license.php  MIT License
        @version  SVN: < svn_id >
        @link     http://code.google.com/p/ics-parser/
        @example  $ical = new ical('MyCal.ics');
                  print_r( $ical->get_event_array() );
      */
      ob_start(); // Buffering starten
      require 'class.iCalReader.php';
    
      $ical   = new ICal("aktuell.ics");
      $events = $ical->events();
      asort($events);
    
      //Output Schleife pro $event
      foreach ($events as $event) {
      // DTSTART und DTEND zu einem normalen Datum machen
      $dtstart = strtotime($event['DTSTART']);
      $dtend = strtotime($event['DTEND']);
          echo "Fach: *".$event['SUMMARY']."*\n";
          echo "Start: ". strftime("%A, %d. %B %Y %H:%M Uhr", $dtstart)."\n";
          echo "Ende: ". strftime("%A, %d. %B %Y %H:%M Uhr", $dtend)."\n";
          echo "Lehrer: ".$event['DESCRIPTION']."\n";
          echo "Raum: *".$event['LOCATION']."*\n";
          echo "\n\n";
      }
    
      $aktuell = file_get_contents("aktuell.html");
      // Stundenplan vergleichen
      if ($aktuell == ob_get_contents()) { // Wenn die aktuelle Datei == die alte Datei ist..
        echo "Keine Neuerung seit: ".date("l, d.m.Y H:i:s",filemtime("aktuell.html"))." Uhr.";
      }else {
      // Bei Neuerung..
      $ob_get_contents = ob_get_contents();
      file_put_contents('aktuell.html', $ob_get_contents); // Bei Neuerung aktuell.html mit neuen Stundenplan Daten erstellen
      echo "Neuerung ";
    
      /* Telegram Code */
      function sendMessage($chatID, $messaggio, $token) {
          echo "Nachricht gesendet an " . $chatID . "\n"; // Info die auf der Website ausgegeben wird.(optional)
          $url = "https://api.telegram.org/" . $token . "/sendMessage?parse_mode=markdown&chat_id=" . $chatID;
          $url = $url . "&text=" . urlencode($messaggio);
          $ch = curl_init();
          $optArray = array(
                  CURLOPT_URL => $url,
                  CURLOPT_RETURNTRANSFER => true
          );
          curl_setopt_array($ch, $optArray);
          $result = curl_exec($ch);
          curl_close($ch);
      }
      $token = "bot123456789:XXXXXXXXXXX-XXXXXXXXXXXXXXXXXXXXXXX"; // Telegram BOT Token
      $ch1 = curl_init("https://api.telegram.org/$token/setWebhook");
      curl_setopt($ch1, CURLOPT_RETURNTRANSFER, 1);
      curl_exec($ch1);
    
      $chatID = "123456789";
    
      sendMessage($chatID,"Vorher:\n$aktuell",$token); // Funktion der Nachricht
      sendMessage($chatID,"Nachher:\n$ob_get_contents",$token); // Funktion der Nachricht
      sendMessage($chatID,'Irgendwas hat sich geändert bei Untis.',$token);
      }
      ?>