Pingbackin integrointi blogiin: palvelinpuolen koodi

04.12.10 17:19 | ohjelmointi | Ei kommentteja

Kirjoitin aikaisemmin asiakaspuolen koodista, joten nyt vuorossa palvelinpuoli. Suosittelen lukemaan ensin tekstin asiakaspuolen koodista, niin tämä koodi aukeaa helpommin.

Aluksi krediitit alkuperäisen version kirjoittajalle, joka on ystävällisesti tarjonnut oman näkemyksensä aiheesta kaikkien nähtäville. Toteutukseni on suurimmilta osin samanlainen, mutta olen poistanut virheiden tallennuksen sekä selkeyttänyt koodia, poistanut joitakin osioita sekä korvannut muutamia ratkaisuja omillani.

Ensimmäiseksi asetetaan dokumentin header-tiedot oikeiksi, koska kyseessä on XML. Tämän lisäksi sisällytetään xmlrpc.inc- sekä xmlrpcs.inc-tiedostot (XML-RPC for PHP) ja yhdistetään tietokantaan (tässä tapauksessa MySQL).

header("Content-Type: application/xml");

// alkuun sisällytetään tiedostot xmlrpc.inc ja xmlrpcs.inc sekä mahdolliset tiedostot, joissa yhdistetään tietokantaan

include ("lib/xmlrpc.inc");
include (
"lib/xmlrpcs.inc");

Muodostetaan funktio ping(), joka käsittelee pingback-pyynnön. URLit, jotka on lähetetty pingbackin mukana, siirretään niitä kuvaaviin muuttujiin.

// Pingbackin mukana tulee kaksi urlia.

$param1 = $params->getParam(0);
$param2 = $params->getParam(1);
$sourceURI = $param1->scalarval();
$targetURI = $param2->scalarval();

Tämän jälkeen on tarkistettava muutamia asioita molemmin osoitteista. Se on suositeltua Pingback 1.0 -spesifikaation mukaan. Siispä (palvelimen vastaukset ova englanniksi, koska en näe järkeä suomentaa niitä):

Koko XMLRPC-palvelimen koodi

1. Tarkistetaan, että LähdeURI (sourceURI) sisältää linkin kohdeURIiin (targetURI).

$fileContents = fread($file,100000);

// Tarkistetaan, onko linkitetty sääntöjen mukaan.

if(!strstr($fileContents, preg_replace("/&(amp;)?/i","&",$targetURI))) {

// Ei validia linkkiä.

if(!strstr($fileContents, str_replace("&","&",$targetURI))) {

// Ei epävalidia linkkiä.

$error = "Source URI (".$sourceURI.") does not contain a link to the target URI (".$targetURI.")";
return new
xmlrpcresp(0, 0x0011, $error);
}
}

2. Tarkistetaan molempien osoitteiden olemassaolo.

if(!$file) {

// Sivua, josta linkitetään, ei löydy.

$error = "Source URI (".$sourceURI.") does not exist (target URI was ".$targetURI.")";
return new
xmlrpcresp(0, 0x0010, $error);
}

// Tarkistetaan linkin osoittaman blogitekstin olemassaolo.

@$headers = get_headers($targetURI);

if (!
preg_match('/^HTTP\/\d\.\d\s+(200|301|302)/', $headers[0])){

// Blogitekstiä ei löydy.

$error = "Specified target URI (".$targetURI.") does not exist (source URI was ".$sourceURI.")";

return new
xmlrpcresp(0, 0x0020, $error);
}

3. Tarkistetaan, ettei kyseistä pingbackia ole jo tallennettu aikaisemmin.

// Tarkistetaan, onko olemassa jo vastaava pingback.

$query = "SELECT COUNT(*) AS number FROM pingbacks WHERE source = '".preg_replace("/&(amp;)?/i","&",$sourceURI)."' AND target = '".preg_replace("/&(amp;)?/i","&",$targetURI)."'";
$tupla = mysql_query($query) or die("Virhe.");
$tuplab = mysql_fetch_array($tupla);

if(
$tuplab['number'] > 0) {

// Samaa pingbackia ei voi lähettää useasti.

$error = "The pingback from ".$sourceURI." to ".$targetURI." has already been registered";
return new
xmlrpcresp(0, 0x0030, $error);
}

4. Tallennetaan pingback tietokantaan ja julkaistaan se.

$titleb = mysql_real_escape_string($title);

$query = "INSERT INTO pingbacks (tyyppi, aika, source, target, title) VALUES ('Pingback', NOW(), '".preg_replace("/&(amp;)?/i","&",$sourceURI)."', '".preg_replace("/&(amp;)?/i","&",$targetURI)."', '$titleb')";
mysql_query($query) or die("Virhe.");

// Pingback tallennettu onnistuneesti.

$error = "Thanks! Pingback saved  from ".$sourceURI." to ".$targetURI.". ";
return new
xmlrpcresp(new xmlrpcval($error, "string"));
}

Jos jokin ehto ei täyty, palvelin palauttaa vastaavan virhekoodin.

Näiden lisäksi haetaan lähdeURIn otsikko ja tallennetaan se tietokantaan mukavan linkin muodostamiseksi:

// Haetaan sivun otsikko (siis title).

if(preg_match("/<title>([^<]*)<\/title>/i",$fileContents,$matches)) 
{
$title = $matches[1];
} else 
{
$title = '';
}

Eiköhän se ollut siinä. Mikäli kysyttävää, kysykää.


Kommentti
WWW-osoitteet muutetaan linkeiksi automaattisesti. Toimivat tagit: [b][/b], [i][/i] ja [quote=kirjoittajan_nimi] lainaus [/quote]

Paluuviitteet ja kommentit

Ei paluuviitteitä.
Ei kommentteja.