Contao News Facebook Sync

inspiredminds/contao-news-facebook

von INSPIRED MINDS

Projekt Webseite unter Contao News Facebook Sync

Mit dieser Extension können automatisch Posts von Facebook Pages (oder Gruppen) als Nachrichten in Nachrichtenarchive importiert werden. Es können außerdem automatisch Nachrichten auf Facebook Seiten gepostet werden. Dadurch ist es möglich, ein Nachrichtenarchiv mit einer Facebook Seite synchron zu halten.

Installation

Um diese Erweiterung zu installieren, muss zuerst die composer.json der eigenen Contao Installation modifiziert werden. Dabei sind zwei Anpassungen notwendig: das private Repository hinzufügen und die Abhängigkeit hinzufügen.

Um das Repository hinzuzufügen, muss folgendes in der composer.json eingefügt werden:

{
    "repositories": [
        {
            "type": "composer",
            "url": "https://<YOUR_USERNAME>:<YOUR_TOKEN>@packeton.inspiredminds.at"
        }
    ]
}

<YOUR_USERNAME> und <YOUR_TOKEN> muss mit den Informationen ersetzt werden, welche von INSPIRED MINDS geschickt wurden.

Um die Abhängigkeit hinzuzufügen, muss folgendes in der composer.json eingefügt werden:

{
    "require": {
        "inspiredminds/contao-news-facebook": "^9.0"
    }
}
Komplettes Beispiel anzeigen
{
    "name": "contao/managed-edition",
    "type": "project",
    "description": "Contao Open Source CMS",
    "license": "LGPL-3.0-or-later",
    "authors": [
        {
            "name": "Leo Feyer",
            "homepage": "https://github.com/leofeyer"
        }
    ],
    "require": {
        "contao/conflicts": "@dev",
        "contao/manager-bundle": "5.3.*",
        "inspiredminds/contao-news-facebook": "^9.0"
    },
    "conflict": {
        "contao-components/installer": "<1.3"
    },
    "extra": {
        "contao-component-dir": "assets",
    },
    "scripts": {
        "post-install-cmd": [
            "@php vendor/bin/contao-setup"
        ],
        "post-update-cmd": [
            "@php vendor/bin/contao-setup"
        ]
    },
    "repositories": [
        {
            "type": "composer",
            "url": "https://<YOUR_USERNAME>:<YOUR_TOKEN>@packeton.inspiredminds.at"
        }
    ]
}

Nachdem diese Änderungen gemacht wurden, kann nun ein composer update auf der Kommandozeile oder eine Paketaktualisierung im Contao Manager durchgeführt werden. Danach wie gewohnt die Datenbank aktualisieren.

Konfiguration

Facebook App anlegen

Zuerst muss eine sogenannte »Facebook App« erzeugt werden. Die Details dieser App werden dann für die Konfiguration im Backend benötigt.

Tipp

Dieser Schritt kann übersprungen werden, wenn deine Facebook Page nicht mit einem Meta Business Account assoziiert ist. In diesem Fall bringt die Extension ihre eigene Facebook App mit, welche die nötigen Berechtigungen hat.

Facebook erlaubt den Zugriff zu Facebook Pages, die mit einem Meta Business Account verbunden sind, nicht mehr ohne der business_management Berechtigung. Die integrierte Facebook App hat diese Berechtigung nicht von Facebook erhalten.

  1. Gehe zuerst zu developers.facebook.com. Wenn noch kein Facebook Developer Account existiert, muss nun einer angelegt werden (bzw. der Developer Account muss für einen existierenden Facebook Benutzer freigeschalten werden).
  2. Unter Meine Apps auf App erstellen klicken.
  3. Einen Namen für die App unter Name der App eingeben (z. B. der Titel der Webseite) und eine Kontakt-E-Mail-Adresse der App angeben.
  4. Auf der nächsten Seite können Anwendungsfälle zur App hinzugefügt werden. Wähle ganz unten Sonstiges aus.
  5. Auf der nächsten Seite muss ein App-Typ ausgewählt werden. Wähle dort Business aus.
  6. Auf der nächsten Seite dann App erstellen klicken.
  7. Danach können »Produkte« zur App hinzugefügt werden. Klicke weiter unten bei Facebook Login for Business auf Einrichten.
  8. Unter Client-OAuth-Einstellungen bei Gültige OAuth Redirect URIs muss folgende URL eingegeben werden: https://example.org/_facebook/callback. Ersetze example.org mit der Domain deiner Website. Dann Änderungen speichern.
