Zum Hauptinhalt springen

Instagram Models

Die Instagram-Domäne nutzt ein Collector-System für das Scraping. CollectorClient-Instanzen (authentifiziert via Sanctum) leasen CollectorJob-Aufträge, führen sie aus und liefern Ergebnisse zurück. Keywords und Related Profiles werden aus den gescrapten Daten extrahiert.

CollectorJob

Scraping-Auftrag für Instagram-Profile. Verwendet UUID als Primary Key. Durchläuft einen definierten Status-Lifecycle mit Lease-Mechanismus zur Parallelisierung.

Tabelle: collector_jobs

FeldTypNullableBeschreibung
iduuidPKUUID-basierte Primary Key
sourcestringneinQuell-Identifier (z.B. daily_scrape)
payloadjsonneinAuftragsdaten (Handle, Profil-ID, etc.)
statusstringneinAktueller Status (siehe Lifecycle)
priorityintegerneinPriorität (höher = wichtiger)
leased_byuuid (FK)jaCollector-Client, der den Job bearbeitet
lease_expires_atdatetimejaAblaufzeit des Leases
attemptsintegerneinBisherige Versuche
resultjsonjaScraping-Ergebnis bei Erfolg
error_codestringjaFehlercode bei Fehler
error_messagetextjaFehlermeldung
created_atdatetimeneinErstellt am
updated_atdatetimeneinAktualisiert am

Relations:

MethodeTypRelated ModelFKBeschreibung
leasedBy()belongsToCollectorClientleased_byBearbeitender Client

Casts: payload → array, result → array, lease_expires_at → datetime

Status-Lifecycle:

queued → leased → completed
→ failed → queued (Retry)
→ expired (Lease abgelaufen) → queued
StatusBeschreibung
queuedWartet auf Bearbeitung
leasedVon Client übernommen
completedErfolgreich abgeschlossen
failedFehlgeschlagen

Methoden:

MethodeReturnBeschreibung
isLeaseExpired()boolPrüft ob Lease abgelaufen
isLeasedTo($client)boolPrüft ob Lease einem bestimmten Client gehört
markLeased($client)voidSetzt Status auf leased mit Client und Ablaufzeit
markCompleted($result)voidSetzt Status auf completed mit Ergebnis
markFailed($code, $msg)voidSetzt Status auf failed mit Fehlerdetails

Location: app/Models/CollectorJob.php


CollectorClient

Authentifizierter Scraping-Client. Erweitert Authenticatable für Sanctum API-Token-Auth. Jeder Client hat definierte Capabilities und einen Heartbeat über last_seen_at.

Tabelle: collector_clients

FeldTypNullableBeschreibung
iduuidPKUUID-basierte Primary Key
namestringneinClient-Name
capabilitiesjsonjaUnterstützte Funktionen (Array)
last_seen_atdatetimejaLetzter Heartbeat
created_atdatetimeneinErstellt am
updated_atdatetimeneinAktualisiert am

Relations:

MethodeTypRelated ModelFKBeschreibung
leasedJobs()hasManyCollectorJobleased_byAktuell geleaste Jobs

Traits: HasApiTokens (Sanctum), HasFactory, HasUuids

Casts: capabilities → array, last_seen_at → datetime

Auth-Mechanismus: Der Client authentifiziert sich per Sanctum Bearer-Token. Tokens werden über die personal_access_tokens-Tabelle verwaltet. Die tokenable_id-Spalte ist ein String (UUID), nicht Integer.

Location: app/Models/CollectorClient.php


InstagramProfileKeyword

Aus der Instagram-Bio extrahierte Keywords. Werden per AI-Detection oder Regex-Parsing gewonnen.

Tabelle: instagram_profile_keywords

FeldTypNullableBeschreibung
idbigintPKPrimary Key
social_profile_idbigint (FK)neinZugehöriges Profil
keywordstringneinExtrahiertes Keyword
sourcestringjaHerkunft (bio_parse, ai_detection, etc.)
created_atdatetimeneinErstellt am
updated_atdatetimeneinAktualisiert am

Relations:

MethodeTypRelated ModelFKBeschreibung
socialProfile()belongsToSocialProfilesocial_profile_idZugehöriges Profil

Location: app/Models/InstagramProfileKeyword.php


InstagramRelatedProfile

