1分で読了機能

大量QRコード生成:CSVから印刷用ファイルまで

スプレッドシートからQRコードを一括生成します。行ごとに短縮リンクを作成し、API経由でSVGとPNGをレンダリングして、印刷に回す前にサンプルを確認する方法を解説します。

Ana Kowalska
Marketing solutions engineering
大量QRコード生成:宛先のCSVを短縮リンクに変換し、API経由で印刷用のSVGおよびPNGのQRコードとしてレンダリング

大量QRコード生成は、1行あたり2回のAPI呼び出しを行い、最後にフォルダーを作る作業です。各宛先に短縮リンクを作成し、その短縮リンクのQRコードをレンダリングして、SVGとPNGをディスクに書き込みます。5,000商品のスプレッドシートが、数分で5,000個の印刷用ファイルになります。

判断すべきなのはツールではありません。コードが何をエンコードするかです。宛先を直接エンコードすると、印刷に回した瞬間にコードが固定されます。そのため、5,000枚のステッカーのうちURLを1つ間違えただけで、全数が廃棄になります。管理下の短縮リンクをエンコードすれば、宛先はいつまでも編集可能で、各コードがひそかに自分のスキャン数を報告します。

何千個も作るのではなく、1個だけ作りますか? QRコードの作成方法でより簡単な手順を説明しています。QRコードキャンペーンをゼロから作るでは、配置と測定を解説しています。

4段階のパイプライン

大量QRコードの4段階パイプライン:宛先のCSVを読み込み、行ごとに短縮リンクを作成し、QRコードをSVGとPNGとしてレンダリングして、印刷サンプルをスキャンして確認

冗長に感じても、CSVにはid列を残してください。これがファイル名、冪等性キー、そしてデザインチームから「コード412が間違っています」と返ってきたときに照合する項目になります。これがないとURLで照合することになりますが、URLは長く、入力ミスもしやすいものです。

import csv, base64, hashlib, pathlib, os, requests

API = "https://api.elido.app"
HEAD = {"Authorization": f"Bearer {os.environ['ELIDO_API_KEY']}"}
out = pathlib.Path("qr-out")
out.mkdir(exist_ok=True)

with open("products.csv") as f:
    for row in csv.DictReader(f):        # columns: id, destination
        key = hashlib.sha256(row["destination"].encode()).hexdigest()

        link = requests.post(
            f"{API}/v1/links",
            headers={**HEAD, "Idempotency-Key": key},
            json={"destination_url": row["destination"]},
            timeout=10,
        )
        link.raise_for_status()
        short_url = link.json()["short_url"]

        qr = requests.post(
            f"{API}/v1/qr/generate",
            headers=HEAD,
            json={
                "content": short_url,          # the short link, never the destination
                "formats": ["svg", "png"],
                "size": 1024,
                "error_correction": "M",
            },
            timeout=20,
        )
        qr.raise_for_status()
        payload = qr.json()

        (out / f"{row['id']}.svg").write_text(payload["svg"])
        (out / f"{row['id']}.png").write_bytes(base64.b64decode(payload["png"]))
        print(row["id"], short_url)

冪等性キーは宛先から導出されるため、3行を修正してファイルを再実行しても、同じものが二重に作成されず、費用もかかりません。この性質によって一括ジョブを安全に繰り返せます。5,000行に対して実行する前にきちんと理解しておく価値があります。レートリミットと冪等性で仕組みを解説しています。

上のループは逐次処理なので、数百行までは問題ありません。それを超えたら約8件を並列実行してください。PythonJavaScriptのガイドには、直接利用できる同時実行数を制限したパターンがあります。

実行しますか? 無料プランでキーを作成し、ELIDO_API_KEYをエクスポートしてから、本番用CSVではなく5行のCSVをスクリプトに指定してください。

大規模運用での静的と動的

宛先をエンコードする静的QRコードと、短縮リンクをエンコードする動的QRコードの比較。宛先が変更される可能性のある大量印刷を想定

静的コードの利点は1つだけです。何にも依存しないことです。維持し続けるドメインも、料金を払い続けるサービスもありません。これは、ベンダーとの契約期間を超えて使われる機械にコードを刻印する場合には重要ですが、それ以外ではほとんど重要ではありません。

それ以外はすべて動的コードが優れています。コードごとのスキャン数が分かるため、棚や店舗の配置を比較できます。キャンペーンページが移動しても修正できる宛先を使えます。また、短縮リンクはタグ付き商品URLの一部の文字数で済むため、より小さく疎なコードになります。動的QRコードと静的QRコードで詳しく比較しています。

本当に重要な印刷設定

バッチを現実の環境でスキャンできるかどうかは、3つのパラメーターで決まります。

誤り訂正。 レベルMは約15パーセントの損傷を復元し、コードを疎に保ちます。中央にロゴを置く場合、コードを手に取ったり擦ったりする場合、曲面に印刷する場合はQにします。Hは安全そうに聞こえますが、通常はそうではありません。余分な冗長性によってモジュール数が増え、密度の高いコードは小さいサイズでスキャンしにくくなります。QR標準に4つのレベルすべてが記載されています。

形式。 印刷にはSVGを使います。モジュールのエッジをぼかさず、ポスターのサイズにも拡大できるためです。スライド、マーケットプレイス、ベクターを受け付けないものにはPNGを使います。1回のリクエストで両方を求めれば、誰かがもう一方を必要としたときの往復を省けます。