Anmerkung

Der Facebook Account, unter dem man die App anlegt, muss die Berechtigung haben, auf der timeline der jeweiligen Facebook Page, mit der synchronisiert werden soll, Posts machen zu dürfen (dies ist optional, wenn nur Posts von der Page in das Nachrichtenarchiv geholt werden sollen). Alternativ können aber auch weitere Administratoren oder Developer zur Facebook App unter Rollen hinzugefügt werden.

App ID und App Secret in Contao konfigurieren

Tipp

Dieser Schritt kann übersprungen werden, wenn die intern zur Verfügung gestellte Facebook App benutzt wird.

Gehen zu App-Einstellungen » Allgemeines in der Facebook App. Kopiere die App-ID und das App-Secret und konfiguriere es in deiner config/config.yaml:

# config/config.yaml
contao_news_facebook:
    app_id: '123456789123456'
    app_secret: 'abc123abc123abc123abc123abc123ab'

Für geheime Daten wie diese ist es allerdings empfohlen sie nicht direkt in der config.yaml zu speichern, wodurch diese Daten möglicherweise im Git-Repository deines Projektes landen. Stattdessen solltest du Umgebungsvariablen nutzen:

# .env
# Leere Standardwerte anlegen
FACEBOOK_APP_ID=
FACEBOOK_APP_SECRET=
# .env.local
# Die eigentlichen Werte setzen
FACEBOOK_APP_ID=123456789123456
FACEBOOK_APP_SECRET=abc123abc123abc123abc123abc123ab
# config/config.yaml
# Die Umgebungsvariablen referenzieren
contao_news_facebook:
    app_id: '%env(FACEBOOK_APP_ID)%'
    app_secret: '%env(FACEBOOK_APP_SECRET)%'

Contao Nachrichtenarchiv konfigurieren

Öffne die Einstellungen deines Nachrichtenarchivs. In der Sektion Facebook sync kann der Facebook sync aktiviert werden. Danach kann die numerische ID der Facebook Page eingegeben werden, mit der das Nachrichtenarchiv synchronisiert werden soll. Wenn automatisch Facebook Page Posts als Nachrichtenbeiträge angelegt werden sollen, dann muss die Einstellung Page Posts holen aktiviert werden. Optional kann auch ein Page Post Datum Limit eingestellt werden.

Dasselbe kann auch für eine Facebook Gruppe gemacht werden, wenn Posts dieser Gruppe zum Nachrichtenarchiv importiert werden sollen. Allerdings können keine Nachrichtenbeiträge automatisch in Gruppen gepostet werden.

Nun muss ein Access Token von Facebook geholt werden. Dazu kann die Facebook connect Schaltfläche benutzt werden. Dadurch wird man bei Facebook eingeloggt und es werden Berechtigungen für den eingeloggten Facebook Benutzer angefordert. Nachdem dies bestätigt wurde, wird ein sogenannter »Long Term Access Token« von Facebook geholt.

Anmerkung

Falls Nachrichtenbeiträge automatisch auf der Facebook Page gepostet werden sollen, dann muss in diesem Prozess erlaubt werden, dass die Facebook App öffentliche Posts in deinem Namen machen darf. Der Facebook Account, mit dem man sich hier anmeldet, muss außerdem die Berechtigung haben, Posts auf der Timeline der jeweiligen Facebook Page posten zu dürfen.

Nachrichtenarchiv Einstellungen Nachrichtenarchiv Einstellungen

Heruntergeladene Bilder werden im eingestellten Ordner gespeichert (Standard: files/facebook_images). Dieser Ordner muss in Contao 4 veröffentlicht werden!

Zusätzliche Einstellungen

Seit Version 3.0.0 können folgende Einstellungen in den Systemeinstellungen von Contao unter Facebook Sync getroffen werden:

Keine OpenGraph Meta Tags: seit Version 3.0.0 der Extension wird automatisch ein og:image meta Tag im <head> eingefügt, wenn ein Nachrichtenartikel verarbeitet wird, damit das Teaserbild auch auf Facebook automatisch ausgegeben wird, wenn der Link zu der Nachricht geteilt wird. Mit dieser Einstellung kann dies deaktiviert werden.

Als Fotos posten: seit Version 3.0.0 werden Nachrichtenbeiträge nicht mehr automatisch als Fotos gepostet, wenn der Nachrichtenbeitrag ein Teaserbild hat. Mit der Einstellung kann dies wieder aktiviert werden.

