Blog Ping

Jan 21, 2008

Du skriver en blog fordi du har noget at fortælle, samtidig vil du gerne at andre læser og kommenterer det du skriver - men hvordan får du dem ind på dit site?

Dette være et af de spørgsmål langt de fleste bloggere, online-shop-ejere, og andet online-folk, har spurgt sig selv om, fra tid til anden. Jeg siger ikke at hele svaret kommer i denne post, men af egne erfaringer vil jeg våge at påstå, at RSS kan have en hel del at sige. Måske du allerede vidste det, men en RSS feed giver dig ufatteligt mange muligheder for at distribuere din sides poster, produkter, nyheder eller hvad det ellers måtte være.

RSS Feeds

Snart alle blogs, og nu også de fleste public-service/offentlige-sites er ved at være med på vognen, når vi blot snakker om at have en RSS feed - hvad jeg detsvære ikke ved så meget om er, om disse sites også gør noget for at videre distribuere denne feed til andre services/medier.

En af de store forcer ved RSS feeds er, at de er formateret i XML. At en feed er formateret i XML betyder groft sagt bare, at alt det "designmæssige" bliver fjernet, hvorefter kun selve "indholdet" er tilbage og kan sendes videre. At en feed ikke indeholder noget design, og er i form af "ren tekst", betyder at den efterfølgende er pændt nem at "transportere" og benytte i andre sammenhænge - som f.eks. kunne være på en mobiltelefon.

En RSS feed lader sig også forholdsvist nemt downloade, transportere og implementere fra site til site (også bare kaldet parsing), som jeg også beskrev i posten "RSS til alle" - Parsing er f.eks. hvad du har mulighed for at gøre på Google´s personlige side iGoogle, i din online feed reader og mange andre steder.

RSS/Ping Services

Netop til parsing og visning af RSS feed, findes der adskillige dedikerede sites rundt omkring på nettet, og det er faktisk disse sites denne post reelt handler om, og som jeg vil prøve at gøre lidt reklame for.

Langt de fleste af disse sites har en såkaldt ping service. En ping service er, som navnet antyder, en service til at håndtere et såkaldet ping! Et ping er kort sagt en forespørgsel fra en computer til en anden. I RSS sammenhænge lyder denne forespørgsel nogenlunde således:

Hej ping service ... vil du ikke lige se om du kan finde noget nyt på min side. Adressen er www.simon-jensen.net - hilsen Simon Jensen.

Herefter, hvis ellers pinget er formateret korrekt, vil ping servicen gennemgå dit site (feed), og se om der ikke godt nok skulle være kommet noget nyt, siden sidst denne fik et ping. Servicen finder din nye post/produkt, og et link, samt en lille beskrivelse, vil blive tilføjet til ping servicens side.

Du har nok fået fat i ideen - Det at sende et ping kan automatiseres, så det bare sker hver gang du opretter en post. Du kan lige ledes sende et ping til flere ping services. For hver service der optager din forespørgsel, kan du glæder dig over at have fået et indgående link - og dem vil vi jo gerne have. Se evt. denne side:

http://overskrift.dk/feed/bb5eb40b82e08c314b232b690e8157ba69137ab5

Der findes sågar ping services, som sørger for at sende din forespørgsel videre til andre ping services - man kommer selvsagt hurtigt ud til at mange "medier". Her er et par links til lidt mere læsning om ping services - et par af dem, lader dig faktisk pinge direkte fra deres side af:

http://blogbot.dk/info/xmlrpc.php

http://blogs.feedburner.com/feedburner/archives/000478.html

http://www.overskrift.dk/about/ping.php

http://pingomatic.com/

http://codex.wordpress.org/Update_Services

De fleste af de mest udbredte blogging tools, har allerede indbygget funktionalitet til at sende et ping - men sidder du, som jeg, og leger med din egen blog (i PHP vel og mærket), har jeg tastet følgende ping-klasse sammen (med hjælp fra en implementering hos Blogbot.dk), som du skal være velkommen til at benytte som du vil.

class.PING.php - PHP Ping klasse

Du kan downloade denne klasse, samt et eksempelt nederst på denne side.

<?php
/**
 * Filename: class.PING.php
 *
 * @author Simon Jensen @ http://www.simon-jensen.net
 */

class PING
{
    /**
     * URLs to ping.
     * @var array
     */
    public $pingUrls = array(
        "http://www.overskrift.dk/ping/",
        "http://blogbot.dk/io/xml-rpc.php",
        "http://rpc.pingomatic.com/",
        "http://rpc.weblogs.com/RPC2",
        "http://rpc.technorati.com/rpc/ping",
        "http://ping.weblogs.se/",
        "http://ping.feedburner.com",
        "http://api.feedster.com/ping"
        );

