PDO::ERRMODE_EXCEPTION, PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC, ]; try { $pdo = new PDO($dsn, $user, $pass, $options); } catch (PDOException $e) { echo "Datenbankverbindung fehlgeschlagen: " . $e->getMessage(); exit; } // Bearer-Token für den Mastodon API-Aufruf (bitte anpassen) $bearerToken = '99jJEXMrMPSGKyg0wp-OrGJ-5s38XPLlE0lmNmv6QSI'; // Alle Hashtags aus der Tabelle abrufen $stmt = $pdo->query("SELECT hashtag, hashtag_id FROM hashtags WHERE active = 1;"); $hashtags = $stmt->fetchAll(); if (!$hashtags) { echo "Keine Hashtags gefunden.\n"; exit; } // Bereite SQL-Statements vor: // Statement zum Überprüfen, ob ein Eintrag existiert $checkStmt = $pdo->prepare("SELECT COUNT(*) as count FROM findings WHERE hashtag_id = :hashtag_id AND post_id = :post_id"); // Statement zum Einfügen eines neuen Eintrags $insertStmt = $pdo->prepare("INSERT INTO findings ( hashtag_id, post_id, created_at, in_reply_to_id, replies_count, reblogs_count, favorites_count, acc_id, username, acct ) VALUES ( :hashtag_id, :post_id, :created_at, :in_reply_to_id, :replies_count, :reblogs_count, :favorites_count, :acc_id, :username, :acct )"); // Statement zum Aktualisieren eines bestehenden Eintrags $updateStmt = $pdo->prepare("UPDATE findings SET created_at = :created_at, in_reply_to_id = :in_reply_to_id, replies_count = :replies_count, reblogs_count = :reblogs_count, favorites_count = :favorites_count, acc_id = :acc_id, username = :username, acct = :acct WHERE hashtag_id = :hashtag_id AND post_id = :post_id"); // Für jeden Hashtag den Mastodon API-Aufruf tätigen foreach ($hashtags as $row) { $hashtag = $row['hashtag']; $hashtag_id = $row['hashtag_id']; echo "Verarbeite Hashtag '$hashtag' (ID: $hashtag_id)...\n"; // Baue den API-URL: Beispiel: https://mastodon.social/api/v1/timelines/tag/fashionforwardvienna $apiUrl = "https://mastodon.social/api/v1/timelines/tag/" . urlencode($hashtag); // cURL initialisieren $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $apiUrl); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_HTTPHEADER, [ "Authorization: Bearer $bearerToken" ]); $response = curl_exec($ch); if (curl_errno($ch)) { echo "cURL-Fehler für Hashtag $hashtag: " . curl_error($ch) . "\n"; curl_close($ch); continue; } $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE); curl_close($ch); if ($httpCode != 200) { echo "API-Aufruf für Hashtag $hashtag lieferte HTTP-Code $httpCode\n"; continue; } $data = json_decode($response, true); if (!$data) { echo "Fehler beim Dekodieren des JSON für Hashtag $hashtag.\n"; continue; } $totalPosts = count($data); $newCount = 0; $updateCount = 0; // Jeden Post aus der API-Antwort verarbeiten foreach ($data as $post) { // Mapping der Felder aus dem JSON zur Tabelle findings: // "id" -> post_id // "created_at" -> created_at (Konvertierung von ISO8601 zu MySQL-Format) // "in_reply_to_id" -> in_reply_to_id // "replies_count" -> replies_count // "reblogs_count" -> reblogs_count // "favourites_count" -> favorites_count // account -> "id" -> acc_id // account -> "username" -> username // account -> "acct" -> acct $post_id = isset($post['id']) ? $post['id'] : null; $created_at_raw = isset($post['created_at']) ? $post['created_at'] : null; $created_at = $created_at_raw ? (new DateTime($created_at_raw))->format('Y-m-d H:i:s') : null; $in_reply_to_id = isset($post['in_reply_to_id']) ? $post['in_reply_to_id'] : null; $replies_count = isset($post['replies_count']) ? $post['replies_count'] : 0; $reblogs_count = isset($post['reblogs_count']) ? $post['reblogs_count'] : 0; $favorites_count = isset($post['favourites_count']) ? $post['favourites_count'] : 0; $acc_id = isset($post['account']['id']) ? $post['account']['id'] : null; $username = isset($post['account']['username']) ? $post['account']['username'] : null; $acct = isset($post['account']['acct']) ? $post['account']['acct'] : null; // Vor dem Einfügen prüfen, ob der Eintrag bereits existiert $checkStmt->execute([ 'hashtag_id' => $hashtag_id, 'post_id' => $post_id ]); $rowCount = $checkStmt->fetch(); if ($rowCount['count'] == 0) { // Neuer Eintrag: Einfügen try { $insertStmt->execute([ 'hashtag_id' => $hashtag_id, 'post_id' => $post_id, 'created_at' => $created_at, 'in_reply_to_id' => $in_reply_to_id, 'replies_count' => $replies_count, 'reblogs_count' => $reblogs_count, 'favorites_count' => $favorites_count, 'acc_id' => $acc_id, 'username' => $username, 'acct' => $acct ]); $newCount++; } catch (PDOException $e) { echo "Fehler beim Einfügen von Post $post_id für Hashtag $hashtag: " . $e->getMessage() . "\n"; } } else { // Eintrag existiert bereits: Aktualisieren try { $updateStmt->execute([ 'hashtag_id' => $hashtag_id, 'post_id' => $post_id, 'created_at' => $created_at, 'in_reply_to_id' => $in_reply_to_id, 'replies_count' => $replies_count, 'reblogs_count' => $reblogs_count, 'favorites_count' => $favorites_count, 'acc_id' => $acc_id, 'username' => $username, 'acct' => $acct ]); $updateCount++; } catch (PDOException $e) { echo "Fehler beim Aktualisieren von Post $post_id für Hashtag $hashtag: " . $e->getMessage() . "\n"; } } } echo "Hashtag '$hashtag': $totalPosts Posts gefunden. Neue: $newCount, Aktualisierte: $updateCount.\n"; } $endTime = microtime(true); $totalTime = $endTime - $startTime; echo "Refresh abgeschlossen in " . round($totalTime, 2) . " Sekunden.\n"; ?>