Instagram-Feed mit RSS.app einbinden

Quell-ID: GitHub Discussion #35

Use Case

Instagram-Posts sollen auf der REDAXO-Website angezeigt werden.

Verwendete AddOns

  • Feeds

Problemstellung

Die direkte Instagram-Implementierung im Feeds-AddOn funktioniert nicht mehr aufgrund von API-Änderungen seitens Instagram/Meta.

Lösung

Als Workaround kann ein Dienst wie rss.app verwendet werden, um Instagram-Posts in einen RSS-Feed zu konvertieren. Dieser RSS-Feed kann dann vom Feeds-AddOn ausgelesen werden.

Schritt 1: RSS-Feed erstellen

  1. Auf rss.app registrieren
  2. Neuen Feed erstellen: “Create new feed from…”
  3. Instagram-Profil-URL eingeben
  4. RSS-Feed-URL kopieren

Schritt 2: Feed in REDAXO einrichten

  1. Im Backend zu “Feeds” navigieren
  2. Neuen Stream anlegen
  3. Typ: “RSS Feed”
  4. URL: Die RSS-Feed-URL von rss.app einfügen

Schritt 3: Feed im Frontend ausgeben

<?php
$stream = rex_feed::getStream('instagram');
$items = $stream->getItems();

foreach ($items as $item) {
    echo '<div class="instagram-post">';
    echo '<img src="' . $item->getMedia() . '" alt="">';
    echo '<p>' . $item->getContent() . '</p>';
    echo '</div>';
}

Alternative Dienste

Dienst Beschreibung Preis
rss.app Instagram zu RSS Freemium
Zapier Automation-Plattform Freemium
IFTTT Einfache Automatisierung Free
Later Social Media Management Kostenpflichtig

Besserer Ansatz: Instagram Graph API

Für professionelle Anwendungen empfiehlt sich die direkte Nutzung der Instagram Graph API:

Voraussetzungen

  1. Facebook Developer Account
  2. Instagram Business oder Creator Account
  3. Facebook Page mit verknüpftem Instagram

API-Zugriff

<?php
class InstagramFeed
{
    private string $accessToken;
    private string $userId;
    
    public function __construct(string $accessToken, string $userId)
    {
        $this->accessToken = $accessToken;
        $this->userId = $userId;
    }
    
    public function getMedia(int $limit = 10): array
    {
        $url = sprintf(
            'https://graph.instagram.com/%s/media?fields=id,caption,media_type,media_url,permalink,timestamp&limit=%d&access_token=%s',
            $this->userId,
            $limit,
            $this->accessToken
        );
        
        $response = rex_socket::factoryUrl($url)->doGet();
        
        if ($response->isOk()) {
            $data = json_decode($response->getBody(), true);
            return $data['data'] ?? [];
        }
        
        return [];
    }
}

// Verwendung
$instagram = new InstagramFeed(
    rex_config::get('project', 'instagram_token'),
    rex_config::get('project', 'instagram_user_id')
);

$posts = $instagram->getMedia(6);

foreach ($posts as $post) {
    echo '<a href="' . $post['permalink'] . '">';
    echo '<img src="' . $post['media_url'] . '" alt="">';
    echo '</a>';
}

Token-Refresh (Cronjob)

Instagram-Tokens laufen nach 60 Tagen ab und müssen erneuert werden:

<?php
// Als Cronjob einrichten
class InstagramTokenRefresh
{
    public static function execute(): bool
    {
        $token = rex_config::get('project', 'instagram_token');
        
        $url = sprintf(
            'https://graph.instagram.com/refresh_access_token?grant_type=ig_refresh_token&access_token=%s',
            $token
        );
        
        $response = rex_socket::factoryUrl($url)->doGet();
        
        if ($response->isOk()) {
            $data = json_decode($response->getBody(), true);
            if (isset($data['access_token'])) {
                rex_config::set('project', 'instagram_token', $data['access_token']);
                return true;
            }
        }
        
        return false;
    }
}

Hinweis

Die Instagram API ändert sich regelmäßig. Es empfiehlt sich, die offizielle Dokumentation zu konsultieren und einen Fallback-Mechanismus zu implementieren.