Publicado · 24 de septiembre de 2026
Genera códigos QR desde tu propio código: Python y JavaScript sin API
No necesitas una API alojada para generar códigos QR en tu propio proyecto. Las librerías qrcode y segno de Python, y qrcodegen de Nayuki para JavaScript, codifican todo en el dispositivo — gratis, sin conexión, y sin que el dato de destino salga nunca de tu máquina.
Respuesta rápida
No necesitas una API para generar un código QR desde tu propio código. En Python, pip install qrcode[pil] o pip install segno te da un generador funcional con una sola llamada. En JavaScript, la librería qrcodegen de Nayuki ejecuta la misma lógica de codificación en el navegador o en Node — sin ida y vuelta al servidor, sin límite de solicitudes, y sin que nada de lo que codifiques salga de tu máquina. A continuación: un ejemplo funcional en cada lenguaje, más los problemas típicos que suelen atrapar a la gente la primera vez.
Paso a paso: Python
Instalar y generar con qrcode
El paquete qrcode es la opción por defecto para la mayoría de proyectos en Python. Instálalo con el extra de Pillow para que realmente pueda renderizar una imagen, no solo datos:
pip install qrcode[pil]
La versión de una sola línea:
import qrcode
img = qrcode.make("https://example.com")
img.save("code.png")
¿Necesitas control sobre el tamaño y la corrección de errores? Usa la clase QRCode directamente:
import qrcode
qr = qrcode.QRCode(
version=1,
box_size=10,
border=4,
error_correction=qrcode.constants.ERROR_CORRECT_M,
)
qr.add_data("https://example.com")
qr.make(fit=True)
img = qr.make_image(fill_color="black", back_color="white")
img.save("code.png")
version define el tamaño físico — de 1 a 40, y cuánta información puede contener cada versión también depende del nivel de corrección de errores. fit=True elige automáticamente la versión más pequeña que encaja, así que casi nunca necesitas fijar version a mano. error_correction acepta ERROR_CORRECT_L, _M, _Q o _H — aproximadamente el 7%, 15%, 25% y 30% del código puede dañarse y aun así escanearse, en ese orden. box_size son los píxeles por módulo; border es la zona de silencio.
Alternativa sin dependencias: segno
¿No eres fan de incluir Pillow? segno no tiene dependencias de terceros y admite más formatos de salida — data URIs en SVG/PNG, PDF, arte ANSI de terminal, LaTeX — además de Micro QR Codes y Structured Append, que qrcode no tiene. La llamada es casi idéntica:
import segno
qr = segno.make("https://example.com")
qr.save("code.svg")
Quédate con qrcode si ya usas Pillow y solo quieres un PNG estándar. Ve con segno si buscas un árbol de dependencias más pequeño o uno de sus formatos adicionales.
Paso a paso: JavaScript
Para el navegador o Node, qrcodegen de Nayuki es una opción sólida por defecto. El mismo algoritmo está portado fielmente a Java, TypeScript/JavaScript, Python, Rust, C++ y C, así que el resultado es idéntico sin importar qué lenguaje lo generó — licencia MIT, sin dependencias, cerca de 1000 líneas. Se distribuye como un único archivo JavaScript compilado, sin necesidad de bundler, y también está en npm.
const QRC = qrcodegen.QrCode;
const qr = QRC.encodeText("https://example.com", QRC.Ecc.MEDIUM);
const svg = toSvgString(qr, 4); // zona de silencio de 4 módulos
¿Quieres más control? Construye los segmentos manualmente y pásalos a encodeSegments, que también acepta límites explícitos de versión mínima/máxima y una máscara personalizada:
const segs = qrcodegen.QrSegment.makeSegments("Hello, world!");
const qr = QRC.encodeSegments(segs, QRC.Ecc.HIGH, 5, 5, 2, false);
// qr.getModule(x, y) es true (oscuro) o false (claro) — pinta cada módulo
Como todo se ejecuta en el cliente, esta es también la opción cuando quieres que la generación de QR siga funcionando aunque se caiga la conexión del usuario — no hay ninguna solicitud que pueda fallar.
Problemas comunes y cómo resolverlos
El código salió más grande de lo esperado. Casi siempre es el nivel de corrección de errores, no un error del código — una corrección de errores más alta añade redundancia, lo que obliga a la librería a usar una versión mayor (más módulos) para el mismo contenido. Consulta cómo afecta la corrección de errores al código que generas. Si el tamaño importa más que la tolerancia a daños, baja de ERROR_CORRECT_H a _M o _L.
Mi código se ve distinto al de uno generado en un sitio web con los mismos datos. Ambos probablemente son correctos. qrcode y qrcodegen usan por defecto el patrón de máscara 4, mientras que la implementación de referencia ISO/IEC 18004:2015 usa la máscara 5 — consulta por qué los mismos datos pueden renderizarse como un código con apariencia distinta. Cualquier lector estándar escanea cualquiera de los dos sin problema.
¿Debería fijar la versión manualmente? Normalmente no — deja que la librería la ajuste automáticamente (fit=True en qrcode, o un rango de versión automático en qrcodegen), y solo fija una versión si tienes una restricción de tamaño estricta, como una dimensión de impresión específica.
Cómo hacer esto en QRDock específicamente
¿Solo necesitas un código QR — un enlace, una red Wi-Fi, una vCard? Sáltate la librería y usa qrdock.app directamente; es más rápido que escribir un script para un solo código. El enfoque con Python/JavaScript se justifica cuando generas códigos de forma programática: cientos de códigos únicos desde una base de datos, o creando un lote a partir de una hoja de cálculo con SKUs o nombres de invitados.
Preguntas frecuentes
¿Necesito una clave de API para generar códigos QR en Python o JavaScript?
No. Librerías como qrcode y segno en Python, y qrcodegen en JavaScript, codifican la matriz del QR completamente en tu máquina o en el navegador — no hay llamada de red, no hay límite de solicitudes, y ningún tercero ve jamás el dato que estás codificando.
¿Qué librería de Python debería usar: qrcode o segno?
Usa qrcode si ya dependes de Pillow y solo necesitas un PNG o SVG rápido — es la opción más común. Usa segno si quieres cero dependencias, necesitas formatos de salida como data URIs o arte ANSI de terminal, o necesitas soporte de Micro QR / Structured Append que qrcode no tiene.
¿Puedo generar un código QR en JavaScript puro sin un paso de build?
Sí. El qrcodegen de Nayuki se compila en un único archivo JavaScript que puedes incluir directamente en una página del navegador o en un script de Node — sin necesidad de bundler — y también está publicado en npm si prefieres instalarlo como dependencia.
¿Por qué un código QR generado localmente se ve distinto de uno hecho en un sitio web?
Los datos subyacentes pueden ser idénticos aunque el patrón de máscara sea distinto — qrcode y qrcodegen usan por defecto la máscara 4, mientras que la implementación de referencia ISO/IEC 18004:2015 usa la máscara 5. Ambos son perfectamente escaneables; el patrón visual de módulos claros y oscuros es simplemente una codificación distinta, pero igual de válida.