Generar código QR con datos en Golang

En este artículo, vamos a demostrar cómo generar un código de respuesta rápida (QR) usando Golang. Un código QR es un código de barras bidimensional que almacena información como el código de barras de línea tradicional unidimensional. Inicialmente es desarrollado por la industria automotriz japonesa, pero a lo largo del año se ha adoptado en otras industrias. Los códigos QR fueron aprobados por ISO en 2000 como estándar internacional y las especificaciones se pueden encontrar aquí. Para obtener más información sobre el código QR, consulte esta página wiki.

Una forma de minimizar el problema de la Ingeniería Social en las empresas. Es una buena idea usar códigos QR, ya que los seres humanos no pueden saber con solo mirar un código QR si es malicioso o no. Por otro lado, la mayoría de las veces, los códigos QR contienen una URL que se cargará inmediatamente, dejando al usuario expuesto al riesgo. Por eso es importante crear un pretexto aceptable para convencer a un usuario de que confíe en el código QR.

Para generar código QR en Golang, vamos a utilizar en este ejemplo la biblioteca go-qrcode.

Antes de comenzar a escribir códigos tenemos que importar la biblioteca, asegúrese de que su GOPATH esté configurado correctamente. Para obtener más información sobre cómo configurar su GOPATH, consulte estos artículos:

– Para usuarios de MACOS

– Para usuarios de Windows

– Para usuarios de Linux

Importación de la biblioteca go-qrcode

Después de verificar que su GOPATH está configurado, abra la terminal e ingrese el siguiente comando:

go get -u github.com/skip2/go-qrcode/...

El () al final significa wildcard en Go que significa que los subpaquetes sera instalado.

En este ejemplo, vamos a crear una aplicación que puede generar bytes PNG sin procesar y también la capacidad de iniciar un servidor que devuelve una página HTML con el código QR incrustado.

Servidor de página web de código QR

Vamos a iniciar con la implementación del servidor que albergará la página HTML. Para obtener más información sobre el servicio web en Go, consulte este artículo.

func iniciarServidor() {

	enrutador := httprouter.New()  // instancia de enrutador
	enrutador.GET("/", enviarCodigoQR) // página de destino

	fmt.Println("servidor escuchando atraves del puerto 3000")
	errorDelServidor := http.ListenAndServe(":3000", enrutador)
	if errorDelServidor != nil {
		log.Fatal("No se puede iniciar el servidor web, causa: ", errorDelServidor)
	}
}

Función que genera la página HTML

Si ya tienes conocimiento en la implementación de los servicios web en Go, el siguiente función explica por sí mismo. Maneja la solicitud generando la etiqueta de imagen de código QR y la incrusta en una página HTML.

func enviarCodigoQR(respuesta http.ResponseWriter, _ *http.Request, _ httprouter.Params) {

	// Generar etiqueta de imagen HTML de código QR
	etiqueta_de_imagen_de_codigo_qr := generarEtiquetaDeImagenHtmlDeCodigoQR()

	// Establecer el encabezado de respuesta en Estado Ok (200)
	respuesta.WriteHeader(http.StatusOK)

	// Imagen HTML con código QR incrustado
	paginaDeRepuestaHtml := "<!DOCTYPE html><html><body><h1>Ejemplo de código QR Go Dev Tips</h1>" + etiqueta_de_imagen_de_codigo_qr + "</body></html>"

	// Enviar respuesta HTML
	_, _ = respuesta.Write([]byte(paginaDeRepuestaHtml))
}

Función para generar etiqueta de imagen html de código QR

Esta función genera la etiqueta de imagen HTML del código QR en sí misma como una cadena Base 64. La URL del sitio web en este ejemplo es https://www.godevtips.com, pero puede elegir la URL de su pagina web favorito.

func generarEtiquetaDeImagenHtmlDeCodigoQR() string {

	//Datos de imagen de código qr
	datosDeImagenDeCodigoQR, _error := qrcode.Encode(urlDelSitioWeb, qrcode.High, tamanoDeImagen)

	if _error != nil {
		log.Fatalln("Error generar el código QR. ", _error)
	}

	datosCodificados := base64.StdEncoding.EncodeToString(datosDeImagenDeCodigoQR)

	return "<img src=\"data:image/png;base64, " + datosCodificados + "\">"
}

Función principal (main)

La función principal contiene la parte que determina qué opción tenia que lanzar. En caso de que solo desee generar los QR bytes PNG sin procesar, debe proporcionar el argumento archivo. De lo contrario, iniciará un servidor que aloja la página HTML del código QR resultante atráves del puerto 3000.

func main() {

	if len(os.Args) == 2 && os.Args[1] == "archivo" { // Determine cuál opción debe lanzarse

		// Genere solo los bytes PNG sin procesar
		nombreDelArchivo := "qr_code.png"
		_error := qrcode.WriteFile(urlDelSitioWeb, qrcode.Medium, tamanoDeImagen, nombreDelArchivo)

		if _error != nil {
			log.Fatal("Error generar el código QR. ", _error)
		} else {
			fmt.Println("¡Archivo de código QR creado!")
		}
	} else {
		iniciarServidor()
	}
}

Ejecute y pruebe la aplicación

Bytes PNG sin procesar

Para generar el archivo PNG sin procesar, ingrese el siguiente comando en la terminal:

go run qr_code_es.go archivo

Página HTML con código QR

Para iniciar el servidor y alojar la página web del código QR, abra la terminal y ejecute el siguiente comando:

go run qr_code_es.go

Una vez que el servidor esté funcionando, abra su navegador y vaya a http://localhost:3000/ y verá la página web HTML. Cuando escanee el código QR, abrirá la página web de GoDevTips.

Visite nuestro repositorio de GitHub para el código fuente del proyecto y clone nuestro repositorio para todos los proyectos.

Síguenos:

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *