Mostrando uma agenda do Google Calendar no seu site

Escrito em PHP. Pode ser usado no tema do seu WordPress. Requer CURL. Faz cache do calendário para não ter que baixá-lo sempre que alguém entra no seu site. Desenvolvido para um site que vai sair nos próximos dias. Use, modifique e distribua como quiser. (Não me responsabilizo por qualquer problema. Fiz pra um caso específico. A checagem de erros é meio porca.)

<?php
date_default_timezone_set('America/Sao_Paulo');
$events = Array();
$dom = new DOMDocument();

$file = "cached_calendar.xml";

$last = -1;
if (file_exists($file)) {
    $last = filemtime($file);
}
// Mude 3600 para o tempo (em segundos) que você quiser que o cache expire
if (time() - $last > 3600) {
    $fp = fopen($file, "w+");
    if (!$fp) {
        die();
    }
    // Substitua o e-mail do calendário do Google CodeJam pelo e-mail do seu calendário (público)
    $ch = curl_init("https://www.google.com/calendar/feeds/" .
      "google.com_jqv7qt9iifsaj94cuknckrabd8%40group.calendar.google.com/public/full");
    curl_setopt($ch, CURLOPT_TIMEOUT, 50);
    curl_setopt($ch, CURLOPT_FILE, $fp);
    curl_exec($ch);
    curl_close($ch);
    fclose($fp);
}

$dom->load($file);
$feed = $dom->getElementsByTagName("feed");
$entries = $feed->item(0)->getElementsByTagName("entry");
foreach ($entries as $entry) {
    $children = $entry->getElementsByTagName("*");
    $day = "";
    $start = "";
    $end = "";
    foreach ($children as $child) {
        switch ($child->tagName) {
        case "title":
            $title = $child->nodeValue;
            break;
        case "gd:when":
            if ($child->hasAttribute("startTime")) {
                $st = strtotime($child->getAttribute("startTime"));
                $time_to_sort = $st;
                $day = date_i18n("l, d/M", $st);
                $start = date("H:i", $st);
            }
            if ($child->hasAttribute("endTime")) {
                $et = strtotime($child->getAttribute("endTime"));
                $end = date("H:i", $et);
            }
            break;
        }
    }
    if ($title != "" && $day != "") {
        $events[] = Array(
            "time_to_sort" => $time_to_sort,
            "day" => $day,
            "start" => $start,
            "end" => $end,
            "title" => $title
        );
    }
}
function cmp($a, $b) {
    $a = $a["time_to_sort"];
    $b = $b["time_to_sort"];
    if ($a == $b) {
        return strcmp($a["title"], $b["title"]);
    }
    return ($a < $b) ? -1 : 1;
}
usort($events, "cmp");

$n = count($events);
if ($n > 0) {
    $lastDay = "";
    for ($i = 0; $i < $n; $i++) {
        $day = $events[$i]['day'];
        $title = $events[$i]['title'];
        $start = $events[$i]['start'];
        $end = $events[$i]['end'];
        if ($lastDay != $day) {
            if ($i != 0) {
                echo "</ul>\n\n";
            }
            echo "<h3 class="day"><span>$day</span></h3>\n";
            echo "<ul>\n";
          }
          echo "\t<li>\n";
            if ($start != "") {
                // Você pode modificar aqui para mostrar o horário de término ($end).
                echo "tt<span class="time">{$start}</span>\n";
            }
            echo "\t\t<strong>{$title}</strong>\n";
            echo "\t</li>\n";
          $lastDay = $day;
      }
      echo "</ul>\n";
} else {
    echo "<p>Nenhum evento cadastrado.</p>\n";
}
?>

Estatísticas estranhas

A linha verde é a quantidade de subscribers do feed desse blog, segundo o Feedburner. A linha azul é a quantidade de vezes que um artigo foi lido (ou clicado) por algum desses leitores.

Feed Stats Dashboard

Como vocês podem notar, antes de eu criar este blog o feed estava estabilizado em 100. Logo que eu criei a quantidade de leitores aumentou substancialmente até quase 200. De um dia pro outro, de repente, como se para me confundir criando uma parábola, a quantidade de leitores começou a diminuir muito. Agora chegou em 78 (menos que eu tinha antes de começar a escrever).

Alguém tem algum palpite para o que está havendo?

Fotolog.net Feed

[update] O script foi reescrito aqui e está muito mais interessante agora! :-) [/update]

Não sei se isso já não existe; Não sei se ninguém nunca sentiu falta. Afim de valorizar feeds RSS e acompanhar fotos de amigos, resolvi criar um feed para fotologs do Fotolog.net.

Eu disponibilizei o código aqui: ff.phps (infelizmente esse código foi perdido com o tempo) mas o script para uso coloquei no “meu servidor super-poderoso” na UNICAMP: ff.php (infelizmente esse arquivo foi perdido com o tempo), por um motivo óbvio: economia de banda. Só que os caras da UNICAMP devem excluir o meu usuário algum dia, por isso sugiro que você pegue o código e coloque no seu servidor. Só precisa ter fopen_wrappers (quem que já programou em PHP e nunca viu aquela mensagem no manual: Tip: You can use a URL as a filename with this function if the fopen wrappers have been enabled? :D )

Hmmm… Talvez esse código tenha algum bug. Não sei o porquê de nenhum dos meus feeds funcionarem no Google Reader. Quem tiver afim de corrigir, me manda o novo arquivo que arrumarei com enorme satisfação (e aproveita pra me ensinar onde foi que eu errei!). Além disso, tenho dúvidas sobre se a foto pode ser aberta de fora do Fotolog.net. No Bloglines, só consegui visualizar as fotos que eu já tinha no cache do navegador. Pra mim isso não faz muita diferença, já que eu gosto de feeds na barra de favoritos do Firefox.

Coisas legais que vi hoje

© 2005–2020 Tiago Madeira