SlideShare une entreprise Scribd logo
1  sur  30
Télécharger pour lire hors ligne
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!




              That's a
            terrible hand!
Live Hold'em Poker Pro
Packet capture options
from your (rooted) Android device - wifi or 3G
● apps - eg Shark for Root
● tcpdump - via shell
Packet capture options
from your router or another device on the
network (if promiscuous mode) - wifi only
● tcpdump/libpcap
● wireshark/tshark
● pcapy
● ngrep
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, ...
Initial capture using tshark

tshark -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 state
More IPython notebook work to figure out
sequence of events, card values, player actions
etc
Mapping card values
def 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
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 pipe?              Maybe
Running hand analysis
● Run directly on router?   Too hard
Solution - ssh, ngrep and pipes




ssh $router "ngrep ..." | python -u poker-buddy.py
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
Pipes
Watch out for buffering!

python -u
Now for some poker smarts
Loads of resources on the web
● Poker games generally
  ○ starting hand rankings
  ○ odds calculations etc
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"))
])
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
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()
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)
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'])
Game in progress - poker-buddy.py
Player cards [['__', '__'], ['__', '__'], ['Ac', 'Kc'],
['__', '__'], ['__', '__']]
Group 1
(5, 0.77)
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
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
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
Thanks! Questions?




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

Contenu connexe

Tendances

5.0 topologie réseaux
5.0 topologie réseaux5.0 topologie réseaux
5.0 topologie réseaux
Osi Pallière
 
ASA Multiple Context Training
ASA Multiple Context TrainingASA Multiple Context Training
ASA Multiple Context Training
Tariq Bader
 

Tendances (20)

Wireshark, Tcpdump and Network Performance tools
Wireshark, Tcpdump and Network Performance toolsWireshark, Tcpdump and Network Performance tools
Wireshark, Tcpdump and Network Performance tools
 
Private VLANs
Private VLANsPrivate VLANs
Private VLANs
 
Introduction to Layer 2 switching
Introduction to Layer 2 switchingIntroduction to Layer 2 switching
Introduction to Layer 2 switching
 
IEEE 802.1 x
IEEE 802.1 xIEEE 802.1 x
IEEE 802.1 x
 
Firewall PPT
Firewall PPTFirewall PPT
Firewall PPT
 
5.0 topologie réseaux
5.0 topologie réseaux5.0 topologie réseaux
5.0 topologie réseaux
 
Network analysis Using Wireshark Lesson 11: TCP and UDP Analysis
Network analysis Using Wireshark Lesson 11: TCP and UDP AnalysisNetwork analysis Using Wireshark Lesson 11: TCP and UDP Analysis
Network analysis Using Wireshark Lesson 11: TCP and UDP Analysis
 
INTRODUCTION TO NETWORK LAYER
INTRODUCTION TO NETWORK LAYER INTRODUCTION TO NETWORK LAYER
INTRODUCTION TO NETWORK LAYER
 
Virtuals LAN
Virtuals LANVirtuals LAN
Virtuals LAN
 
ASA Multiple Context Training
ASA Multiple Context TrainingASA Multiple Context Training
ASA Multiple Context Training
 
Netmanias L2,L3 Training (1) L2 Ethernet
Netmanias L2,L3 Training (1) L2 EthernetNetmanias L2,L3 Training (1) L2 Ethernet
Netmanias L2,L3 Training (1) L2 Ethernet
 
Wireshark network analysing software
Wireshark network analysing softwareWireshark network analysing software
Wireshark network analysing software
 
MAC Address – All you Need to Know About it
MAC Address – All you Need to Know About itMAC Address – All you Need to Know About it
MAC Address – All you Need to Know About it
 
Firewall
FirewallFirewall
Firewall
 
Mikrotik advanced
Mikrotik advancedMikrotik advanced
Mikrotik advanced
 
Mikro tik advanced training
Mikro tik advanced trainingMikro tik advanced training
Mikro tik advanced training
 
Access Control List 1
Access Control List 1Access Control List 1
Access Control List 1
 
Wireshark Tutorial
Wireshark TutorialWireshark Tutorial
Wireshark Tutorial
 
VLAN
VLANVLAN
VLAN
 
