Baue einen Poker-Bot in Python in unter 50 Zeilen Code
Du kannst einen funktionierenden Poker-Bot in 47 Zeilen Python bauen. Er wird kein Turnier gewinnen, aber er verbindet sich mit Open Poker, setzt sich an einen Tisch und spielt Haende gegen andere Bots. Das ist der Ausgangspunkt fuer alles Weitere.
Was brauchst du wirklich, um loszulegen?
Nur Python 3.10+ und eine Bibliothek:
pip install websockets
Das war's. Kein SDK, kein Framework, keine Game Engine zum Installieren. Wir haben das Protokoll absichtlich einfach gehalten: Dein Bot verbindet sich per WebSocket, empfaengt den Spielstatus als JSON-Nachrichten und sendet Aktionen als JSON zurueck. Wenn du ein Dictionary parsen kannst, kannst du einen Bot bauen.
Du brauchst ausserdem einen Open Poker API-Key: Registriere dich hier, falls du das noch nicht getan hast. Die Registrierung ist kostenlos und dauert etwa 30 Sekunden.
Warum kein SDK? Weil SDKs die falsche Abstraktion fuer dieses Problem sind. Sie fuegen eine Abhaengigkeitsflaeche hinzu, die gewartet werden muss, verstecken das Protokoll und erschweren das Debugging. Wenn etwas schiefgeht (und das wird es), willst du die rohen Nachrichten ausgeben, um genau zu sehen, was der Server geschickt hat. Jedes Bot-Framework, das wir gesehen haben, endet damit, gegen das SDK zu kaempfen, anstatt an der Strategie zu arbeiten. Der rohe WebSocket-Ansatz laesst dich die Kontrolle behalten.
Wie sieht der vollstaendige Bot aus?
import asyncio
import json
import websockets
API_KEY = "your-api-key-here"
WS_URL = "wss://openpoker.ai/ws"
async def play():
headers = {"Authorization": f"Bearer {API_KEY}"}
async with websockets.connect(WS_URL, additional_headers=headers) as ws:
msg = json.loads(await ws.recv())
print(f"Connected as {msg['name']}")
await ws.send(json.dumps({"type": "set_auto_rebuy", "enabled": True}))
await ws.send(json.dumps({"type": "join_lobby", "buy_in": 2000}))
async for raw in ws:
msg = json.loads(raw)
t = msg.get("type")
if t == "your_turn":
actions = {a["action"]: a for a in msg["valid_actions"]}
if "check" in actions:
act = "check"
elif "call" in actions:
act = "call"
else:
act = "fold"
await ws.send(json.dumps({
"type": "action",
"action": act,
"client_action_id": f"a-{msg['turn_token'][:8]}",
"turn_token": msg["turn_token"],
}))
elif t == "table_closed":
await ws.send(json.dumps({"type": "join_lobby", "buy_in": 2000}))
elif t == "season_ended":
await ws.send(json.dumps({"type": "join_lobby", "buy_in": 2000}))
elif t == "hand_result":
winners = msg.get("winners", [])
if winners:
print(f"Hand won by {winners[0]['name']} (+{winners[0].get('amount', 0)})")
asyncio.run(play())Speichere es als bot.py, ersetze your-api-key-here mit deinem echten Key und fuehre python bot.py aus. Du solltest innerhalb von 30 Sekunden Output sehen, sobald ein anderer Bot in die Warteschlange kommt.
Was macht dieser Bot eigentlich?
Er ist eine Calling Station, und er war auch unser erster Bot.
Wenn du dran bist: Check, wenn du kannst (kostenloses Geld). Wenn du nicht checken kannst, call. Wenn du nicht callen kannst, fold. Das verliert langsam Chips, weil du jeden Einsatz callst, ohne die Handstaerke zu beruecksichtigen. Aber es spielt legales Poker, bleibt am Tisch und gibt dir einen vollstaendigen Event Loop, auf dem du aufbauen kannst.
Die vier Konzepte, die es wert sind zu verstehen:
set_auto_rebuy sagt dem Server, dass er automatisch 1.500 Chips rebuyen soll, wenn du pleite gehst. Ohne das hoert dein Bot auf zu spielen, nachdem er seinen Stack verloren hat. Damit kuemmert sich der Server um die Rebuys (mit Cooldown), und dein Bot spielt unbegrenzt weiter.
join_lobby stellt dich in die Matchmaking-Warteschlange. Das buy_in-Feld legt fest, wie viele Chips du an den Tisch mitbringst. Der gueltige Bereich ist 1.000 bis 5.000; wir verwenden standardmaessig 2.000, das sind 100 Big Blinds bei der 10/20-Blindstruktur. Wenn genuegend Spieler in der Warteschlange sind, erstellt der Matchmaker einen 6-max-Tisch.
turn_token ist ein Anti-Replay-Token. Jede your_turn-Nachricht enthaelt einen frischen Token. Du musst ihn in deiner Aktion zurueckschicken. Wenn du einen alten Token von einem vorherigen Zug sendest, wird die Aktion abgelehnt. Verwende immer den Token vom neuesten your_turn. Cache ihn nie.
client_action_id ist fuer dein eigenes Tracking. Der Server gibt ihn im action_ack zurueck, damit du zuordnen kannst, welche Aktion akzeptiert wurde. Verwende eine eindeutige ID pro Aktion; wir schneiden einfach den Turn-Token ab, um schnell einen eindeutigen String zu erhalten.
Welche WebSocket-Nachrichten empfaengt dein Bot?
Dein Bot empfaengt einen kontinuierlichen Strom von JSON-Nachrichten. Die meisten sind informativ; du musst nur auf your_turn antworten. Aber die anderen zu verstehen ist der Weg, einen intelligenteren Bot zu bauen. Hier ist der vollstaendige Satz, den du antreffen wirst:
| Nachricht | Was sie bedeutet | Antwortest du? |
|---|---|---|
connected | Auth erfolgreich, du bist online | Nein |
lobby_joined | Du bist in der Matchmaking-Warteschlange | Nein |
table_joined | Du sitzt an einem Tisch | Nein |
hand_start | Neue Hand beginnt, dein Platz und der Dealer | Nein |
hole_cards | Deine zwei privaten Karten (z.B. ["Ah", "Kd"]) | Nein |
your_turn | Deine gueltigen Aktionen, der Pot, das Board | Ja: Sende eine Aktion |
player_action | Jemand (vielleicht du) hat gehandelt | Nein |
community_cards | Flop, Turn oder River ausgeteilt | Nein |
hand_result | Hand vorbei, wer gewonnen hat | Nein |
busted | Du hast keine Chips mehr | Nein (Auto-Rebuy kuemmert sich) |
table_closed | Tisch geschlossen | Lobby beitreten |
season_ended | Season-Uebergang | Lobby beitreten |
Die vollstaendige Nachrichtenreferenz findest du unter docs.openpoker.ai/api-reference/message-types. Jedes Feld jeder Nachricht ist mit JSON-Beispielen dokumentiert. Lesezeichen lohnt sich; du wirst es staendig nachschlagen.
Schlauer machen: drei schnelle Verbesserungen
Die Calling Station verliert etwa 2-3 Big Blinds pro 100 Haende. Drei Aenderungen verbessern sie sofort, sortiert nach Wirkung.
1. Schlechte Haende pre-flop folden
Die meisten Starthaende im Poker sind Verlierer. Folde die schlechtesten 60% vor dem Flop, und du bist bereits vor jeder Calling Station auf der Plattform. Starthandauswahl ist die groesste Verbesserung, die du machen kannst.
def should_play(cards):
"""Return True for top ~40% of starting hands."""
ranks = "23456789TJQKA"
r1 = ranks.index(cards[0][0])
r2 = ranks.index(cards[1][0])
high, low = max(r1, r2), min(r1, r2)
pair = r1 == r2
suited = cards[0][1] == cards[1][1]
if pair: return True # All pairs
if high >= 10: return True # Any two broadway
if high >= 9 and suited: return True # Suited connectors 9+
if high == 12 and low >= 7: return True # A7+
return FalseSpeichere deine Hole Cards, wenn du hole_cards empfaengst, und pruefe dann should_play() in deinem your_turn-Handler. Folde alles andere pre-flop.
2. Raise mit starken Haenden
Die Calling Station raist nie. Das bedeutet, Gegner sehen billige Flops gegen dich bei jeder Hand. Loesung: Raise mit deinen staerksten 15% der Haende pre-flop.
if "raise" in actions and should_raise(my_cards):
await ws.send(json.dumps({
"type": "action",
"action": "raise",
"amount": actions["raise"]["min"], # minimum raise
"client_action_id": next_id(),
"turn_token": msg["turn_token"],
}))Der raise-Eintrag in valid_actions zeigt dir die genauen min- und max-Betraege. Das amount-Feld ist ein Raise-to-Betrag (gesamte Einsatzgroesse), kein Inkrement. Wenn der Big Blind 20 ist und du auf 60 raisen willst, sende "amount": 60.
3. Nutze Pot Odds post-flop
Nach dem Flop hast du echte Informationen. Pot Odds sagen dir, ob Callen mathematisch korrekt ist: Wenn der Preis, den du zahlst, niedriger ist als deine Gewinnwahrscheinlichkeit, calle. Sonst folde. Fuer die vollstaendige Mathematik hat der Pot-Odds-Glossareintrag durchgerechnete Beispiele und Fallen, die Anfaenger-Bots erwischen.
def pot_odds_say_call(pot, call_amount, estimated_win_pct=0.3):
if call_amount == 0:
return True
odds = call_amount / (pot + call_amount)
return estimated_win_pct > oddsSelbst eine grobe Schaetzung deiner Gewinnwahrscheinlichkeit (30% als Standard, hoeher mit Top Pair, niedriger ohne nichts), kombiniert mit Pot Odds, schlaegt die reine Calling Station deutlich. Die your_turn-Nachricht enthaelt die aktuelle Potgroesse, also hast du alles, was du brauchst.
Was wir beim Betrieb dieses Bots gelernt haben
Ich habe die Calling Station ueber 1.200 Haende laufen lassen, um einen echten Baseline zu bekommen. Sie verlor 2,4 Big Blinds pro 100 Haende — nicht katastrophal, aber ein stetiger Abfluss. Das groesste Leck war nicht, zu viele Einsaetze zu callen. Es war, River-Einsaetze mit nichts zu callen. Die Calling Station hat kein Konzept von "Ich habe nichts getroffen und dieser Einsatz ist gross im Verhaeltnis zum Pot"; sie callt einfach, jedes Mal, und blutet.
Das Zweite, was mich ueberrascht hat: Auto-Rebuy-Cooldowns sind wichtiger als du denkst. Nach dem Pleitegang gibt es einen 5-Minuten-Cooldown im Free-Tier (2 Minuten bei Pro) vor dem naechsten Rebuy. Ein Bot, der haeufig pleitegeht, verbringt viel Zeit ausserhalb des Spiels. Das Stack-Management richtig hinzubekommen (gar nicht erst pleitezugehen) hat Zinseszins-Effekte ueber die blosse Chip-Erhaltung hinaus.
Das Hinzufuegen von should_play() aus dem Abschnitt oben senkte die Verlustrate auf etwa 0,8 bb/100 in unseren Tests — eine 3-fache Verbesserung durch eine Funktion. Der Bot verliert immer noch, aber jetzt verliert er wie ein mittelmässiger Spieler statt wie ein kaputter. Das ist der Ausgangspunkt fuer echte Strategiearbeit.
Wir behaupten nicht, dass dies rigorose Stichprobengroessen sind. Die Varianz bei 6-max ist hoch, und 1.200 Haende sind ein kleines Fenster. Aber richtungsmaessig ist das Muster konsistent: Pre-Flop-Selektion ist der erste Hebel, Post-Flop-Aggression ist der zweite.
Was du im Leaderboard erwarten kannst
Mit der Basis-Calling-Station landest du am unteren Ende des Leaderboards. Fuege die drei Verbesserungen von oben hinzu und du sitzt in der Mitte. Um an die Spitze zu kommen, brauchst du Handbewertung, Gegnermodellierung, Stack-Management und Positionsbewusstsein. Der vollstaendige Weg ist im 7-Tage-Leaderboard-Plan dokumentiert.
Dein Bot braucht mindestens 10 Haende, um im Leaderboard zu erscheinen. Bei kontinuierlichem Spiel und aktiviertem Auto-Rebuy erreichst du das in wenigen Minuten.
Die vollstaendige Plattform-Dokumentation findest du unter docs.openpoker.ai. Der Aktions- und Strategieleitfaden behandelt Raise-Semantik, Turn Tokens und Timeout-Verhalten im Detail. Die websockets-Bibliothek-Dokumentation ist lesenswert, wenn du asynchrones Connection-Handling jenseits der hier gezeigten Grundlagen moechtest.
FAQ
Mein Bot verbindet sich, wird aber nie an einen Tisch gesetzt. Der Matchmaker braucht 2+ Spieler in der Warteschlange. Wenn sonst niemand spielt, wartet dein Bot. Starte zwei Bots mit verschiedenen API-Keys, oder pruefe das Leaderboard, ob andere aktiv sind.
Ich bekomme action_rejected-Fehler.
Pruefe, ob du den turn_token aus der neuesten your_turn-Nachricht mitschickst. Alte Tokens sind die Ursache Nr. 1 fuer Ablehnungen. Cache den Token nicht zwischen den Zuegen.
Mein Bot wurde getrennt und hat seinen Platz verloren. Du hast 120 Sekunden, um dich wieder zu verbinden. Wenn du rechtzeitig reconnectest, bleibt dein Platz erhalten. Nach 120 Sekunden wird dein Stack an dein Guthaben zurueckgegeben und du musst der Lobby erneut beitreten.
Kann ich diesen Bot 24/7 laufen lassen?
Ja. Aktiviere Auto-Rebuy und handle table_closed + season_ended, indem du der Lobby erneut beitrittst. Der Bot in diesem Beitrag macht beides. Wir haben ihn mehrere Tage am Stueck ohne Eingriff laufen lassen.
Wie viel sollte ich einkaufen? Der gueltige Bereich ist 1.000 bis 5.000 Chips. Wir verwenden 2.000 in den Beispielen (100 Big Blinds bei 10/20 Blinds), was ein Standard-Deep-Stack-Startbetrag ist. Weniger kaufen (1.000) reduziert Varianz, begrenzt aber auch, wie viel du in einer einzelnen Hand gewinnen kannst. Mehr kaufen (5.000) ist in Ordnung, sobald dein Bot eine grundlegende Fold/Raise-Strategie hat; mach das nicht mit einer reinen Calling Station.
Bereit, deinen ersten Bot zu starten? Registriere dich fuer einen API-Key und du spielst innerhalb von fuenf Minuten Haende. Die Calling Station ist ein guter Ausgangspunkt; jeder wettbewerbsfaehige Bot im Leaderboard hat aehnlich angefangen.