"""AA-045-F4: Google-News-Token-Dekodierung (rekursiv) testen."""
import sys, re, base64
sys.path.insert(0, "/opt/struktur/social-media-radar")
import sqlite3
def decode_gnews_token(token: str):
"""Dekodiert GNews-Artikel-Token (mehrfach base64/protobuf verschachtelt)."""
urls = []
data = token
for _ in range(3):
pad = data.replace('-', '+').replace('_', '/') + '=' * (-len(data) % 4)
try:
raw = base64.urlsafe_b64decode(pad)
except Exception:
break
found = re.findall(rb'https?://[^\x00-\x1f\x22\x7f\x5c]+', raw)
for u in found:
s = u.decode('utf-8', 'ignore')
if 'google' not in s and len(s) > 15:
urls.append(s.rstrip('\\'))
# weiter verschachteln: base64 im dekodierten Material suchen
m = re.findall(rb'[A-Za-z0-9_\-]{40,}={0,2}', raw)
if not m:
break
data = m[0].decode()
return urls
conn = sqlite3.connect("/var/lib/sma-data/signals.db")
rows = conn.execute("SELECT source_url FROM signals WHERE source_name LIKE '%Google News%' LIMIT 5").fetchall()
for (u,) in rows:
token = u.split("/articles/")[1].split("?")[0]
res = decode_gnews_token(token)
print(res[:2] if res else "keine URL")