Open4

clj.qrgen を使って QR Code を作ってウェブサイトに表示する

しんせいたろうしんせいたろう

Clojureでウェブアプリを作っているんですが、
とある情報を含んだQRコードを生成してHTML内に貼り付けたかったので調べたメモを貼ります。

しんせいたろうしんせいたろう

deps.edn

{:deps {clj.qrgen/clj.qrgen {:mvn/version "0.4.0"}
        info.sunng/ring-jetty9-adapter {:mvn/version "0.35.1"}}
 :paths ["src"]}       
しんせいたろうしんせいたろう

src/core.clj

(ns core
  (:require [ring.adapter.jetty9 :as jetty] #_[ring.adapter.jetty :as jetty]
            [clojure.java.io :as io]
            [clj.qrgen :as qr])
  (:import [java.io ByteArrayOutputStream]))

(defn qr-stream->response
  "Converts a QR code input stream to a Ring response"
  [qr-stream]
  (let [baos (ByteArrayOutputStream.)]
    (io/copy qr-stream baos)
    (let [image-bytes (.toByteArray baos)]
      {:status 200
       :headers {"Content-Type" "image/png"  ; or "image/jpeg" depending on your QR format
                 "Content-Length" (str (count image-bytes))
                 "Cache-Control" "no-cache, no-store, must-revalidate"
                 "Pragma" "no-cache"
                 "Expires" "0"}
       :body (java.io.ByteArrayInputStream. image-bytes)})))

(defn qr-handler
  "Ring handler that generates and serves a QR code"
  [request]
  (let [;; data (get-in request [:params :data] "Default QR Data")  ; Get data from query params
        qr-stream (qr/as-input-stream (qr/from "https://www.yahoo.co.jp/"))]  ; Replace with your actual QR generation function
    (try
      (qr-stream->response qr-stream)
      (catch Exception e
        {:status 500
         :headers {"Content-Type" "text/plain"}
         :body (str "Error generating QR code: " (.getMessage e))}))))


;; (defn ring-handler
;;   [_req]
;;   {:status 200
;;    :body "Hello "})

(defn -main []
  (jetty/run-jetty qr-handler {:port 3000}))
しんせいたろうしんせいたろう
  • ハンドラ qr-handler 受け取るリクエストの中にQRコードに埋め込みたい情報をParamsで渡すという方法を取ればやりたいことはできる。
  • とりあえず簡易的にヤフーのURLを入れ込んだQRコードを作って生成させ、localhost:3000 にアクセスすると表示できるように書いた