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 にアクセスすると表示できるように書いた