Alle Beiträge von King of Darkness

Datei downloaden mit cUrl

Ich stelle hier einfach mal eine Klasse bereit mit der einfache Requests an z.b. einen Webserver stellen kann.

Es lässt sich der anfragende Useragent einstellen (um z.b. einen Webbrowser zu simulieren)
und falls man ein Script für die Console entwickelt lassen sich auch „lognachrichten“ ausgeben.

Hier aber erstmal der Code:

<?php 
 
class basespider
{
    protected $useragent = null;
    protected $cookie = null;
    protected $followlocation = null;
    protected $post = null;
    protected $get = null;
    protected $consolenOutput = false;
 
    /**
     * Constructor mit Grundeinstellungen
     *
     * @param string $useragent        //Useragent unter dem angefragt wird
     * @param bool $consolenOutput    //Soll eine art Log ausgegeben werden?
     */
    public function __construct(
        $useragent = 'Mozilla/5.0 (Windows; U; Windows NT 5.1; de; rv:1.8.1) Gecko/20061010 Firefox/2.0',
        $consolenOutput = false
    )
    {
        $this->useragent = $useragent;
        $this->cookie = "data/cookie.txt";
        $this->followlocation = 1;
        $this->timeout = 30;
        $this->consolenOutput = $consolenOutput;
    }
 
    /**
     * Setzt post-parameter
     *
     * @param array $daten
     */
    public function setPost($daten)
    {
        if($daten != null)
        {
            $tmp = "";
            foreach($daten as $key => $value)
            {
                $tmp .= $key."="./*urlencode*/($value)."&";
            }
 
            $this->post = rtrim($tmp, '&');
        }
 
    }
 
    /**
     * Setzt get-parameter
     *
     * @param array $daten
     */
    public function setGet($daten)
    {
        if($daten != null)
        {
            $tmp = "?";
            foreach($daten as $key => $value)
            {
                $tmp .= $key."=".$value."&";
            }
 
            $this->get = rtrim($tmp, '&');
        }
    }
 
    /**
     * setzt einen query zur angegeben url ab und löscht nach dem senden post und get parameter
     *
     * @param string $url
     * @return mixed
     */
    public function Query($url)
    {
        if(isset($this->get) && $this->get !== null)
            $url .= $this->get;
 
        $ch = curl_init();
        curl_setopt($ch, CURLOPT_URL, $url);
        curl_setopt($ch, CURLOPT_TIMEOUT, $this->timeout);
 
        curl_setopt($ch, CURLOPT_FOLLOWLOCATION, $this->followlocation);
 
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
        curl_setopt($ch, CURLOPT_USERAGENT, $this->useragent);
 
        if($this->cookie !== null)
        {
            curl_setopt ($ch, CURLOPT_COOKIEJAR, $this->cookie);
            curl_setopt ($ch, CURLOPT_COOKIEFILE, $this->cookie);
        }
 
        if(isset($this->post) && $this->post !== null)
        {
            curl_setopt($ch, CURLOPT_POST, 1);
            curl_setopt($ch, CURLOPT_POSTFIELDS,$this->post);
 
        }
 
        if($this->consolenOutput)
        {
            echo date("d-m-Y H:i:s").": $url".(isset($this->post) ? ' ('.$this->post.')' :'')."\n";
        }
 
        $return = curl_exec($ch);
 
        if(curl_errno($ch) && $this->consolenOutput)
        {
            echo curl_error($ch);
        }
        curl_close($ch);
 
        unset($this->get);
        unset($this->post);
 
        return $return;
    }
}
 
$spider = new basespider();
 
$res = $spider->Query('http://www.google.de/');
 
?>
 
<html>
    <head>
        <title>Spidertest</title>
    </head>
 
    <body>


<div style="border: 1px solid black; width: 700px; height: 300px; overflow:auto;"><?=$res?></div>


    </body>
</html>

In diesem Beispiel laden wir die startseite von Google.

Bevor man die Querymethode aufruft lassen sich aber auch GET und POST Parameter mit einbinden.
Dafür gibt es die Methoden setGet und setPost die jeweils als array übergeben werden.

