Hämta busstider med php

För att enkelt kunna få reda på när nästa buss går från min närmaste busshållplats så har jag snickrat ihop ett litet script i php och lagt på min webserver. Då kan man enkelt gå in och hitta när nästa busstur går. I själva verket så är det tre script jag använder mig av, ett som använder php och php DOM (Document Object Model) för att hämta själva busstiderna, ett php script som visar alltihop och använder AJAX för att med jämna mellanrum uppdatera busstiderna och slutligen ett script som jag lånat från sourceforge som hanterar och förenklar DOM funktionerna på ett smidigt sätt.

Så här blev resultatet när jag blev färdig:
Exempel på informationssida med klocka, busstider och dagens namn.

Hur är det då uppbyggt?

  1. Först behöver vi bygga ett script som hämtar busstiderna från västtrafiks hemsida. I detta anropar vi först en funktion som heter file_get_html(). Den här funktionen finns i ett skript som heter simple_html_dom.php och som finns att hämta på Sourceforge. Det file_get_html() gör är att den med php DOM funktionen load läser in västtrafiks hemsida där busstiderna för den aktuella hållplatsen finns. Sedan finns det lite andra funktioner i simple_html_dom.php som paketerar och behandlar den mottagna websidan så att det blir enkelt att plocka ut det man vill ha från sidan. Slutligen så bygger vi en tabell med hjälp av en foreach sats som skriver ut och formaterar busstidsdatat.
    <?php
    header
    ('Content-Type: text/html; charset=utf-8');
    include
    '../common/functions/simple_html_dom.php';
     
    function
    get_vasttrafik($url){
            
    $html = file_get_html($url);
             return
    $html->find('tr.nextTrip');
    }
    ?>

    <div id="table_reloader">
    <table class="busstable">
    <thead class="busheader">
    <tr>
    <th>Linje</th>
    <th width="300px">Till</th>
    <th>H</th>
    <th>Nästa</th>
    <th>Därefter</th>
    </tr>
    </thead>

    <?php   
            $vars
    = include 'configuration.php';
            foreach(
    get_vasttrafik($vars['busstop']) as $tablerow) {
                if (
    intval(substr(trim($tablerow->find('td.icon', 0)->plaintext),0,5))>0)
                {
                    echo
    "<tr>";
                    echo
    "<td class='busline'>".substr(trim($tablerow->find('td.icon', 0)->plaintext),0,5)."</td>";
                    echo
    "<td class='bustour'>".$tablerow->find('td.destination', 0)->plaintext."</td>";
                    echo
    "<td class='bustrack'>".$tablerow->find('td.track', 0)->plaintext."</td>";
                    echo
    "<td class='busnext'>".$tablerow->find('td.nextDepartureTime', 0)->plaintext."</td>";
                    echo
    "<td class='busnextnext'>".$tablerow->find('td.nextNextDepartureTime', 0)->plaintext."</td>";
                    echo
    "</tr>";
                }
            }
           
    ?>

    </table>
    </div>

  2. Nu när vi har fått datat från vår källa och formaterat det så är det dags att se till att datat är uppdaterat för användaren. Här kan man använda sig av ett simpelt reload javascript på sidan men det blir inte så snyggt. Istället så använder vi AJAX som uppdaterar datat, i det här fallet busstiderna, i bakgrunden. Efter funktionen xmlbushttp.open() så lägger vi till ett slumptal för att gå runt webläsarens cache och förhindra att användaren ser en cachad sida. Variabeln BUSTimer styr hur ofta vi vill ladda om sidan. Tiden är i millisekunder. Tänk på att om vi hämtar mycket datat så kan det vara bra att ha lite längre mellan hämtningarna så att inte ägaren av sidan där vi hämtar vår information blir irriterad.
    <script>
    <!-- Function AJAX loading busschedule -->
    function showBUSTable() {

       if (window.XMLHttpRequest) {
        // code for IE7+, Firefox, Chrome, Opera, Safari
         xmlbushttp=new XMLHttpRequest();
       } else {  // code for IE6, IE5
         xmlbushttp=new ActiveXObject("Microsoft.XMLHTTP");
       }
       xmlbushttp.onreadystatechange=function() {
         if (xmlbushttp.readyState==4 && xmlbushttp.status==200) {
           document.getElementById("BUSTableOutput").innerHTML=xmlbushttp.responseText;
         }
       }
       xmlbushttp.open("GET","../common/bustimes_brasebacken.php?t=" + Math.random(),true);
       xmlbushttp.send();
    }

    <!-- Variables -->
    var BUSTimer = setInterval(BUSTimer, 60000); <!----- Retrieve an update every 60 seconds -->

    <!-- Function BusTimer Updates the bus timetable -->
    function BUSTimer() {
    showBUSTable();
           }
    </script>

    <div id="BUSTableOutput">Be patient. BUSTable Loading</div>

Svenska