クワイエットゾーン。 コードの周囲にある空白の余白もコードの一部です。指定された最小値は4モジュールですが、デザイナーは無駄な空間に見えるため、これをよく切り取ります。境界が狭いコードは安価なスマートフォンのカメラではうまくスキャンできず、その2つが原因だと気付く人はほとんどいません。

バッチ全体のサイズを固定する前に、もう1つ知っておくべきことがあります。データ量がバージョンを決め、バージョンがコードのモジュール数を決めます。この形式を発明したDenso Waveは、バージョンと容量の一覧表を公開しています。30文字の短縮リンクはその下限近くに収まりますが、180文字のタグ付き商品URLはそうではありません。同じ印刷サイズでも、その違いは目で見て分かるコード密度の差になります。

ファイル内のサイズより、物体上でのサイズのほうが重要です。QRコードはどのくらいの大きさにすべきかで、物理的な寸法を決めるスキャン距離のルールを説明しています。

印刷に回す前に確認する

バッチを生成したら、5つのコードを無作為に確認します。机の上で画面を最大輝度にして確認するのではありません。実際に使うサイズで印刷し、棚やパッケージに1つ貼り付けて、顧客が立つ場所からスキャンしてください。

次にリダイレクト自体を確認します。3つの短縮リンクに対してcurl -sIを実行し、正しい宛先へのリダイレクトを返すことを確認します。これにより、CSVの2列目を3列目として読み込み、すべてのコードが隣の商品を指してしまう、典型的な1つずれを検出できます。この問題は表面化せず、目視確認をすべて通り抜け、宛先でしか確認できません。

バッチの生成に使ったCSVは、id、宛先、短縮リンク、ファイル名とともに保管してください。6か月後にどのコードがどのパレットにあるか尋ねられたとき、そのファイルが答えになります。ダッシュボードから再生成するより、保管しておくほうがはるかに手間がかかりません。

スキャン結果の表示場所

コードを公開すると、それぞれが個別にレポートします。共有コードを1つ使わず商品ごとに1つ使う理由はこれです。1つのコードならキャンペーンが機能したことが分かり、商品ごとのコードならどの店舗、棚、SKUが機能したか分かります。

QRコードのスキャンを追跡する方法ではデータの読み方を説明し、リンクイベント用Webhookではダッシュボードを確認する代わりにスキャンを自分のシステムへ送る方法を説明しています。物理的な商品の用途については、デジタル製品パスポート用QRコードで同じパイプラインの規制対応版を解説しています。

コーナーストーンシリーズを読む

この記事はfeaturesクラスターに含まれます。まずは単一コード版のQRコードの作成方法を読み、次にキャンペーン設計についてQRコードキャンペーンをゼロから作るを読んでください。QRコードの機能ページでは、このスクリプトでは扱わないスタイル設定を説明しています。

ブログの関連記事

よくある質問

QRコードを一括生成するにはどうすればよいですか?

CSVをループ処理し、各行に短縮リンクを作成してから、API経由で各短縮リンクのQRコードをレンダリングし、ファイルをディスクに書き込みます。1行あたり2回の呼び出しを行い、最後にフォルダーができます。宛先ではなく短縮リンクをエンコードすることで、印刷後もすべてのコードを編集できます。

一括QRコードは静的と動的のどちらにすべきですか?

ほぼすべての一括処理では動的QRコードが適しています。静的コードは宛先を直接エンコードするため、5,000枚の印刷でURLを1つ間違えると再印刷が必要です。動的コードは管理下の短縮リンクをエンコードするため、後から宛先を修正でき、各コードが個別にスキャン数を報告します。

印刷するQRコードにはどの誤り訂正レベルを使うべきですか?

レベルMが適切なデフォルトです。約15パーセントの損傷を復元でき、すばやくスキャンできる程度にコードを疎に保てます。中央にロゴが重なる場合や、擦れやすい場所に設置する場合はQにします。Hは余分な密度によって小さいサイズでスキャンしにくくなるため、使う価値があるケースはほとんどありません。

一括QRコードはどのファイル形式にすべきですか?

印刷するものはSVGにします。モジュールのエッジをぼかさず、どのサイズにも拡大縮小できるためです。画面、スライド、ベクターを受け付けないマーケットプレイスへのアップロードにはPNGを使います。両方を一度に生成すればリクエストは1回で済み、デザインチームからもう一方を求められたときの往復を省けます。

一度に生成できるQRコードの数はいくつですか?

レートリミットが許す限り生成できます。これは固定上限ではなく、スループットの問題です。約8件のリクエストを並列実行し、各行から導出した冪等性キーを送信すれば、再実行しても同じものが二重に作成されず、数千件のバッチが数分で完了します。

商品や場所ごとに別のQRコードが必要ですか?

どのコードがスキャンされたかを知りたいなら、必要です。共有コードを1つ使うとキャンペーンが機能したことは分かりますが、商品ごとに1つ使えば、どの棚、店舗、SKUが機能したか分かります。商品ごとのコードは生成コストが増えず、配置を比較する唯一の方法です。

Elidoを試す

URLを貼り付けて短縮リンクを取得

登録不要。リンクは30日間有効。永久に保存するには登録してください。

Free、登録不要 · 1日あたり2件

Elidoを試す

EUホスティングのURL短縮サービス。カスタムドメイン、詳細な分析、オープンAPI付き。無料プラン - クレジットカード不要。

タグ
bulk qr code generation
generate qr codes from csv
bulk qr code generator api
qr codes at scale
dynamic qr codes bulk
qr code print files

続きを読む