Das ergebnis $res kann man nun wahlweise ausgeben oder in eine Datei schreiben, z.b. mit der Funktion file_put_contents

Das wars dann auch schon.

Viel spass damit!

Einfacher Countdown mit PHP und JavaScript

Hier zeige ich ein kurzes Beispiel wie man einen Countdown umsetzen kann.
Der Zeitpunkt wann der Countdown abläuft kann dabei aus einer Datenbank gelesen werden oder im Quelltext festgelegt werden.

<?php 
//z.b. Zeitpunkt aus einer Datenbank 
$datetime = "2013-12-31 09:21:28"; 
$ts = strtotime($datetime); //in TimeStamp umwandeln 

$currentTs = time(); //Aktueller Timestamp 
?>
 
<html>
    <head>
        <title>Countdown</title>
        <script type="text/javascript">
            var countdownfunc = function(elem, ende, endstring)
            {
                //Wenn nichts als countdownende angegeben wurde dann wird das hier festgelegt
                if(typeof endstring == 'undefined')
                {
                    endstring = 'jetzt';
                }
 
                //Der ausgabestring wird festgelegt
                var output = endstring;
 
                //Differenz zwischen jetzt und dem ende
                //division durch 1000 weil in JavaScript ein timestamp in Millisekunden angegeben wird
                var timeDiff = (parseInt(ende)) - (parseInt(new Date().getTime() / 1000));
 
                //Wenn mehr als 0 Sekunden übrig ist dann ...
                if(timeDiff > 0)
                {
                    //... setz den ausgabe string zurück
                    output = '';
 
                    //Wenn mehr als 1 Stunde (60 sek * 60 Min) übrig ist...
                    if(timeDiff > 3600)
                    {
                        //errechne wie viele stunden übrig sind
                        output += parseInt(timeDiff/3600) + 'h ';
                        timeDiff = timeDiff%3600; //Modulo, teile durch eine stunde und speichere den rest
                    }
 
                    //Wenn mehr als 1 Minute (60 Sek) übrig ist ...
                    if(timeDiff > 60)
                    {
                        //... errechne wieviele minuten es sind ...
                        output += parseInt(timeDiff/60) + 'm ';
                        timeDiff = timeDiff%60;//... und merk dir den rest
                    }
 
                    //jetzt sind nur noch die sekunden übrig
                    output += timeDiff + 's';
 
                    //rufe diese funktion nach 1000 millisekunden (1 Sek) wieder auf
                    setTimeout(function() {countdownfunc(elem, ende, endstring);},1000);
                }
 
                //Schreib den ausgabestring in das mitgelieferte element
                elem.innerHTML = output;
            };
        </script>
    </head>
 
    <body>
        Restzeit:
<div id="countdown"></div>

 
        <script type="text/javascript">
            //Funktion erst aufrufen nachdem das element erzeugt wurde ...
            countdownfunc(document.getElementById('countdown'), <?=$ts?>);
        </script>
    </body>
</html>

Internetfestplatte von Google mit Freigabefunktion

Googles Online Office „Text & Tabellen“, einigen besser bekannt unter dem Namen Google Docs wird demnächst ermöglichen Dateien von unterschiedlichstem Format hochzuladen. Also Bilder, Video oder andere Dinge. Eine Einschränkung gibt es allerdings doch, die Dateien dürfen nicht größer als 250 MB sein. Der gesamte Speicherplatz wird 1 GB betragen, vielleicht passiert es ja wie bei GMail früher das dieser platz nach und nach anwächst, das bleibt allerdings abzuwarten.
Das neue Feature soll im laufe der nächsten Wochen nach und nach frei geschaltet werden. Wie auch schon bei Google Docs soll es möglich sein einzelne Dateien oder auch ganze Ordner anderen Benutzer zur Verfügung zu stellen. Damit kommt der Dienst beinahe Rapidshare oder anderen Sharehostern gleich.
Benutzer die Google Apps im Einsatz haben soll es ebenfalls eine Synchronisierungsfunktion geben.

IcqSearch aus dem FireFox entfernen

