tScanning and parsing QR codes using computer's camera. - electrum - Electrum Bitcoin wallet HTML git clone https://git.parazyd.org/electrum DIR Log DIR Files DIR Refs DIR Submodules --- DIR commit b21ebc0da4b5d7f726b18e007101cf9553203c0e DIR parent 09c8e956e13627a6250c3a9b12573ab6ac744956 HTML Author: slush <info@bitcoin.cz> Date: Thu, 2 Aug 2012 15:18:06 +0200 Scanning and parsing QR codes using computer's camera. Diffstat: A lib/qrscanner.py | 75 +++++++++++++++++++++++++++++++ 1 file changed, 75 insertions(+), 0 deletions(-) --- DIR diff --git a/lib/qrscanner.py b/lib/qrscanner.py t@@ -0,0 +1,75 @@ +from util import print_error + +try: + import zbar +except ImportError: + print_error("Install zbar package to enable QR scans") + zbar = None + +from urlparse import urlparse, parse_qs + +def is_available(): + if not zbar: + return False + return True + +def scan_qr(): + proc = zbar.Processor() + proc.init() + proc.visible = True + + while True: + try: + proc.process_one() + except: + # User closed the preview window + return {} + + for r in proc.results: + if str(r.type) != 'QRCODE': + continue + + return parse_uri(r.data) + +def parse_uri(uri): + if ':' not in uri: + # It's just an address (not BIP21) + return {'address': uri} + + if '//' not in uri: + # Workaround for urlparse, it don't handle bitcoin: URI properly + uri = uri.replace(':', '://') + + uri = urlparse(uri) + result = {'address': uri.netloc} + + if uri.path.startswith('?'): + params = parse_qs(uri.path[1:]) + else: + params = parse_qs(uri.path) + + for k,v in params.items(): + if k in ('amount', 'label', 'message'): + result[k] = v[0] + + return result + +if __name__ == '__main__': + # Run some tests + + assert(parse_uri('1Marek48fwU7mugmSe186do2QpUkBnpzSN') == + {'address': '1Marek48fwU7mugmSe186do2QpUkBnpzSN'}) + + assert(parse_uri('bitcoin://1Marek48fwU7mugmSe186do2QpUkBnpzSN') == + {'address': '1Marek48fwU7mugmSe186do2QpUkBnpzSN'}) + + assert(parse_uri('bitcoin:1Marek48fwU7mugmSe186do2QpUkBnpzSN') == + {'address': '1Marek48fwU7mugmSe186do2QpUkBnpzSN'}) + + assert(parse_uri('bitcoin:1Marek48fwU7mugmSe186do2QpUkBnpzSN?amount=10') == + {'amount': '10', 'address': '1Marek48fwU7mugmSe186do2QpUkBnpzSN'}) + + assert(parse_uri('bitcoin:1Marek48fwU7mugmSe186do2QpUkBnpzSN?amount=10&label=slush&message=Small%20tip%20to%20slush') == + {'amount': '10', 'label': 'slush', 'message': 'Small tip to slush', 'address': '1Marek48fwU7mugmSe186do2QpUkBnpzSN'}) + +