The document discusses using Python to analyze online poker gameplay data in real-time. It describes capturing packet data from an Android device or router, processing the data with Python using pipes and stdin, and analyzing the poker hands with a library. IPython notebooks are used for visualization and documentation. The example code connects an Ngrep process on a router to a Python script via pipes to parse live poker game updates and rank hands.
6. Packet capture options
from your (rooted) Android device - wifi or 3G
● apps - eg Shark for Root
● tcpdump - via shell
7. Packet capture options
from your router or another device on the
network (if promiscuous mode) - wifi only
● tcpdump/libpcap
● wireshark/tshark
● pcapy
● ngrep
8. Hackable routers
There are many devices and firmwares to
choose from (see dd-wrt and tomato-usb)
I have Netgear WNR3500L with Tomato-USB
● ssh built in
● Additional packages installed using Optware
○ http://tomatousb.org/doc:optware
○ Includes python, tshark, ngrep, wget, some build
tools, ...
9. Initial capture using tshark
tshark -i eth1 -w capture.pcap -f
"host 192.168.1.106 and
(port 9400 or port 9500)"
18. Pipes
Piping data into Python is easy
You can read stdin...
import sys
while True:
l = sys.stdin.readline():
Alternatively use the Unix-like fileinput
module...
import fileinput
for line in fileinput.input():
... fileinput reads from a list of files, or else stdin
20. Now for some poker smarts
Loads of resources on the web
● Poker games generally
○ starting hand rankings
○ odds calculations etc
21. Now for some poker smarts
Easy lookup tables in python...
# Unprocessed space separated string dump
stats_rankings =
"""AA 2.3200 550,632
KK 1.6700 551,878
... lots more lines
32s -0.1600 369,182"""
# Now convert to structured data
stats_rankings = dict([
(line.split()[0], (rank + 1, float(line.split()[1])))
for rank, line
in enumerate(stats_rankings.split("n"))
])
22. Now for some poker smarts
Python specific
● pypoker-eval
○ Wrapper for poker-eval toolkit
○ Run hand simulations
● machine learning systems
○ endless possibilities
● Lots of other resources at:
http://pokerai.org/pf3/viewforum.php?f=32
23. Code
def read_raw_from_stdin():
line = ''
while 1:
l = sys.stdin.readline()
line += l.strip()
if '''we have a complete line''':
parse_update(line)
line = ''
if __name__ == "__main__":
read_raw_from_stdin()
24. Code
def parse_update(update_str):
player_cards = get_cards(update_str)
if player_cards:
my_cards = [v for v in player_cards if v[0] != '__']
if my_cards:
rank_starting_hand(my_cards[0])
else:
player_cards = old_player_cards # global state excluded
community_cards = get_cards(update_str, player=False)
if community_cards:
print("Community cards %s" % community_cards)
rank_hand(player_cards, community_cards)
25. Code
e = PokerEval()
def rank_hand(pocket_cards, community_cards, iterations=100000):
unknown_cards = ['__'] * (5 - len(community_cards))
result = e.poker_eval(game = "holdem",
pockets = pocket_cards,
iterations = iterations,
board = community_cards + unknown_cards)
for i, data in enumerate(result['eval']):
print(pocket_cards[i], "%2d%%" % (float(data['ev']) /
10), data['winhi'], data['losehi'], data['tiehi'])
26. Game in progress - poker-buddy.py
Player cards [['__', '__'], ['__', '__'], ['Ac', 'Kc'],
['__', '__'], ['__', '__']]
Group 1
(5, 0.77)
29. Summary
● Python can be used for packet capture
○ pycapy
● Python for data processing
○ Pipes, unbuffered input (-u option), stdin, fileinput
module
● Python on embedded devices
○ Optware on routers & other embedded devices
● IPython Notebook great for analysis...
...and documenting what you found
● There's a library for almost everything
○ eg pypoker-eval