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
Adam Hošek #1
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 :).
Bohdan #2
Pro ty, kdo radši přidávají události jednotlivě (a používají Chrome)
https://web.archive.org/…pifecokinjof
Michal #3
Akorát mi to posunulo časy. Na facebooku mám 10:00 a v google calendar 11:00 ☹
David Grudl #4
#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…Martin #5
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
Michal #6
#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.
David Grudl #7
Přidal jsem do kódu ještě jeden filtr, který časový bug opravuje.
Michal #8
#7 Davide Grudle, Supr, ozkoušel jsem a šlape to krásně. Díky.
Tomas #9
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.
Vašek Purchart #10
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
by mohla vypadat cca takto:
David Grudl #11
#10 Vašku Purcharte, díky za tip, upravil jsem podle něj kód, aby byl kompatibilní s PHP 5.2.
Martin #12
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é).
Tento článek byl uzavřen. Už není možné k němu přidávat komentáře.