Analise informações de uma quantidade ilimitada de blogs do Tumblr – PHP

Digamos, por exemplo, que queremos um front end para refletir o de um tema do Tumblr. Apenas por uma variedade de razões, gostaríamos de obter conteúdo de uma quantidade dinâmica e ilimitada de contas do Tumblr.

Tudo feito aqui é razoavelmente padrão no que diz respeito à análise XML e conexões MySQL. Basicamente, estamos pegando o URL de cada conta do Tumblr, acessando e armazenando as informações de 20 postagens da conta inteira de cada vez e indo para o próximo URL. Há alguma ação de loop muito atraente acontecendo aqui.

Apenas as postagens de fotos são armazenadas neste exemplo, que inclui a imagem principal, miniatura de 400×400, legenda e tags associadas. Além disso, antes de cada inserção de banco de dados, há uma verificação para evitar linhas duplicadas.

O código é um pouco longo – eu recomendaria C & P’ing em seu editor de texto favorito para dar uma olhada. Não me preocupei em separá-lo, pois pessoalmente aprecio os exemplos de código em sua totalidade, e já foi comentado internamente.

PHP

<?php
/*
db info

===============================================

make sure the following tablenames exist with the following columns:

tablename - columnname[type], ...


tumblr - id[int11, primary, autoincrement], thumbnail[varchar255], image[varchar255], caption[varchar255], tags[varchar255]

===============================================

*/


$hostname
= 'localhost';
$dbname
= 'name';
$user
= 'user';
$pass
= 'pass';

/*
tumblr urls

===============================================

tumblr urls must go here using urls[x] array convention (in order from 0-x),

along with the following post vars:


urls[x] = http://username.tumblr.com/

===============================================

*/


$urls
[0] = "http://username1.tumblr.com/";
$urls
[1] = "http://username2.tumblr.com";
$urls
[2] = "http://username3.tumblr.com/";

/*
===============================================

Let's begin

===============================================

*/



ini_set
("user_agent","Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)");
mysql_connect
($hostname,$user,$pass);
@mysql_select_db($dbname) or die("Unable to select table");

$count
= 0;
// resulting append looks like this: '/api/read/?num=20&type=photo'
$api
= '/api/read/';
$num
= '?num=20';
$phototype
= '&type=photo';
$start
= '&start=';

$startvar
= 0;
$realstart
= $startvar;
$finish
= 0;

//iterate through all of the tumblr url's given
foreach ($urls as $url) {

//if '/' is at the end of url, clean it off
if ((strripos($url, '/')) == ((strlen(utf8_decode($url))) - 1)) { $url = substr_replace($url ,"",-1); }

while ($finish == 0) {
$urly
= $url . $api . $num . $phototype . $start . $startvar;
$xml
[$count] = simplexml_load_file($urly);

//array of all posts
$posts
= $xml[$count]->posts;
$thumbnail
= $posts->post[1]->{'photo-url'}[2];

//for each post
for ($i = 0; $i < count($posts->post); $i++) {
$thumbnail
= $posts->post[$i]->{'photo-url'}[2];
$image
= $posts->post[$i]->{'photo-url'}[0];
$caption
= $posts->post[$i]->{'photo-caption'};

$tag_temp
= $posts->post[$i]->{'tag'};
$tags
= NULL;
foreach ($tag_temp as $tag) {
$tags
.= $tag . ', ';
}

//We can't have any duplicates in our db, can we
$duplicate
= mysql_num_rows(mysql_query("SELECT * FROM tumblr WHERE thumbnail='$thumbnail'"));

if ($duplicate == 0) {
mysql_query
("INSERT INTO tumblr VALUES ('','$thumbnail','$image','$caption','$tags')");
}
}

//if the thumbnail is empty, we must be finished. Let's exit the while loop and move onto the next url!
if ($thumbnail == '') {
$finish
= 1;
}

//this will help us grab 20 posts at a time.
$startvar
= $startvar + 20;
}
//reset things up
$finish
= 0;
$startvar
= $realstart;
$count
++;
}

mysql_close
();

?>

DEMO
http://codepad.viper-7.com/ZEsoMO

Lembre-se de que, como se trata de uma demonstração, ele foi modificado para não usar o MySQL (ele apenas mostra tudo para você ver). Além disso, pode levar até 20 segundos para ser executado, pois há um pouco de ação de análise em andamento.

Se alguém tiver dúvidas (e críticas), me avise!