Transmission Media_Tanenbaum.ppt
Transmission Media_Tanenbaum.pptTransmission Media_Tanenbaum.ppt
Transmission Media_Tanenbaum.ppt
 

En vedette

Realize Gaming - Video Poker Sell Book
Realize Gaming - Video Poker Sell BookRealize Gaming - Video Poker Sell Book
Realize Gaming - Video Poker Sell Book
Timothy Nottke
 
Introduction Priority Poker (En)
Introduction Priority Poker (En)Introduction Priority Poker (En)
Introduction Priority Poker (En)
SwissQ Consulting AG
 
Infiniti Poker Marketing Plan - MBA Marketing Class
Infiniti Poker Marketing Plan - MBA Marketing ClassInfiniti Poker Marketing Plan - MBA Marketing Class
Infiniti Poker Marketing Plan - MBA Marketing Class
Sam Bishop
 
Product Market Fit Poker
Product Market Fit PokerProduct Market Fit Poker
Product Market Fit Poker
Matt Johnson
 

En vedette (20)

Ultimate Poker Tour - Press Kit
Ultimate Poker Tour - Press KitUltimate Poker Tour - Press Kit
Ultimate Poker Tour - Press Kit
 
Realize Gaming - Video Poker Sell Book
Realize Gaming - Video Poker Sell BookRealize Gaming - Video Poker Sell Book
Realize Gaming - Video Poker Sell Book
 
Another Side of Poker | Anatolii Henis
Another Side of Poker | Anatolii HenisAnother Side of Poker | Anatolii Henis
Another Side of Poker | Anatolii Henis
 
The Strathclyde Poker Research Environment
The Strathclyde Poker Research EnvironmentThe Strathclyde Poker Research Environment
The Strathclyde Poker Research Environment
 
"Bwin - P5 a future proof Poker platform"
"Bwin - P5 a future proof Poker platform""Bwin - P5 a future proof Poker platform"
"Bwin - P5 a future proof Poker platform"
 
Planning poker in a nutshell
Planning poker in a nutshellPlanning poker in a nutshell
Planning poker in a nutshell
 
Tech Talk: Standup Poker: How One Hack Revolutionized Our Daily Standup
Tech Talk: Standup Poker: How One Hack Revolutionized Our Daily StandupTech Talk: Standup Poker: How One Hack Revolutionized Our Daily Standup
Tech Talk: Standup Poker: How One Hack Revolutionized Our Daily Standup
 
Poker in Numbers
Poker in NumbersPoker in Numbers
Poker in Numbers
 
Beyond Planning Poker - Agile 2011
Beyond Planning Poker - Agile 2011Beyond Planning Poker - Agile 2011
Beyond Planning Poker - Agile 2011
 
Use of cognitive and performance enhancing medications in poker players
Use of cognitive and performance enhancing medications in poker playersUse of cognitive and performance enhancing medications in poker players
Use of cognitive and performance enhancing medications in poker players
 
Introduction Priority Poker (En)
Introduction Priority Poker (En)Introduction Priority Poker (En)
Introduction Priority Poker (En)
 
The Art Of War In Poker
The Art Of War In PokerThe Art Of War In Poker
The Art Of War In Poker
 
Poker Boom in the Video Game Industry | Pawel Weder
Poker Boom in the Video Game Industry | Pawel WederPoker Boom in the Video Game Industry | Pawel Weder
Poker Boom in the Video Game Industry | Pawel Weder
 
Infiniti Poker Marketing Plan - MBA Marketing Class
Infiniti Poker Marketing Plan - MBA Marketing ClassInfiniti Poker Marketing Plan - MBA Marketing Class
Infiniti Poker Marketing Plan - MBA Marketing Class
 
Basic Poker Strategy
Basic Poker StrategyBasic Poker Strategy
Basic Poker Strategy
 
AI Strategies for Solving Poker Texas Hold'em
AI Strategies for Solving Poker Texas Hold'emAI Strategies for Solving Poker Texas Hold'em
AI Strategies for Solving Poker Texas Hold'em
 
