From e349d57bbea78eb998f7cf877749196578ecbe74 Mon Sep 17 00:00:00 2001 From: Matthias Czech Date: Mon, 17 Mar 2025 17:22:07 +0100 Subject: [PATCH] =?UTF-8?q?update=20erg=C3=A4nzt?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- refresh.php | 142 ++++++++++++++++++++++++++++++++++------------------ 1 file changed, 92 insertions(+), 50 deletions(-) diff --git a/refresh.php b/refresh.php index da95fdf..fc98921 100644 --- a/refresh.php +++ b/refresh.php @@ -1,9 +1,12 @@ getMessage(); + echo "Datenbankverbindung fehlgeschlagen: " . $e->getMessage(); exit; } -// Bearer Token für den Mastodon API-Aufruf (bitte anpassen) +// Bearer-Token für den Mastodon API-Aufruf (bitte anpassen) $bearerToken = '99jJEXMrMPSGKyg0wp-OrGJ-5s38XPLlE0lmNmv6QSI'; // Alle Hashtags aus der Tabelle abrufen @@ -36,29 +39,34 @@ if (!$hashtags) { exit; } -// SQL-Statement zum Einfügen in die findings-Tabelle -// Hier wird INSERT IGNORE verwendet, um doppelte Einträge (basierend auf dem Primary Key (hashtag_id, post_id)) zu überspringen. -$insertSql = "INSERT IGNORE INTO findings ( - hashtag_id, - post_id, - created_at, - in_reply_to_id, - replies_count, - reblogs_count, - favorites_count, - acc_id, - username, - acct +// 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 -)"; -$insertStmt = $pdo->prepare($insertSql); +)"); +// 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); @@ -71,8 +79,8 @@ foreach ($hashtags as $row) { ]); $response = curl_exec($ch); - if(curl_errno($ch)) { - echo "cURL Fehler für Hashtag $hashtag: " . curl_error($ch) . "\n"; + if (curl_errno($ch)) { + echo "cURL-Fehler für Hashtag $hashtag: " . curl_error($ch) . "\n"; curl_close($ch); continue; } @@ -84,28 +92,32 @@ foreach ($hashtags as $row) { continue; } - // JSON-Antwort dekodieren $data = json_decode($response, true); if (!$data) { echo "Fehler beim Dekodieren des JSON für Hashtag $hashtag.\n"; continue; } - // Jeden Post im Ergebnis verarbeiten und in die findings-Tabelle einfügen + $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 - // "in_reply_to_id" -> in_reply_to_id - // "replies_count" -> replies_count - // "reblogs_count" -> reblogs_count - // "favourites_count" -> favorites_count - // account -> "id" -> acc_id + // "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 + // account -> "acct" -> acct $post_id = isset($post['id']) ? $post['id'] : null; - $created_at = isset($post['created_at']) ? $post['created_at'] : 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; @@ -115,27 +127,57 @@ foreach ($hashtags as $row) { $username = isset($post['account']['username']) ? $post['account']['username'] : null; $acct = isset($post['account']['acct']) ? $post['account']['acct'] : null; - // Datensatz in die Tabelle 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 - ]); - } catch (PDOException $e) { - echo "Fehler beim Einfügen des Posts $post_id für Hashtag $hashtag: " . $e->getMessage() . "\n"; + // 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' verarbeitet.\n"; + echo "Hashtag '$hashtag': $totalPosts Posts gefunden. Neue: $newCount, Aktualisierte: $updateCount.\n"; } -echo "Refresh abgeschlossen.\n"; +$endTime = microtime(true); +$totalTime = $endTime - $startTime; +echo "Refresh abgeschlossen in " . round($totalTime, 2) . " Sekunden.\n"; ?> +