Lange habe ich gesucht, dabei war die lösung verdammt einfach, hier nun eine kleine schritt für schritt Anleitung:

1. Als erstes Deinstallieren wir mal die Toolbar von ICQ, das machen wir unter Extras -> addons -> Erweiterungen

2. Wir machen einen neuen Tab auf und geben in die Addressleiste:
about:config
ein. Darauf kommt beim FF3 ein Warnhinweis den wir getrost wegklicken können (wir wissen ja was wir machen ;-))

3. Wir suchen mit dem Filter nach keyword.URL
in der Zeile steht bei Wert irgendwas mit icqsearch.com … mit einem rechtsklick darauf und anschließendem klick auf Zurücksetzen sollte dort wieder Google stehen.

Der Effekt dabei ist der das wenn man z.B. youtube in die Addressleiste schreibt man sofort auf youtube.com umgeleitet wird, ist wohl eine Art Service von Google.

4. Wir suchen nun noch mit dem Filter nach browser.search.defaultenginename

dort das gleiche spiel, rechtsklick und auf Zurücksetzen.

Dieser parameter betrifft das suchfeld rechts oben.

Ab jetzt oder Spätestens nach einem neustart von FF ist wieder alles wie es am anfang war.

Viel Spass damit.

String Replace in Mysql und der Unterschied zu PHP

Wie ich haben sicher auch schon einige andere den Fehler gemacht und sich gedacht die Parameterreihenfolge von str_replace in PHP auch bei REPLACE in MySql anzuwenden.
Ärgerlich wenn man kein Backup hat 😉

Hier nun einemal das Replace von MySql:

REPLACE(str,from_str,to_str)

Und nun str_replace in PHP

str_replace( $search, $replace, $subject );

 

Wie man sieht variiert hier die Position des Strings in dem ersetzt werden soll. Das hat dann natürlich üble folgen in einer Datenbank und natürlich auch umgekehrt in einem Script.

preg_replace und utf8 Umlaut Problemlösung

Das Problem war das ich irgendwas ersetzen wollte und aber die Umlaute erhalten bleiben sollten.
Das Funktioniert solange wunderbar wie man die Finger von UTF-8 lässt.
Bei mir kommen die Daten aus eine MySQL-Datenbank die UTF-8 Codiert ihre Daten speichert.

Ersetzen wollte ich damit

preg_replace("/[^A-Za-z0-9äÄüÜöÖß ]/"," ", $text);

Da hatte aber wohl PHP was dagegen und hat einfach die Umlaute auch mit rausgeschmissen.
Die Funktion preg_replace(); kann nämlich nicht mit Umlauten die UTF8-Codiert sind umgehen. Zum glück gibts da die Funktion utf8_decode(); mit ihr kann man einen String der UTF-8-Codiert ist in ein für preg_replace(); verständliches Format umwandeln
Nach dem Ersetzen muss der String nur wieder nach UTF-8 Codiert werden und man kann wie gewohnt weiter machen.

Hier ein Stück Code:
<pre>

$text = utf8_decode($text);
$text = preg_replace("/[^A-Za-z0-9äÄüÜöÖß /"," ", $text);
$text = utf8_encode($text);

Das geht natürlich auch verschachtelt:

$text = utf8_encode(preg_replace("/[^A-Za-z0-9äÄüÜöÖß /"," ", utf8_decode($text)));

 

Set/Enum Feld bei Mysql mit PHP auslesen

Ich habe schon öfters das Problem gehabt das ich in einer Tabelle, Felder als Typ Enum erstellt habe. Irgendwann kam dann eine Änderung, es wurde neue möglichkeiten hinzugefügt, oder es wurden mögliche Zustände entfernt. In der Anwendung wurden aber dann HTML-Selectfelder so gelassen wie sie waren, sprich mit alten Werten und es gab plötzlich Fehler.

Um diesem Problem aus dem Weg zu gehen kann man sich solche Datenbankfelder auslesen und anhand dessen die Selectformulare dynamisch zusammenbauen.

Ich gehe mal davon aus ihr könnt eine Verbindung zu einer MySql-Datenbank aufbauen und anfragen dort hin schicken, ansonsten schaut mal hier: Verbindung zu MySQL aufbauen + Abfrage

