Na navigaci | Klávesové zkratky

Export z Facebooku do Google Calendar

Jak vyexportovat události z Facebooku do Google Calendar, aby vše fungovalo dobře?

Otevřete si Facebook a klikněte na „Události“. Adresa s exportem událostí ve formátu iCalendar je trošku nečekaně ukrytá pod ikonkou lupy:

Adresu si zkopírujte do schránky:

Odkaz bychom mohli hned dát to Google kalendáře, ale narazili bychom na několik nedostatků. Google nedokáže korektně zobrazit neveřejnou událost, místo ní uvidíte pouze nicneříkající slovo „nedostupný“:

Google nedokáže ani filtrovat události podle toho, zda jsme potvrdili účast. Takže kalendář se nám plní nejen událostmi, na které jsme účast potvrdili, ale i těmi, na které nás někdo zatím jen pozval. Navíc u událostí v letním čase uvádí o hodinu více.

Vše lze vyřešit jednoduchým filtrem facebookfilter.php, který si umístěte na server:

// load events from Facebook
$s = file_get_contents("http://www.facebook.com/ical/u.php?$_SERVER[QUERY_STRING]");

// PREG requires \n line breaks
$s = str_replace("\r\n", "\n", $s);


// fix private events bug in Google Calendar
$s = str_replace('CLASS:PRIVATE', 'CLASS:PUBLIC', $s);


// remove unconfirmed events
function filterEvents($m) {
	return strpos($m[0], 'PARTSTAT:NEEDS-ACTION') ? '' : $m[0];
}
$s = preg_replace_callback('#^BEGIN:VEVENT\n(.*?)^END:VEVENT\n#sm', 'filterEvents', $s);


// fix daylight savings bug in Google Calendar
function fixTime($m) {
	$zone = new DateTimeZone('Europe/Prague');
	$time = new DateTime($m[2], new DateTimeZone('UTC'));
	$fix = $zone->getOffset($time) - $zone->getOffset(new DateTime('20000101', $zone));
	$time->modify("-$fix seconds");
	return $m[1] . $time->format('Ymd\THis\Z');
}
$s = preg_replace_callback('#^(DTSTART:|DTEND:)(.+)#m', 'fixTime', $s);


// revert line breaks back
$s = str_replace("\n", "\r\n", $s);

header('Content-Type: text/calendar; charset=utf-8');
echo $s;

Do Google kalendáře přidáme adresu našeho filtru se stejnými parametry v URL, jako měl původní skript od Facebooku:

A je to!

Komentáře

  1. Adam Hošek #1

    avatar

    Díky!

    Jen drobná vada: můj webhosting má PHP 5.2.17 a to zřejmě neumí tu vloženou funkci ve volání preg_replace_callback. Stačilo ji tedy definovat vně a předat její jméno. To jen tak na okraj :).

    před 12 lety
  2. Bohdan #2

    avatar

    Pro ty, kdo radši přidávají události jednotlivě (a používají Chrome)

    https://web.archive.org/…pifecokinjof

    před 12 lety
  3. Michal #3

    avatar

    Akorát mi to posunulo časy. Na facebooku mám 10:00 a v google calendar 11:00 ☹

    před 12 lety | reagoval [4] David Grudl
  4. David Grudl #4

    avatar

    #3 Michale, to je zvláštní, data ve formátu iCalendar se zapisují v UTC formátu, takže hodinový posun kvůli časové zóně by vzniknout neměl. Zkus se podívat, kde k chybě dochází, tj. jestli jsou správná data už z Facebooku. Možná by mohlo pomoci header_remove('Date') za příkazem header(), nevím…

    před 12 lety | reagoval [6] Michal
  5. Martin #5

    avatar

    Taky mám problém s časy některých akcí a myslím, že za to může tato položka ve vlastnostech kalendáře v google calendaru:
    Časové pásmo kalendáře: (GMT+00:00) GMT (bez letního času)
    bohužel nejde změnit a nebo nevím jak

    před 12 lety
  6. Michal #6

    avatar

    #4 Davide Grudle, ano, je to tím, že ta událost, kterou mi to natáhlo, a která má na facebooku čas 10:00 je až 14. dubna, což je až po posunu času na letní čas. Google kalendář byl chytrý, že to o hodinu posunul, dokonce i správným směrem, což je ale samozřejmě špatně ? Nevím, jak bych to opravil a tak se spokojím s tím, že kolem změny času je to ±hodina.

    před 12 lety
  7. David Grudl #7

    avatar

    Přidal jsem do kódu ještě jeden filtr, který časový bug opravuje.

    před 12 lety | reagoval [8] Michal
  8. Michal #8

    avatar

    #7 Davide Grudle, Supr, ozkoušel jsem a šlape to krásně. Díky.

    před 12 lety
  9. Tomas #9

    avatar

    Neviete niekto, ako na export eventov vytvorených v rámci Fan Page? V novej Timeline verzii link na export chýba, alebo mi niečo uniká? Díky.

    před 12 lety
  10. Vašek Purchart #10

    avatar

    Na hostmonsteru, kam jsem to chtěl šoupnout mám taky 5.2.17, takže jsem narazil na podobné problémy. Kromě toho ještě na to, že třída DateInverval je dostupná až od php 5.3. Jestli jsem to správně pochopil, tak by alternativa pro

    $time->sub(new DateInterval('PT' . ($zone->getOffset($time) - $fix) . 'S'));

    by mohla vypadat cca takto:

    $time->modify('-' . ($zone->getOffset($time) - $fix) . ' seconds');
    před 12 lety | reagoval [11] David Grudl
  11. David Grudl #11

    avatar

    #10 Vašku Purcharte, díky za tip, upravil jsem podle něj kód, aby byl kompatibilní s PHP 5.2.

    před 12 lety
  12. Martin #12

    avatar

    Ten letní čas dělá bordel obecně i na webu FB – teď se mi posunul začátek u jedné akce (v zimním čase založené a letním konané).

    před 12 lety

Tento článek byl uzavřen. Už není možné k němu přidávat komentáře.


phpFashion © 2004, 2024 David Grudl | o blogu

Ukázky zdrojových kódů smíte používat s uvedením autora a URL tohoto webu bez dalších omezení.