Explorer
/tmp/patch_meta.py
← Zurück ↓ Download
from pathlib import Path
p=Path('/opt/struktur/social-media-radar/intake/meta_ads_intake.py')
s=p.read_text()
s=s.replace("    ads: list[dict] = []\n", "    ads: list[dict] = []\n    active_ids: set[str] = set()\n")
s=s.replace("                    card.update({'config': item, 'public_url': f'{BASE_URL}?id={ad_id}&country={country}'})\n                    ads.append(card)\n", "                    card.update({'config': item, 'public_url': f'{BASE_URL}?id={ad_id}&country={country}'})\n                    card['active_status'] = 'active' if any(x.lower() == 'active' for x in _lines(card.get('card_text',''))) else 'unknown'\n                    if card['active_status'] == 'active':\n                        active_ids.add(ad_id)\n                    ads.append(card)\n")
s=s.replace("            'published_at': normalize_published_at(ad.get('started_raw'), datetime.now(timezone.utc).isoformat()),\n", "            'published_at': normalize_published_at(ad.get('started_raw'), datetime.now(timezone.utc).isoformat()),\n            'ad_start_at': normalize_published_at(ad.get('started_raw'), datetime.now(timezone.utc).isoformat()),\n            'last_seen_at': datetime.now(timezone.utc).isoformat() if ad.get('active_status') == 'active' else None,\n            'active_status': ad.get('active_status', 'unknown'),\n")
s=s.replace("                    \"UPDATE signals SET published_at=COALESCE(?,published_at), image_url=COALESCE(NULLIF(?,''),image_url), image_source=COALESCE(NULLIF(?,''),image_source), image_found=CASE WHEN ? <> '' THEN 1 ELSE image_found END, image_checked_at=? WHERE external_id=? AND source_type='meta_ad'\",\n                    (signal['published_at'], signal['image_url'], signal['image_source'], signal['image_url'], datetime.now(timezone.utc).isoformat(), signal['external_id']),\n", "                    \"UPDATE signals SET published_at=COALESCE(?,published_at), ad_start_at=COALESCE(?,ad_start_at,published_at), last_seen_at=CASE WHEN ?='active' THEN ? ELSE last_seen_at END, active_status=?, image_url=COALESCE(NULLIF(?,''),image_url), image_source=COALESCE(NULLIF(?,''),image_source), image_found=CASE WHEN ? <> '' THEN 1 ELSE image_found END, image_checked_at=? WHERE external_id=? AND source_type='meta_ad'\",\n                    (signal['published_at'], signal['ad_start_at'], signal['active_status'], signal['last_seen_at'], signal['active_status'], signal['image_url'], signal['image_source'], signal['image_url'], datetime.now(timezone.utc).isoformat(), signal['external_id']),\n")
needle="    record_source_run('meta_ads', t0, seen, new, duplicate, rejected=rejected,\n"
insert="""    # Bekannte IDs, die in der aktiven öffentlichen Suche nicht erschienen,\n    # werden nicht fälschlich als inaktiv markiert: ohne belastbare Detailantwort\n    # bleibt der Status unknown. Aktive Treffer werden oben last_seen_at-aktualisiert.\n    import sqlite3\n    with sqlite3.connect('/var/lib/sma-data/signals.db') as sync:\n        known = [r[0] for r in sync.execute(\"SELECT external_id FROM signals WHERE source_type='meta_ad' AND external_id<>''\").fetchall()]\n        for ad_id in known:\n            if ad_id not in active_ids:\n                sync.execute(\"UPDATE signals SET active_status=CASE WHEN active_status='active' THEN 'unknown' ELSE COALESCE(active_status,'unknown') END WHERE external_id=? AND source_type='meta_ad'\", (ad_id,))\n\n"""
assert needle in s
s=s.replace(needle,insert+needle)
p.write_text(s)