Wie sieht das ganze nun aus:

$sql = "SHOW COLUMNS FROM foo LIKE 'bar'";
$temp = mysql_query($sql);

if(mysql_num_rows($temp) > 0)
{
    $row=mysql_fetch_row($temp);
    $werte = explode("','",preg_replace("/(enum|set)('(.+?)')/","\2",$row[1]));
}

Dieses Stückchen Code gibt euch nun ein Array mit den verschiedenen Möglichkeiten zurück. Dieses Array könnt ihr dann mit einem foreach() durchgehen.

Nochmal kurz zur Erklärung

$sql = "SHOW COLUMNS FROM foo LIKE 'bar'";

foo ist hierbei eure Tabelle in dem sich das Feld bar befindet.

Viel Spass damit!

Tageszeit abhängige Bilder/Styles wie bei iGoogle

Viele von euch kennen sicher die Personalisierte Startseite von Google. Diese Startseite heißt iGoogle, ich persönlich nutze iGoogle auch, um mit einem Blick aktuelle Nachrichten zu sehen oder meine Termine im Kalender.
Aber genug von den Funktionen … ich möchte hier ja eigentlich auf den Header von iGoogle eingehen, Google bietet dort die Möglichkeit verschiedene Grafiken einzubinden, am Anfang habe ich dort die „Bushaltestelle“ genommen aber mittlerweile habe ich den Strand gewählt, beruhigt doch etwas mehr ;-).

Wenn man sich iGoogle über den Tag verteilt anschaut wird man feststellen das sich dort zu fast jede Tageszeit ein anderes Bild befindet, beim Strand geht das von Sonnenaufgang bis Sonnenuntergang.
Doch wie macht man sowas?

Als Grundvoraussetzung müssen wir erstmal wissen wie spät es eigentlich ist

$zeit = date("G");    //gibt die aktuelle stunde ohne führende 0 aus

Dann müssen wir das ganze auswerten:

if($zeit < 11) { 
    echo "Guten Morgen"; } 
elseif($zeit >= 11 && $zeit <= 13) {
    echo "Mahlzeit";
} else {
    echo "Guten Abend";
}

Das wäre eigentlich schon alles, je nach Tageszeit kann man da nun aber auch anderen Code einsetzen, z.B. den Pfad zu einer CSS-Datei die dann im HTML eingebunden werden soll, oder eben den Pfad zu einem Bild welches im Header der Seite angezeigt wird.

Wer gerne jede Stunde etwas anderes haben möchte dem empfehle ich dann Switch zu benutzen:

switch($zeit) {
    case 0:
        echo "es ist 0 Uhr";
    break;
    case 1:
        echo "es ist 1 Uhr";
    break;
    //...
    case 23:
        echo "es ist 23 Uhr";
    break;
}

Viel Spass damit!

Bücher digitalisieren mit CAPTCHA

Ich habe soeben erfahren das es eine „neue“ Art von CAPTCHA gibt. CAPTCHA sind kleine Bilder auf denen, meist verschnörkelt Buchstaben und Zahlen abgebildet sind. Damit ist es möglich seine Webseite vor Spam zu schützen oder zumindest es den Spammern zu erschweren (siehe Gästebuch)

Nun aber was ist so anders an der „neuen“ Methode, sie hat den netten Nebeneffekt das so Bücher Digitalisiert werden. Wie lange es allerdings dauert bis ein Buch vollständig digitalisiert ist, wird sich noch zeigen, auf alle Fälle ist das System sehr interessant.

http://recaptcha.net/learnmore.html

Zitat:
„But if a computer can’t read such a CAPTCHA, how does the system know the correct answer to the puzzle? Here’s how: Each new word that cannot be read correctly by OCR is given to a user in conjunction with another word for which the answer is already known. The user is then asked to read both words. If they solve the one for which the answer is known, the system assumes their answer is correct for the new one. The system then gives the new image to a number of other people to determine, with higher confidence, whether the original answer was correct.“

Na mal schauen ob sich das ganze durchsetzt.