Verwandte Instagram-Profile mit Relevanz-Score und Match-Begründung. Wird per cross-platform:queue-related und Instagram-spezifischen Discovery-Mechanismen befüllt.

Tabelle: instagram_related_profiles

FeldTypNullableBeschreibung
idbigintPKPrimary Key
social_profile_idbigint (FK)neinQuell-Profil
related_social_profile_idbigint (FK)neinVerwandtes Profil
relevance_scoreintegerjaRelevanz (0–100)
match_reasonstringjaGrund der Verknüpfung
created_atdatetimeneinErstellt am
updated_atdatetimeneinAktualisiert am

Relations:

MethodeTypRelated ModelFKBeschreibung
sourceProfile()belongsToSocialProfilesocial_profile_idQuell-Profil
relatedProfile()belongsToSocialProfilerelated_social_profile_idVerwandtes Profil

Casts: relevance_score → integer

Ausschluss-Filter: Analog zu YouTubeRelatedChannel muss bei der Anzeige der Related-Profile immer gegen notExcluded() gefiltert werden:

->whereHas('relatedProfile', fn ($q) => $q
->whereNull('blocked_at')
->whereNull('sanitized_at')
->whereNull('archived_at')
)

Location: app/Models/InstagramRelatedProfile.php


InstagramPost

Einzelner Instagram-Post mit Metadaten. Wird bei jedem Scrape per Upsert aktualisiert (Metadaten-Update, last_seen_at aktualisieren, first_seen_at beibehalten). Dient als Parent fuer die Zeitreihen-Metriken.

Tabelle: instagram_posts

FeldTypNullableBeschreibung
idbigintPKAuto-Increment Primary Key
social_profile_idbigint (FK)neinZugehoeriges Profil
shortcodestring(100)neinInstagram-Post-Identifier (z.B. ABC123, bis zu 40+ Zeichen moeglich)
typestring(20)jaPost-Typ: image, video, carousel, reel
urlstring(500)jaURL zum Post
thumbnail_urltextjaCDN-URL des Post-Thumbnails
alt_texttextjaAccessibility-Text des Posts
first_seen_atdatetimeneinWann der Post erstmals gesehen wurde
last_seen_atdatetimeneinWann der Post zuletzt in recent_posts auftauchte
created_atdatetimeneinErstellt am
updated_atdatetimeneinAktualisiert am

Unique Constraint: (social_profile_id, shortcode) — ein Post pro Profil.

Relations:

MethodeTypRelated ModelFKBeschreibung
profile()belongsToSocialProfilesocial_profile_idZugehoeriges Profil
metrics()hasManyInstagramPostMetricinstagram_post_idAlle Metrik-Snapshots
latestMetric()hasOneInstagramPostMetricinstagram_post_idNeuester Datenpunkt

Casts: first_seen_at -> datetime, last_seen_at -> datetime

Location: app/Models/InstagramPost.php


InstagramPostMetric

Einzelner Metriken-Datenpunkt fuer einen Instagram-Post. Jeder Scrape erzeugt einen neuen Datenpunkt (Timestamp-Granularitaet, kein Dedup). Ermoeglicht Engagement-Verlauf pro Post ueber die Zeit.

Tabelle: instagram_post_metrics

FeldTypNullableBeschreibung
idbigintPKAuto-Increment Primary Key
instagram_post_idbigint (FK)neinZugehoeriger Post
likes_countunsigned integerneinAnzahl Likes zum Scrape-Zeitpunkt
comments_countunsigned integerneinAnzahl Comments zum Scrape-Zeitpunkt
scraped_atdatetimeneinZeitpunkt des Scrapes
created_atdatetimeneinErstellt am

Unique Constraint: (instagram_post_id, scraped_at) — ein Datenpunkt pro Post pro Scrape-Zeitpunkt.

Relations:

MethodeTypRelated ModelFKBeschreibung
post()belongsToInstagramPostinstagram_post_idZugehoeriger Post

Casts: scraped_at -> datetime, likes_count -> integer, comments_count -> integer

Datenvolumen-Projektion:

  • ~54.000 Rows/Tag (3.000 Profile x 12 Posts x 1,5 Scrapes)
  • ~1,6 Mio Rows/Monat, ~20 Mio Rows/Jahr
  • ~80 Bytes pro Row inkl. Indizes

Location: app/Models/InstagramPostMetric.php