The cost of irrationality - how poker players perform better by avoiding cogn...
The cost of irrationality - how poker players perform better by avoiding cogn...The cost of irrationality - how poker players perform better by avoiding cogn...
The cost of irrationality - how poker players perform better by avoiding cogn...
 
Planning Poker estimating technique
Planning Poker estimating techniquePlanning Poker estimating technique
Planning Poker estimating technique
 
Product Market Fit Poker
Product Market Fit PokerProduct Market Fit Poker
Product Market Fit Poker
 
Ontology of Poker
Ontology of PokerOntology of Poker
Ontology of Poker
 

Similaire à Poker, packets, pipes and Python

Rootkit on Linux X86 v2.6
Rootkit on Linux X86 v2.6Rootkit on Linux X86 v2.6
Rootkit on Linux X86 v2.6
fisher.w.y
 
ExperiencesSharingOnEmbeddedSystemDevelopment_20160321
ExperiencesSharingOnEmbeddedSystemDevelopment_20160321ExperiencesSharingOnEmbeddedSystemDevelopment_20160321
ExperiencesSharingOnEmbeddedSystemDevelopment_20160321
Teddy Hsiung
 
Python utan-stodhjul-motorsag
Python utan-stodhjul-motorsagPython utan-stodhjul-motorsag
Python utan-stodhjul-motorsag
niklal
 
Simplest-Ownage-Human-Observed… - Routers
 Simplest-Ownage-Human-Observed… - Routers Simplest-Ownage-Human-Observed… - Routers
Simplest-Ownage-Human-Observed… - Routers
Logicaltrust pl
 
Filip palian mateuszkocielski. simplest ownage human observed… routers
Filip palian mateuszkocielski. simplest ownage human observed… routersFilip palian mateuszkocielski. simplest ownage human observed… routers
Filip palian mateuszkocielski. simplest ownage human observed… routers
Yury Chemerkin
 
Assignment no39
Assignment no39Assignment no39
Assignment no39
Jay Patel
 

Similaire à Poker, packets, pipes and Python (20)

Debug generic process
Debug generic processDebug generic process
Debug generic process
 
A CTF Hackers Toolbox
A CTF Hackers ToolboxA CTF Hackers Toolbox
A CTF Hackers Toolbox
 
Capturing NIC and Kernel TX and RX Timestamps for Packets in Go
Capturing NIC and Kernel TX and RX Timestamps for Packets in GoCapturing NIC and Kernel TX and RX Timestamps for Packets in Go
Capturing NIC and Kernel TX and RX Timestamps for Packets in Go
 
Pycon Sec
Pycon SecPycon Sec
Pycon Sec
 
R-House (LSRC)
R-House (LSRC)R-House (LSRC)
R-House (LSRC)
 
Basic Linux kernel
Basic Linux kernelBasic Linux kernel
Basic Linux kernel
 
Rootkit on Linux X86 v2.6
Rootkit on Linux X86 v2.6Rootkit on Linux X86 v2.6
Rootkit on Linux X86 v2.6
 
Playing CTFs for Fun & Profit
Playing CTFs for Fun & ProfitPlaying CTFs for Fun & Profit
Playing CTFs for Fun & Profit
 
ExperiencesSharingOnEmbeddedSystemDevelopment_20160321
ExperiencesSharingOnEmbeddedSystemDevelopment_20160321ExperiencesSharingOnEmbeddedSystemDevelopment_20160321
ExperiencesSharingOnEmbeddedSystemDevelopment_20160321
 
Python utan-stodhjul-motorsag
Python utan-stodhjul-motorsagPython utan-stodhjul-motorsag
Python utan-stodhjul-motorsag
 
C&cpu
C&cpuC&cpu
C&cpu
 
Deep learning - the conf br 2018
Deep learning - the conf br 2018Deep learning - the conf br 2018
Deep learning - the conf br 2018
 
pa-pe-pi-po-pure Python Text Processing
pa-pe-pi-po-pure Python Text Processingpa-pe-pi-po-pure Python Text Processing
pa-pe-pi-po-pure Python Text Processing
 
Simplest-Ownage-Human-Observed… - Routers
 Simplest-Ownage-Human-Observed… - Routers Simplest-Ownage-Human-Observed… - Routers
