Un código QR (Quick Response Barcode) permite almacenar información en un código de barras de dos dimensiones.
Hay bastantes servicios en la web que nos permiten crear nuestros propios códigos, por ejemplo el de Google, que podemos emplear desde la línea de comandos:
$ curl http://chart.apis.google.com/chart?chs=150x150&cht=qr&chld=H|0&chl=texto -o qr.png
Un pequeño alias para tenerlo siempre a mano:
$ alias qrurl='qrurl() { curl http://chart.apis.google.com/chart?chs=150x150&cht=qr&chld=H|0&chl=${@// /%20} -o qr.$(date +%Y%m%d%H%M%S).png; }; qrurl'
$ qrurl una ranita iba caminando
Esto creará un fichero con un nombre parecido a qr.20110325161706.png
.
Hay un paquete que nos permite hacer esto desde la línea de comandos, es
qrencode
:
$ qrencode
qrencode version 3.1.1
Copyright (C) 2006, 2007, 2008, 2009 Kentaro Fukuchi
Usage: qrencode [OPTION]... [STRING]
Encode input data in a QR Code and save as a PNG image.
-h display this message.
--help display the usage of long options.
-o FILENAME write PNG image to FILENAME. If '-' is specified, the result
will be output to standard output. If -S is given, structured
symbols are written to FILENAME-01.png, FILENAME-02.png, ...;
if specified, remove a trailing '.png' from FILENAME.
-s NUMBER specify the size of dot (pixel). (default=3)
-l {LMQH} specify error collectin level from L (lowest) to H (highest).
(default=L)
-v NUMBER specify the version of the symbol. (default=auto)
-m NUMBER specify the width of margin. (default=4)
-S make structured symbols. Version must be specified.
-k assume that the input text contains kanji (shift-jis).
-c encode lower-case alphabet characters in 8-bit mode. (default)
-i ignore case distinctions and use only upper-case characters.
-8 encode entire data in 8-bit mode. -k, -c and -i will be ignored.
-V display the version number and copyrights of the qrencode.
[STRING] input data. If it is not specified, data will be taken from
standard input.
También hay aplicaciones para el móvil, como el Kaywa Reader, pero ahora vamos a ver cómo podemos crear y leer un código QR desde Python.
pyqrcode
pyqrcode
es una extensión para poder codificar y decodificar códigos
QR en Python. Para la codificación se ha basado en la librería
libqrencode
de Fukuchi Kentaro, y para la decodificación utiliza la
librería de qrcode de Yusuke Yanbe.
Para instalarlo se necesita:
$ sudo aptitude install jcc openjdk-6-jdk openjdk-6-jre python-imaging python-setuptools python-dev
En su página pone el Java de Sun, pero a mi también me ha ido bien con el OpenJDK.
Una vez que nos hayamos descargado el código, toca compilarlo:
$ tar xvzf pyqrcode-0.2.1.tar.gz
$ cd pyqrcode-0.2.1
$ make
Si tenemos una versión de Python superior a la 2.6, nos aparecerá el siguiente error:
python -m jcc --jar qrcode/qrcode.jar --build
/usr/bin/python: jcc is a package and cannot be directly executed
make: *** [lib] Error 1
La solución pasa por cambiar -m jcc
por -m jcc.__main__
en el
Makefile
. Quedaría así:
#GENERATE=python -m jcc --jar $(LIBFILE)
GENERATE=python -m jcc.__main__ --jar $(LIBFILE)
Ahora ya podemos instalarlo:
$ sudo make install
También podemos crear un binario a partir de la extensión:
$ sudo make egg
e instalarlo:
$ cd dist
$ sudo easy_install qrcode-0.2.1-py2.6-linux-i686.egg
Para comprobar que está correctamente instalado, podemos hacer la siguiente prueba:
$ ipython
>>> import qrcode
En Ubuntu Maverick Meerkat es posible que nos salga el siguiente error:
In [1]: import qrcode
---------------------------------------------------------------------------
AttributeError Traceback (most recent call last)
/home/karpoke/ in ()
/usr/local/lib/python2.6/dist-packages/qrcode-0.2.1-py2.6-linux-i686.egg/qrcode/__init__.py in ()
19 pass
20
---> 21 _qrcode._setExceptionTypes(JavaError, InvalidArgsError)
22
23 VERSION = "0.2.1"
AttributeError: 'module' object has no attribute '_setExceptionTypes'
Después de ver el código que da este error, una posible solución es
comentar la línea del fichero qrcode/__init__.py
que da el error.
# _qrcode._setExceptionTypes(JavaError, InvalidArgsError)
Volvemos a generar el huevo y lo volvemos a instalar:
$ sudo make egg
$ sudo easy_install qrcode-0.2.1-py2.6-linux-i686.egg
Este python egg se puede descargar desde el directorio público.
Ya podemos hacer una prueba para crear un código QR:
import sys, qrcode
e = qrcode.Encoder()
image = e.encode('ando con la mirada fija en el cielo', version=3, mode=e.mode.BINARY, eclevel=e.eclevel.H)
image.save('out.png')
Para decodificar:
import sys, qrcode
d = qrcode.Decoder()
print d.result if d.decode("out.png") else "error"
En el terminal
Para hacer aún más cómoda la decodificación desde el terminal, vamos a
crear un alias, qrdecode
:
# $1 filename
alias qrdecode='fqrdecode() { python -c "import qrcode;d=qrcode.Decoder();print d.result if d.decode('\''$1'\'') else '\''Error'\''"; }; fqrdecode'
Para crear un QR desde la línea de comandos ya tenemos el paquete
qrencode
comentado anteriormente.
$ qrencode "texto a poner en el código qr" -o out.png
$ qrdecode out.png
texto a poner en el código qr
Usando la webcam
La biblioteca libdecodeqr
contiene un lector de códigos QR usando la
webcam. Para utilizarlo, ejecutamos:
$ libdecodeqr-webcam