Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

Poker, packets, pipes and Python

3,103 views

Published on

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

Published in: Technology
  • Never played online before so was a little nervous. Signed up, deposited $20, got my free spins and bonus. Managed to win $80 on my first day, money in my bank already. GO HERE https://t.co/qfBfFJhR5l
       Reply 
    Are you sure you want to  Yes  No
    Your message goes here

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

×