Haskell 生成错误的二维码

Haskell Generating Incorrect QR Code

我正在使用 this 库为 Google 验证器生成二维码。

不幸的是,当我扫描二维码时,它是不正确的。将 QR 码上传到 this 网站提供以下内容:

OTPAUTH%3A%2F%2FTOTP :0000000000000000000000000000000000000000000000000000000000000000000000000000000

totp 之后似乎出了点问题,但输入的下一部分是 %2F,它已经出现了两次并得到了正确处理。

当我将输入的字符串放入this在线生成器时,二维码被正确生成了。

这是我的代码:

testQR :: IO ()
testQR = do
    let path = "hello.pgm"
    arrayToFile path
        . toArray
        . fromJust
        . encode (fromJust $ version 1) M Alphanumeric
        $ "otpauth%3A%2F%2Ftotp%2FLabel%3AJames%3Fsecret%3DGEZDGNBVGY3TQOJQGEZDGNBVGY3TQOJQ%26issuer%3DMyCompany"

我曾考虑过使用 haskell-qrencode,但即使在安装 qrencode 之后我仍然收到一条错误提示 Missing C library: qrencode。请随时提出解决此问题而不是上述问题的建议。

我在 diagrams-qrcode 方面取得了成功。

虽然不是我的问题的直接解决方案,但以下是我最终得到的结果。

我正在使用 haskell-qrencode 生成 QR 码,然后使用 JuicyPixels 创建 PNG 图像。

我现在的功能如下:

genQR :: String -> Base.String -> IO ()
genQR user s = do
    let secret = mkSecretString s
        url = mkURL user secret
        path = "hello.png"
    qr <- encodeString url Nothing QR_ECLEVEL_M QR_MODE_EIGHT True
    let pixels = map (map (\case
                                0 -> 255 :: Pixel8
                                1 -> 0)) $ toMatrix qr
        height = length pixels
        width = length $ head pixels
        pxGen = \x y -> pixels !! y !! x
        image = generateImage pxGen width height
    writePng path image