Backend Einstellungen Backend Einstellungen

Falls kein Hook benutzt wird, kann die Standard Überschriftenlänge folgendermaßen geändert werden:

# config/config.yaml
contao_news_facebook:
    headline_length: 64

Benutzung

Facebook Page/Group Posts holen

Sobald das Nachrichtenarchiv konfiguriert ist und die Page Posts holen bzw. Group Posts holen Option aktiv ist, überprüft die Erweiterung stündlich auf neue Facebook Posts über den Cronjob von Contao.

Facebook Posts veröffentlichen

Contao Nachrichtenbeiträge werden auf Facebook unter zwei Bedingungen veröffentlicht:

  • In den Einstellungen der jeweiligen Nachricht wurde unter der Facebook sync Sektion die Einstellung Auf Facebook Page posten aktiviert.
  • Der Nachrichtenbeitrag wurde veröffentlicht.

In den Einstellungen der Nachricht kann außerdem ein abweichender Text für den Facebook Post angegeben werden. Andernfalls wird der Teaser Text benutzt.

Die Erweiterung überprüft minütlich auf neue Nachrichten, die auf Facebook veröffentlicht werden sollen.

Nachrichten Einstellungen Nachrichten Einstellungen

Synchronisation manuell auslösen

Es gibt eine Schaltfläche zur manuellen Auslösung der Synchronisation im Backend. Oben bei den globalen Operationen für Nachrichtenarchive.

Globale Operationen für Nachrichtenarchive Globale Operationen für Nachrichtenarchive

Hooks

Die Extension stellt einige Hooks zur Verfügung, welche das Verhalten beeinflussen können, wenn zu Facebook gepostet, oder ein Post von Facebook zu Contao geholt wird.

processFacebookPost

Die Erweiterung prozessiert einen Facebook-Post und versucht diesen zu einem passenden Contao Nachrichtenbeitrag umzuwandeln. Dieser Prozess kann mit dem processFacebookPost selbst angepasst werden. Als Rückgabewert wird ein Array erwartet, mit den finalen Daten für den Datenbankeintrag eines Nachrichtenbeitrags. Wenn der Rückgabewert false ist, wird kein Nachrichtenbeitrag erzeugt.

Parameter

  1. array $arrData Die bereits prozessierten Daten, die für den Nachrichtenbeitrag benutzt werden.
  2. object $objPost Die originalen Daten des Posts von Facebook.
  3. object $objArchive Das Newsarchiv Objekt.

changeFacebookMessage

Wenn ein Contao Nachrichtenbeitrag als Facebook Post vorbereitet wird, wird entweder der Teaser oder der bei der Nachricht angegebene Text verwendet. Falls aber automatisch dieser Text angepasst werden soll, kann dies mit dem changeFacebookMessage Hook gemacht werden. Als Rückgabewert wird der finale Text erwartet.

Parameter

  1. string $message Die bereits vorgefertigte Nachricht.
  2. object $objArticle Der originale Contao Nachrichtenbeitrag.
  3. object $objArchive Das Newsarchiv Objekt.

Beispiel

Das folgende Beispiel implementiert einen Hook, der die URL zum Nachrichtenbeitrag an den Text des Facebook-Posts anhängt:

// src/EventListener/ChangeFacebookMessageListener.php
namespace App\EventListener;

use Contao\CoreBundle\DependencyInjection\Attribute\AsHook;
use Contao\CoreBundle\Routing\ContentUrlGenerator;
use Contao\NewsArchiveModel;
use Contao\NewsModel;
use Symfony\Component\Routing\Generator\UrlGeneratorInterface;

#[AsHook('changeFacebookMessage')]
class ChangeFacebookMessageListener
{
    public function __construct(private readonly ContentUrlGenerator $contentUrlGenerator)
    {
    }

    public function __invoke(string $message, NewsModel $news, NewsArchiveModel $archive): string
    {
        // Append the URL to photo posts
        if ($news->addImage && $news->fbPostAsPhoto) {
            $message .= "\n\n".$this->contentUrlGenerator->generate($news, [], UrlGeneratorInterface::ABSOLUTE_URL);
        }

        return $message;
    }
}

Template Daten

In den Nachrichtentemplates stehen zusätzliche Daten zur Verfügung:

  • object fbData Die originalen Daten des Posts von Facebook.
  • string fbPostId Die Facebook ID des verknüpften Facebook Posts.
  • char fromFb Gibt an, ob der Nachrichtenbeitrag ursprünglich von Facebook importiert wurde.