    /**
     * Your website title here.
     * @var string
     */
    public $weblogName = "Your title goes here...";

    /**
     * URL for your website.
     * @var string
     */
    public $weblogUrl = "http://localhost/Testing/ping/";

    /**
     * Turn debugging on/off
     * @var bool
     */
    public $debug = false;

    /**
        * Default constructor
        *
        * @return PING
        */
      function __PING() {}

    /**
     * Send a XLM-RPC ping to a specific URL.
     *
     * @param string $pingUrl - url to ping.
     * @return string error msg.
     */
    private function sendPing($pingUrl)
    {
        $postdata = <?xml version="1.0"?>
           <methodCall>
             <methodName>weblogUpdates.ping</methodName>
             <params>
               <param><value><string> .
                    preg_replace(|[x80-xFF]|e, "&#".ord("").";", $this->weblogName) .
                    </string></value></param>
               <param><value><string> . htmlspecialchars($this->weblogUrl) . </string></value></param>
             </params>
           </methodCall>;

        $timeout = 20;

        $parts = parse_url($pingUrl);
        if (!isset($parts[host])) :
            return array(-1, "Malformed URL:
" . $pingUrl);
        endif;

        $host = $parts[host];
        $port = isset($parts[port]) ? $parts[port] : 80;
        $path = isset($parts[path]) ? $parts[path] : /;
        if (isset($parts[query])) :
            $path .= ? . $parts[query];
        endif;

        $fp = @fsockopen($host, $port, $errno, $errstr, $timeout);
        if (!$fp) :
            return array(-2, "Could not connect to $host:$port");
        endif;

        socket_set_timeout($fp, $timeout);

        $request = "POST $path HTTP/1.0
" .
            "Host: $host
" .
            "Content-Type: text/xml
" .
            "User-Agent: Aggemam XML-RPC client
" .
            "Content-Length: " . strlen($postdata) . "
" .
            "
" .
            $postdata;
        fputs($fp, $request);

        if ($this->debug) :
            print "<div style=color: blue; white-space: pre>";
            print htmlspecialchars($request);
            print "</div>";
        endif;

        $response = ;
        while (!feof($fp)) :
            $response .= fgets($fp, 1024);
            $status = socket_get_status($fp);

            if ($status[timed_out]) :
                fclose($fp);
                return array(-3, "Request timed out");
            endif;
        endwhile;

        fclose($fp);

        if ($this->debug) :
            print "<div style=color: green; white-space: pre>";
            print htmlspecialchars($response);
            print "</div>";
        endif;

        if (preg_match(|<name>flerror</name>s*<value>s*<boolean>([^<])</boolean>s*</value>|, $response, $reg1) && preg_match(|<name>message</name>s*<value>(s*<string>)?([^<]*)(</string>s*)?</value>|, $response, $reg2)) :
            return array($reg1[1], $reg2[2]);
        else :
            return array(-3, "Malformed reply:
" . $response);
        endif;
    }

    /**
     * Send a XLM-RPC pings to each URL in $this->pingURLs
     *
     * @return string error msg.
     */
    public function sendPings()
    {
        foreach ($this->pingUrls as $pingUrl) :
            print "<p>Pinging $pingUrl ... ";
            flush();

            list($error, $message) = $this->sendPing($pingUrl, $this->weblogName, $this->weblogUrl, $this->debug);

            if ($error == 0) :
                print "Ping recieved!</p>";
            else :
                print "Something went wrong:</p>";
                print "<p style=font-size: smaller; color: red; white-space: pre>" . htmlspecialchars($message) . "</p>";
            endif;
        endforeach;
    }
}
?>

Eksempel

Følgende eksempel findes også i .zip-filen, som du kan downloade herunder.

require_once("class.PING.php");
$ping = new PING();

/**
 * Turn debuggin on/off
 */
$ping->debug = true;

/**
 * You can also just edit the variables in the class
 */
$ping->weblogName = "Your website title here";
$ping->weblogUrl = "http://your-site-here.com";

/**
 * Overwrite the URLs to ping if desired.
 */
//$ping->pingUrls = array("http://rpc.pingomatic.com/", http://www.overskrift.dk/ping/");

/**
 * Send a ping to all URLs in $ping->pingUrls.
 */
$ping->sendPings();


Comments

comments powered by Disqus