Your SlideShare is downloading. ×
0
The adventures of poker,  packets, pipes and        Python        Roger Barnes
I like playing online poker
But I could be better at it
I needed a poker buddy                             All in!              Thats a            terrible hand!
Live Holdem Poker Pro
Packet capture optionsfrom your (rooted) Android device - wifi or 3G● apps - eg Shark for Root● tcpdump - via shell
Packet capture optionsfrom your router or another device on thenetwork (if promiscuous mode) - wifi only● tcpdump/libpcap●...
Hackable routersThere are many devices and firmwares tochoose from (see dd-wrt and tomato-usb)I have Netgear WNR3500L with...
Initial capture using tsharktshark -i eth1 -w capture.pcap -f"host 192.168.1.106 and(port 9400 or port 9500)"
Analyse using wireshark - bingo!
IPython Notebook  http://ipython.org/ipython-doc/dev/interactive/htmlnotebook.html
Parsing game stateMore IPython notebook work to figure outsequence of events, card values, player actionsetc
Mapping card valuesdef cardmapper(val):   vals = 23456789TJQKA   suits = cdhs   result = divmod(val, 13)   return vals[res...
Getting live capture data● tshark?              Too hard● pcapy?               Maybe● ngrep?               Probably
Getting live capture data into Python● Install pcapy on router?   Too hard● zmq on router?             Too hard● SSH and p...
Running hand analysis● Run directly on router?   Too hard
Solution - ssh, ngrep and pipesssh $router "ngrep ..." | python -u poker-buddy.py
PipesPiping data into Python is easyYou can read stdin...import syswhile True:    l = sys.stdin.readline():Alternatively u...
PipesWatch out for buffering!python -u
Now for some poker smartsLoads of resources on the web● Poker games generally  ○ starting hand rankings  ○ odds calculatio...
Now for some poker smartsEasy lookup tables in python...# Unprocessed space separated string dumpstats_rankings = """AA   ...
Now for some poker smartsPython specific● pypoker-eval  ○ Wrapper for poker-eval toolkit  ○ Run hand simulations● machine ...
Codedef read_raw_from_stdin():    line =     while 1:        l = sys.stdin.readline()        line += l.strip()        if w...
Codedef parse_update(update_str):    player_cards = get_cards(update_str)    if player_cards:        my_cards = [v for v i...
Codee = PokerEval()def rank_hand(pocket_cards, community_cards, iterations=100000):  unknown_cards = [__] * (5 - len(commu...
Game in progress - poker-buddy.pyPlayer cards [[__, __], [__, __], [Ac, Kc],[__, __], [__, __]]Group 1(5, 0.77)
Game in progress - poker-buddy.pyCommunity cards [Th, 5s, 9h][__, __] 21% 20486 77811 1703[__, __] 21% 20267 78013 1720[Ac...
Game in progress - poker-buddy.pyCommunity cards [Th, 5s, 9h, Jc, 6s][__, __] 24% 24185 74694 1121[__, __] 24% 24332 74502...
Summary● Python can be used for packet capture   ○ pycapy● Python for data processing   ○ Pipes, unbuffered input (-u opti...
Thanks! Questions?Code (warts and all):https://github.com/mindsocket/poker-buddy
Upcoming SlideShare
Loading in...5
×

Poker, packets, pipes and Python

2,258

Published on

An adventure of light-hearted discovery, using python and other tools to poke around in an online poker game

Published in: Technology

Transcript of "Poker, packets, pipes and Python"

  1. 1. The adventures of poker, packets, pipes and Python Roger Barnes
  2. 2. I like playing online poker
  3. 3. But I could be better at it
  4. 4. I needed a poker buddy All in! Thats a terrible hand!
  5. 5. Live Holdem Poker Pro
  6. 6. Packet capture optionsfrom your (rooted) Android device - wifi or 3G● apps - eg Shark for Root● tcpdump - via shell
  7. 7. Packet capture optionsfrom your router or another device on thenetwork (if promiscuous mode) - wifi only● tcpdump/libpcap● wireshark/tshark● pcapy● ngrep
  8. 8. Hackable routersThere are many devices and firmwares tochoose 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. 9. Initial capture using tsharktshark -i eth1 -w capture.pcap -f"host 192.168.1.106 and(port 9400 or port 9500)"
  10. 10. Analyse using wireshark - bingo!
  11. 11. IPython Notebook http://ipython.org/ipython-doc/dev/interactive/htmlnotebook.html
  12. 12. Parsing game stateMore IPython notebook work to figure outsequence of events, card values, player actionsetc
  13. 13. Mapping card valuesdef cardmapper(val): vals = 23456789TJQKA suits = cdhs result = divmod(val, 13) return vals[result[1]] + suits[result[0]]print cardmapper(44) # 7sprint cardmapper(21) # Tdprint cardmapper(17) # 6dprint cardmapper(51) # Asprint cardmapper(7) # 9cprint cardmapper(0) # 2c
  14. 14. Getting live capture data● tshark? Too hard● pcapy? Maybe● ngrep? Probably
  15. 15. Getting live capture data into Python● Install pcapy on router? Too hard● zmq on router? Too hard● SSH and pipe? Maybe
  16. 16. Running hand analysis● Run directly on router? Too hard
  17. 17. Solution - ssh, ngrep and pipesssh $router "ngrep ..." | python -u poker-buddy.py
  18. 18. PipesPiping data into Python is easyYou can read stdin...import syswhile True: l = sys.stdin.readline():Alternatively use the Unix-like fileinputmodule...import fileinputfor line in fileinput.input():... fileinput reads from a list of files, or else stdin
  19. 19. PipesWatch out for buffering!python -u
  20. 20. Now for some poker smartsLoads of resources on the web● Poker games generally ○ starting hand rankings ○ odds calculations etc
  21. 21. Now for some poker smartsEasy lookup tables in python...# Unprocessed space separated string dumpstats_rankings = """AA 2.3200 550,632KK 1.6700 551,878... lots more lines32s -0.1600 369,182"""# Now convert to structured datastats_rankings = dict([ (line.split()[0], (rank + 1, float(line.split()[1]))) for rank, line in enumerate(stats_rankings.split("n"))])
  22. 22. Now for some poker smartsPython 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. 23. 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()
  24. 24. 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)
  25. 25. 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])
  26. 26. Game in progress - poker-buddy.pyPlayer cards [[__, __], [__, __], [Ac, Kc],[__, __], [__, __]]Group 1(5, 0.77)
  27. 27. Game in progress - poker-buddy.pyCommunity 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
  28. 28. Game in progress - poker-buddy.pyCommunity 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
  29. 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● Theres a library for almost everything ○ eg pypoker-eval
  30. 30. Thanks! Questions?Code (warts and all):https://github.com/mindsocket/poker-buddy
  1. A particular slide catching your eye?

    Clipping is a handy way to collect important slides you want to go back to later.

×