Top Banner
The adventures of poker, packets, pipes and Python Roger Barnes
30

Poker, packets, pipes and Python

May 19, 2015

Download

Technology

Roger Barnes

An adventure of light-hearted discovery, using python and other tools to poke around in an online poker game
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: Poker, packets, pipes and Python

The adventures of poker, packets, pipes and

PythonRoger Barnes

Page 2: Poker, packets, pipes and Python

I like playing online poker

Page 3: Poker, packets, pipes and Python

But I could be better at it

Page 4: Poker, packets, pipes and Python

I needed a poker buddy

That's a terrible hand!

All in!

Page 5: Poker, packets, pipes and Python

Live Hold'em Poker Pro

Page 6: Poker, packets, pipes and Python

Packet capture options

from your (rooted) Android device - wifi or 3G● apps - eg Shark for Root● tcpdump - via shell

Page 7: Poker, packets, pipes and Python

Packet capture options

from your router or another device on the network (if promiscuous mode) - wifi only ● tcpdump/libpcap● wireshark/tshark● pcapy● ngrep

Page 8: Poker, packets, pipes and Python

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, ...

Page 9: Poker, packets, pipes and Python

Initial capture using tshark

tshark -i eth1 -w capture.pcap -f "host 192.168.1.106 and (port 9400 or port 9500)"

Page 10: Poker, packets, pipes and Python

Analyse using wireshark - bingo!

Page 11: Poker, packets, pipes and Python

IPython Notebookhttp://ipython.org/ipython-doc/dev/interactive/htmlnotebook.html

Page 12: Poker, packets, pipes and Python

Parsing game state

More IPython notebook work to figure out sequence of events, card values, player actions etc

Page 13: Poker, packets, pipes and Python

Mapping card valuesdef cardmapper(val):

vals = '23456789TJQKA'

suits = 'cdhs'

result = divmod(val, 13)

return vals[result[1]] + suits[result[0]]

print cardmapper(44) # 7s

print cardmapper(21) # Td

print cardmapper(17) # 6d

print cardmapper(51) # As

print cardmapper(7) # 9c

print cardmapper(0) # 2c

Page 14: Poker, packets, pipes and Python

Getting live capture data

● tshark?● pcapy?● ngrep?

Too hardMaybeProbably

Page 15: Poker, packets, pipes and Python

Getting live capture data into Python

● Install pcapy on router?● zmq on router?● SSH and pipe?

Too hardToo hardMaybe

Page 16: Poker, packets, pipes and Python

Running hand analysis

● Run directly on router? Too hard

Page 17: Poker, packets, pipes and Python

Solution - ssh, ngrep and pipes

ssh $router "ngrep ..." | python -u poker-buddy.py

Page 18: Poker, packets, pipes and Python

Piping data into Python is easyYou can read stdin...import syswhile True: l = sys.stdin.readline():

Alternatively use the Unix-like fileinput module...import fileinputfor line in fileinput.input():

... fileinput reads from a list of files, or else stdin

Pipes

Page 19: Poker, packets, pipes and Python

Pipes

Watch out for buffering!

python -u

Page 20: Poker, packets, pipes and Python

Now for some poker smarts

Loads of resources on the web● Poker games generally

○ starting hand rankings○ odds calculations etc

Page 21: Poker, packets, pipes and Python

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"))

])

Page 22: Poker, packets, pipes and Python

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

Page 23: Poker, packets, pipes and Python

Codedef 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()

Page 24: Poker, packets, pipes and Python

Codedef 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)

Page 25: Poker, packets, pipes and Python

Codee = 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'])

Page 26: Poker, packets, pipes and Python

Game in progress - poker-buddy.py

Player cards [['__', '__'], ['__', '__'], ['Ac', 'Kc'], ['__', '__'], ['__', '__']]Group 1(5, 0.77)

Page 27: Poker, packets, pipes and Python

Game in progress - poker-buddy.py

Community cards ['Th', '5s', '9h']['__', '__'] 21% 20486 77811 1703['__', '__'] 21% 20267 78013 1720['Ac', 'Kc'] 15% 14880 84332 788['__', '__'] 21% 20386 77819 1795['__', '__'] 21% 20207 78074 1719

Page 28: Poker, packets, pipes and Python

Game in progress - poker-buddy.py

Community cards ['Th', '5s', '9h', 'Jc', '6s']['__', '__'] 24% 24185 74694 1121['__', '__'] 24% 24332 74502 1166['Ac', 'Kc'] 1% 1019 98870 111['__', '__'] 24% 24005 74893 1102['__', '__'] 24% 24148 74698 1154

Page 29: Poker, packets, pipes and Python

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

Page 30: Poker, packets, pipes and Python

Thanks! Questions?

Code (warts and all):https://github.com/mindsocket/poker-buddy