Na navigaci | Klávesové zkratky

Translate to English… Ins Deutsche übersetzen…

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 http://mamuf.cz #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 5 lety
  2. Bohdan #2

    avatar

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

    https://chrome.google.com/…pifecokinjof

    před 5 lety
  3. Michal http://www.cernobila.com #3

    avatar

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

    před 5 lety | reagoval [4] David Grudl
  4. David Grudl http://davidgrudl.com #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 5 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 5 lety
  6. Michal http://www.cernobila.com #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 5 lety
  7. David Grudl http://davidgrudl.com #7

    avatar

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

    před 5 lety | reagoval [8] Michal
  8. Michal http://www.cernobila.com #8

    avatar

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

    před 5 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 5 lety
  10. Vašek Purchart http://https://twitter.com/#!/VasekPurchart #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 5 lety | reagoval [11] David Grudl
  11. David Grudl http://davidgrudl.com #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 5 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 5 lety

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