Simplest-Ownage-Human-Observed… - Routers
 
Filip palian mateuszkocielski. simplest ownage human observed… routers
Filip palian mateuszkocielski. simplest ownage human observed… routersFilip palian mateuszkocielski. simplest ownage human observed… routers
Filip palian mateuszkocielski. simplest ownage human observed… routers
 
LSFMM 2019 BPF Observability
LSFMM 2019 BPF ObservabilityLSFMM 2019 BPF Observability
LSFMM 2019 BPF Observability
 
Data Analysis in Python
Data Analysis in PythonData Analysis in Python
Data Analysis in Python
 
CONFidence 2015: DTrace + OSX = Fun - Andrzej Dyjak
CONFidence 2015: DTrace + OSX = Fun - Andrzej Dyjak   CONFidence 2015: DTrace + OSX = Fun - Andrzej Dyjak
CONFidence 2015: DTrace + OSX = Fun - Andrzej Dyjak
 
Gpu workshop cluster universe: scripting cuda
Gpu workshop cluster universe: scripting cudaGpu workshop cluster universe: scripting cuda
Gpu workshop cluster universe: scripting cuda
 
Assignment no39
Assignment no39Assignment no39
Assignment no39
 

Plus de Roger Barnes

Scraping recalcitrant web sites with Python & Selenium
Scraping recalcitrant web sites with Python & SeleniumScraping recalcitrant web sites with Python & Selenium
Scraping recalcitrant web sites with Python & Selenium
Roger Barnes
 

Plus de Roger Barnes (6)

The life of a web request - techniques for measuring and improving Django app...
The life of a web request - techniques for measuring and improving Django app...The life of a web request - techniques for measuring and improving Django app...
The life of a web request - techniques for measuring and improving Django app...
 
Building data flows with Celery and SQLAlchemy
Building data flows with Celery and SQLAlchemyBuilding data flows with Celery and SQLAlchemy
Building data flows with Celery and SQLAlchemy
 
Introduction to SQL Alchemy - SyPy June 2013
Introduction to SQL Alchemy - SyPy June 2013Introduction to SQL Alchemy - SyPy June 2013
Introduction to SQL Alchemy - SyPy June 2013
 
Towards Continuous Deployment with Django
Towards Continuous Deployment with DjangoTowards Continuous Deployment with Django
Towards Continuous Deployment with Django
 
Scraping recalcitrant web sites with Python & Selenium
Scraping recalcitrant web sites with Python & SeleniumScraping recalcitrant web sites with Python & Selenium
Scraping recalcitrant web sites with Python & Selenium
 
Intro to Pinax: Kickstarting Your Django Apps
Intro to Pinax: Kickstarting Your Django AppsIntro to Pinax: Kickstarting Your Django Apps
Intro to Pinax: Kickstarting Your Django Apps
 

Dernier

Architecting Cloud Native Applications
Architecting Cloud Native ApplicationsArchitecting Cloud Native Applications
Architecting Cloud Native Applications
WSO2
 
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers:  A Deep Dive into Serverless Spatial Data and FMECloud Frontiers:  A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
Safe Software
 

Dernier (20)

Corporate and higher education May webinar.pptx
Corporate and higher education May webinar.pptxCorporate and higher education May webinar.pptx
Corporate and higher education May webinar.pptx
 
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
 
MINDCTI Revenue Release Quarter One 2024
MINDCTI Revenue Release Quarter One 2024MINDCTI Revenue Release Quarter One 2024
MINDCTI Revenue Release Quarter One 2024
 
GenAI Risks & Security Meetup 01052024.pdf
GenAI Risks & Security Meetup 01052024.pdfGenAI Risks & Security Meetup 01052024.pdf
GenAI Risks & Security Meetup 01052024.pdf
 
A Beginners Guide to Building a RAG App Using Open Source Milvus
A Beginners Guide to Building a RAG App Using Open Source MilvusA Beginners Guide to Building a RAG App Using Open Source Milvus
A Beginners Guide to Building a RAG App Using Open Source Milvus
 
