Files
BSN-Chatsystem/patch_article_15385.py
T

113 lines
6.0 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#!/usr/bin/env python3
"""Fetch article 15385, optimize tables with gray borders, PATCH back."""
import json, urllib.request, re
TOKEN = "c2hhMjU2Ojc5NDpjYzY0ZTQ4NmVkZGJiMmU1YTk2YTI4YmU4OTcwMzQ5MjRmNjZmMjcyMmRiMGJlM2JhYWI0MDhlNmI4MDZlMmI0"
BASE = "https://www.brettspiel-news.de/api/index.php/v1/content/articles"
# ── 1. Fetch article ──────────────────────────────────────
req = urllib.request.Request(f"{BASE}/15385", headers={
"X-Joomla-Token": TOKEN,
"Accept": "application/vnd.api+json"
})
resp = urllib.request.urlopen(req)
data = json.loads(resp.read())
text = data["data"]["attributes"]["text"]
print(f"Fetched article 15385: '{data['data']['attributes']['title']}'")
print(f"Text length: {len(text)}")
# ── 2. Patch Table 1: "Für wen ist das Spiel?" ────────────
old1 = '<h2>Für wen ist das Spiel?</h2>\r\n<table>\r\n<tbody>\r\n<tr><th>✅ Dafür geeignet</th><th>❌ Eher nicht</th></tr>\r\n<tr>\r\n<td>Strategie-Fans, die Effizienz lieben</td>\r\n<td>Casual-Runden mit 5+ Personen</td>\r\n</tr>\r\n<tr>\r\n<td>Solo-Spieler (exzellenter Solo-Modus)</td>\r\n<td>Wer epische 3-Stunden-Partien sucht</td>\r\n</tr>\r\n<tr>\r\n<td>23 Personen (spielt sich am besten)</td>\r\n<td>Wer auf Glück statt Taktik steht</td>\r\n</tr>\r\n<tr>\r\n<td>Alle, die <em>Die rote Kathedrale</em> mochten</td>\r\n<td>&nbsp;</td>\r\n</tr>\r\n</tbody>\r\n</table>'
new1 = '''<div class="bsn-infobox">
<h2>Für wen ist das Spiel?</h2>
<table style="border-collapse: collapse; width: 100%; font-size: 0.95rem;">
<tbody>
<tr style="background: #f0f4ff;"><th style="border: 1px solid #ccc; padding: 10px 14px; text-align: left; color: #20228a;">✅ Dafür geeignet</th><th style="border: 1px solid #ccc; padding: 10px 14px; text-align: left; color: #20228a;">❌ Eher nicht</th></tr>
<tr>
<td style="border: 1px solid #ddd; padding: 8px 14px;">Strategie-Fans, die Effizienz lieben</td>
<td style="border: 1px solid #ddd; padding: 8px 14px;">Casual-Runden mit 5+ Personen</td>
</tr>
<tr>
<td style="border: 1px solid #ddd; padding: 8px 14px;">Solo-Spieler (exzellenter Solo-Modus)</td>
<td style="border: 1px solid #ddd; padding: 8px 14px;">Wer epische 3-Stunden-Partien sucht</td>
</tr>
<tr>
<td style="border: 1px solid #ddd; padding: 8px 14px;">23 Personen (spielt sich am besten)</td>
<td style="border: 1px solid #ddd; padding: 8px 14px;">Wer auf Glück statt Taktik steht</td>
</tr>
<tr>
<td style="border: 1px solid #ddd; padding: 8px 14px;">Alle, die <em>Die rote Kathedrale</em> mochten</td>
<td style="border: 1px solid #ddd; padding: 8px 14px;">&nbsp;</td>
</tr>
</tbody>
</table>
</div>'''
if old1 in text:
text = text.replace(old1, new1)
print("✓ Table 1 replaced")
else:
print("✗ Table 1 NOT FOUND. Searching...")
idx = text.find('Für wen ist das Spiel')
if idx >= 0:
print(f" Found at position {idx}")
print(f" Context: {repr(text[idx:idx+300])}")
# ── 3. Patch Table 2: "Die nackten Zahlen" ────────────────
old2 = '<h2>Die nackten Zahlen</h2>\r\n<table>\r\n<tbody>\r\n<tr>\r\n<td><strong>BGG-Rating</strong></td>\r\n<td>8.1 / 10</td>\r\n</tr>\r\n<tr>\r\n<td><strong>BGG-Weight</strong></td>\r\n<td>3.06 / 5 (Kennerspiel)</td>\r\n</tr>\r\n<tr>\r\n<td><strong>Spieler</strong></td>\r\n<td>14 (am besten: 23)</td>\r\n</tr>\r\n<tr>\r\n<td><strong>Dauer</strong></td>\r\n<td>ca. 6080 Minuten</td>\r\n</tr>\r\n<tr>\r\n<td><strong>Designer</strong></td>\r\n<td>Shei S. &amp; Isra C. (auch <em>Die rote Kathedrale</em>)</td>\r\n</tr>\r\n<tr>\r\n<td><strong>Verlag</strong></td>\r\n<td>KOSMOS</td>\r\n</tr>\r\n</tbody>\r\n</table>'
new2 = '''<div class="bsn-infobox">
<h2>Die nackten Zahlen</h2>
<table style="border-collapse: collapse; width: 100%; font-size: 0.95rem;">
<tbody>
<tr style="background: #f0f4ff;">
<td style="border: 1px solid #ccc; padding: 10px 14px; font-weight: bold; color: #20228a; width: 30%;"><strong>BGG-Rating</strong></td>
<td style="border: 1px solid #ddd; padding: 10px 14px;">8.1 / 10</td>
</tr>
<tr>
<td style="border: 1px solid #ccc; padding: 10px 14px; font-weight: bold; color: #20228a;"><strong>BGG-Weight</strong></td>
<td style="border: 1px solid #ddd; padding: 10px 14px;">3.06 / 5 (Kennerspiel)</td>
</tr>
<tr>
<td style="border: 1px solid #ccc; padding: 10px 14px; font-weight: bold; color: #20228a;"><strong>Spieler</strong></td>
<td style="border: 1px solid #ddd; padding: 10px 14px;">14 (am besten: 23)</td>
</tr>
<tr>
<td style="border: 1px solid #ccc; padding: 10px 14px; font-weight: bold; color: #20228a;"><strong>Dauer</strong></td>
<td style="border: 1px solid #ddd; padding: 10px 14px;">ca. 6080 Minuten</td>
</tr>
<tr>
<td style="border: 1px solid #ccc; padding: 10px 14px; font-weight: bold; color: #20228a;"><strong>Designer</strong></td>
<td style="border: 1px solid #ddd; padding: 10px 14px;">Shei S. &amp; Isra C. (auch <em>Die rote Kathedrale</em>)</td>
</tr>
<tr>
<td style="border: 1px solid #ccc; padding: 10px 14px; font-weight: bold; color: #20228a;"><strong>Verlag</strong></td>
<td style="border: 1px solid #ddd; padding: 10px 14px;">KOSMOS</td>
</tr>
</tbody>
</table>
</div>'''
if old2 in text:
text = text.replace(old2, new2)
print("✓ Table 2 replaced")
else:
print("✗ Table 2 NOT FOUND. Searching...")
idx = text.find('Die nackten Zahlen')
if idx >= 0:
print(f" Found at position {idx}")
print(f" Context: {repr(text[idx:idx+300])}")
# ── 4. PATCH back ─────────────────────────────────────────
payload = json.dumps({"text": text}).encode()
req = urllib.request.Request(f"{BASE}/15385", data=payload, method="PATCH", headers={
"X-Joomla-Token": TOKEN,
"Accept": "application/vnd.api+json",
"Content-Type": "application/json"
})
resp = urllib.request.urlopen(req)
result = json.loads(resp.read())
print(f"PATCH status: {resp.status}")
print(f"Updated: {result.get('data',{}).get('id')}")