03 maj 2007

Bloggping i Javakod

Ping server När jag hade lagt ut mina första blogginlägg undrade jag hur i all världen någon skulle kunna hitta min blogg. Jag frågade min bekant Håkan Kjellerstrand, som tog på sig rollen som min bloggningsmentor och gav mig ett antal länkar, bland annat till några servrar som han själv brukade »pinga« för att sprida kunskapen om sin blogg. Jag hade inget problem att förstå vad detta innebar i teorin, men hur jag rent praktiskt skulle göra för att pinga var inte uppenbart. Efter en stunds jagande efter pingverktyg konstaterade jag att det enklaste för mig nog var att själv skriva ett litet Javaprogram för att ta hand om det.

Blog Ping

Att pinga innebär i bloggsammanhang att man skickar ett litet meddelande som upplyser en pingserver om att man skrivit något på sin blogg, samt om bloggens adress. Servern kan då så snart den får tid hämta ner inlägg från bloggen och lagra data om den, indexera innehållet etc., för att göra informationen tillgänglig för dem som utnyttjar servern till att bevaka bloggosfären.

Googles Blogger som jag numera använder låter en välja att pinga Weblogs.com automatiskt, och informationen går därifrån vidare till en del andra tjänster. Men vill man pinga fler servrar, Nyligen.se till exempel, får man ingen hjälp av Blogger.

Tekniskt

Ping görs med ett XML-RPC-anrop, vilket som namnet antyder är ett remote procedure call-protokoll uppbyggt som XML, ovanpå HTTP. Metoden man anropar är antingen weblogUpdates.ping eller den utvidgade versionen weblogUpdates.extendedPing.

Parametrarna till den ursprungliga pingmetoden är bloggens namn, dess adress och eventuellt ett kategorinamn. Den utvidgade versionen tillåter tre adresser: en basadress, en direktadress till en sida som ska kollas för uppdateringar (i många fall densamma som basadressen), och en för flödet i RSS- eller Atom-format. Den bästa beskrivningen av parametrarna jag har hittat är den hos Weblogs.com. Exakt vilka parametrar som krävs och hur de tolkas verkar dock tyvärr variera lite mellan implementationerna på olika servrar.

Det vore inte särskilt svårt att skriva ett program i Java som satte ihop XML för anropet och matade ut den på en socket. Men ännu lättare är förstås att använda ett bibliotek med färdiga klasser för XML-RPC-anrop, exempelvis Apache XML-RPC.

Om man laddat ner Apache XML-RPC 3.0, exempelvis från Sunet, packat upp, och lagt JAR-filerna som finns i lib-katalogen på sin classpath kan man kompilera och köra följande program. Den första parametern till programmet är pingserverns adress, och de följande 2–5 är parametrarna till pingmetoden. Har man minst fyra pingparametrar antar programmet att man ska köra den utvidgade pingmetoden, annars den enkla.

import java.net.*;
import java.util.*;
import org.apache.xmlrpc.client.*;
import org.apache.xmlrpc.XmlRpcException;

public class PingBlog {
    public static void main(String[] args)
        throws MalformedURLException, XmlRpcException
    {
        XmlRpcClientConfigImpl conf = new XmlRpcClientConfigImpl();
        conf.setServerURL(new URL(args[0]));
        XmlRpcClient client = new XmlRpcClient();
        client.setConfig(conf);
        Object[] param = new Object[args.length - 1];
        for (int i = 1; i < args.length; ++i)
            param[i - 1] = args[i];
        Map result = (Map) client.execute(
            (param.length < 4 ?
             "weblogUpdates.ping" :
             "weblogUpdates.extendedPing"),
            param);
        Iterator it = result.entrySet().iterator();
        while (it.hasNext()) {
            Map.Entry e = (Map.Entry) it.next();
            System.out.println(e.getKey() + ": " + e.getValue());
        }
    }
}

Exempelvis kan det se ut så här om man har en blogg av den nyare typen hos Blogger och vill pinga Nyligen.se med den enkla pingen:
java PingBlog http://nyligen.se/ping/                                \
              'Tjoff?'                                               \
              http://gashplutzga.blogspot.com/

Eller med den utvidgade pingvarianten:
java PingBlog http://nyligen.se/ping/                                \
              'Tjoff?'                                               \
              http://gashplutzga.blogspot.com/                       \
              http://gashplutzga.blogspot.com/                       \
              http://gashplutzga.blogspot.com/feeds/posts/default    \
              ''

Den tomma strängen på slutet finns där på grund av att vissa pingservrar kräver att man har med en kategoriparameter till extendedPing, även om de tillåter att den är tom.

Om allt går bra med pingen skriver programmet ut flerror: false och eventuellt ett trevligt meddelande från pingservern. Blir det något fel på servern får man flerror: true och ett felmeddelande.

Uppdatering 2015: Det här med bloggpingande är nu en historisk kuriositet, men jag låter både detta inlägg och länkarna till Nyligen.se och Bloggar.se längst ner i gamla inlägg ligga kvar, för det historiska intressets skull, och länkarna verkar häpnadsväckande nog fortfarande fungera.

intressant? om pinga, Java bloggande


1 comments:

Anonym sa...

Jaha. Och nu gick min hjärna i stå.