EMPOWERMENT TECHNOLOGY GRADE 11 QUARTER 2 REVIEWER
EMPOWERMENT TECHNOLOGY GRADE 11 QUARTER 2 REVIEWEREMPOWERMENT TECHNOLOGY GRADE 11 QUARTER 2 REVIEWER
EMPOWERMENT TECHNOLOGY GRADE 11 QUARTER 2 REVIEWER
 
Strategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
Strategize a Smooth Tenant-to-tenant Migration and Copilot TakeoffStrategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
Strategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
 
AXA XL - Insurer Innovation Award Americas 2024
AXA XL - Insurer Innovation Award Americas 2024AXA XL - Insurer Innovation Award Americas 2024
AXA XL - Insurer Innovation Award Americas 2024
 
presentation ICT roal in 21st century education
presentation ICT roal in 21st century educationpresentation ICT roal in 21st century education
presentation ICT roal in 21st century education
 
Architecting Cloud Native Applications
Architecting Cloud Native ApplicationsArchitecting Cloud Native Applications
Architecting Cloud Native Applications
 
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
 
Strategies for Landing an Oracle DBA Job as a Fresher
Strategies for Landing an Oracle DBA Job as a FresherStrategies for Landing an Oracle DBA Job as a Fresher
Strategies for Landing an Oracle DBA Job as a Fresher
 
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers:  A Deep Dive into Serverless Spatial Data and FMECloud Frontiers:  A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
 
Manulife - Insurer Transformation Award 2024
Manulife - Insurer Transformation Award 2024Manulife - Insurer Transformation Award 2024
Manulife - Insurer Transformation Award 2024
 
Web Form Automation for Bonterra Impact Management (fka Social Solutions Apri...
Web Form Automation for Bonterra Impact Management (fka Social Solutions Apri...Web Form Automation for Bonterra Impact Management (fka Social Solutions Apri...
Web Form Automation for Bonterra Impact Management (fka Social Solutions Apri...
 
Boost Fertility New Invention Ups Success Rates.pdf
Boost Fertility New Invention Ups Success Rates.pdfBoost Fertility New Invention Ups Success Rates.pdf
Boost Fertility New Invention Ups Success Rates.pdf
 
Apidays Singapore 2024 - Modernizing Securities Finance by Madhu Subbu
Apidays Singapore 2024 - Modernizing Securities Finance by Madhu SubbuApidays Singapore 2024 - Modernizing Securities Finance by Madhu Subbu
Apidays Singapore 2024 - Modernizing Securities Finance by Madhu Subbu
 
A Year of the Servo Reboot: Where Are We Now?
A Year of the Servo Reboot: Where Are We Now?A Year of the Servo Reboot: Where Are We Now?
A Year of the Servo Reboot: Where Are We Now?
 
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemke
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemkeProductAnonymous-April2024-WinProductDiscovery-MelissaKlemke
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemke
 
Ransomware_Q4_2023. The report. [EN].pdf
Ransomware_Q4_2023. The report. [EN].pdfRansomware_Q4_2023. The report. [EN].pdf
Ransomware_Q4_2023. The report. [EN].pdf
 

Poker, packets, pipes and Python

  • 1. The adventures of poker, packets, pipes and Python Roger Barnes
  • 2. I like playing online poker
  • 3. But I could be better at it
  • 4. I needed a poker buddy All in! That's a terrible hand!
  • 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)"
  • 11. IPython Notebook http://ipython.org/ipython-doc/dev/interactive/htmlnotebook.html
  • 12. Parsing game state More IPython notebook work to figure out sequence of events, card values, player actions etc
  • 13. Mapping card values def 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
  • 14. Getting live capture data ● tshark? Too hard ● pcapy? Maybe ● ngrep? Probably
  • 15. Getting live capture data into Python ● Install pcapy on router? Too hard ● zmq on router? Too hard ● SSH and pipe? Maybe
  • 16. Running hand analysis ● Run directly on router? Too hard
  • 17. Solution - ssh, ngrep and pipes ssh $router "ngrep ..." | python -u poker-buddy.py
  • 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
  • 19. Pipes Watch out for buffering! python -u
  • 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)
  • 27. 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
  • 28. 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
  • 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
  • 30. Thanks! Questions? Code (warts and all): https://github.com/mindsocket/poker-buddy