úterý 29. července 2008

Transfer příspěvků z redakčního systému Nucleus CMS na Google Blogger

Kolega Martin, řečený Logout, pro GUG.CZ napsal následující příspěvek:

Provozuji web zabývající se osmibitovými počítači ZX Spectrum (www.1-2-8.net, momentálně mimo provoz - rekonstrukce) a donedávna jsme používali ke správě obsahu redakční systém Nucleus CMS. V poslední době ale již nešlo zvládat nápor spam-botů, pod některými články přibývaly i desítky spamových komentářů za den. Nucleus CMS neobsahuje žádnou ochranu proti spamu a tak bylo rozhodnuto přejít na Blogger.

Pět desítek článků se ale nikomu nechtělo přepisovat ani kopírovat metodou copy&paste. Proto jsem se začal zajímat o Google Blogger API a zjistil jsem, že překopírování příspěvků ze starého do nového je otázkou několika málo řádků v PHP. Vše jde v podstatě vyřešit velmi učebnicově, jen následováním dokumentace, která je k mání přímo na code.google.com.
Nejdříve je nezbytné nahrát třídy, které umožňují pracovat s Google API:

require_once "./Zend/Loader.php";
Zend_Loader::loadClass("Zend_Gdata");
Zend_Loader::loadClass("Zend_Gdata_Query");
Zend_Loader::loadClass("Zend_Gdata_ClientLogin");

Poté se můžeme přihlásit ke službě blogger:

$client = Zend_Gdata_ClientLogin::getHttpClient($user, $pass, $service);
$gdClient = new Zend_Gdata($client);

Kde proměnné user a pass obsahují jméno a heslo ke službě Blogger a proměnná service obsahuje název služby, tj. právě "blogger"

Další krok je stažení seznamu blogů a jejich ID nezbytných pro jejich identifikaci:

$query = new Zend_Gdata_Query("http://www.blogger.com/feeds/default/blogs");
$feed = $gdClient->getFeed($query);
foreach($feed->entries as $entry) {
$id = split("-", $entry->id->text);
print $entry->title->text." - ".$id[2]."
\n";
}

Když takto zjistíme, který blog že to vlastně chceme plnit, můžeme přímo přijít k akci. Z tabulky obsahující články v Nucleusu vybereme všechna data a každý řádek, který takto získáme odešleme do Bloggeru (v proměnné blogID se předpokládá ID blogu):

$uri = "http://www.blogger.com/feeds/" . $blogID . "/posts/default";
$entry = $gdClient->newEntry();
$query=MySQL_Query("select * from ncms_nucleus_item order by inumber desc");
while ($row=MySQL_Fetch_Assoc($query)) {
$entry->title = $gdClient->newTitle($row["ititle"]);
$entry->content = $gdClient->newContent($row["ibody"]."
".$row["imore"]);
$entry->content->setType('text');
$entry->published = $gdClient->newPublished(date("c", strtotime($row["itime"])));
$gdClient->insertEntry($entry, $uri);
print $entry->title;
}

To je celé. Výsledný skript samozřejmě lze udělat interaktivní, nebo pouze jednorázový, myslím, že uvedené části kódu by měly být plně postačující k pochopení toho, jak se k problému postavit.

Žádné komentáře: