Enqre

Ekipa Enqre·Objavljeno dne 16. 8. 2026

Dinamične QR kode iz Pythona, Node in C#

Vsak od teh jezikov ima dobro lokalno knjižnico: qrcode za Python, node-qrcode za Node, QRCoder za .NET. Rišejo PNG in SVG brez povezave, brez ključa, brez kvot in brez stroška — in za kodo, katere cilj se nikoli ne spremeni, je to celoten odgovor.

API je za drugo polovico: statična koda je svoj cilj — naslov je v vzorcu, premik cilja pomeni ponatis vsega. Če bo ustvarjeno natisnjeno, nalepljeno na stroj ali vezano na zapis, ki bo preživel letošnjo zgradbo naslovov, mora koda nositi kratek naslov, ki ga nadzirate. To je gostovanje, ne risanje.

Ustvarjanje kode

Python

import os, requests

r = requests.post(
    "https://enqre.com/api/v1/qrcodes",
    headers={"Authorization": f"Bearer {os.environ['ENQRE_API_KEY']}"},
    json={
        "name": "Asset 4471 – service log",
        "url": "https://maint.example/assets/4471",
    },
    timeout=10,
)
r.raise_for_status()          # 4xx and 5xx become exceptions, not silence

code = r.json()["data"]
code["id"]        # store this against your record
code["shortUrl"]  # the address the QR image should encode

Node

const res = await fetch("https://enqre.com/api/v1/qrcodes", {
  method: "POST",
  headers: {
    Authorization: `Bearer ${process.env.ENQRE_API_KEY}`,
    "Content-Type": "application/json",
  },
  body: JSON.stringify({
    name: "Asset 4471 – service log",
    url: "https://maint.example/assets/4471",
  }),
});

// fetch does NOT throw on 4xx. Check the status or you will store undefined.
if (!res.ok) throw new Error(`enqre: ${res.status} ${await res.text()}`);

const { data: code } = await res.json();

Bodite pozorni na preverjanje: fetch ob 402 ali 429 ne zavrne; brez tega shranite undefined.

C#

using var http = new HttpClient();
http.DefaultRequestHeaders.Authorization =
    new AuthenticationHeaderValue("Bearer", Environment.GetEnvironmentVariable("ENQRE_API_KEY"));

var payload = JsonContent.Create(new {
    name = "Asset 4471 – service log",
    url  = "https://maint.example/assets/4471",
});

var res = await http.PostAsync("https://enqre.com/api/v1/qrcodes", payload);
res.EnsureSuccessStatusCode();

using var doc = JsonDocument.Parse(await res.Content.ReadAsStringAsync());
var code = doc.RootElement.GetProperty("data");
var id       = code.GetProperty("id").GetString();
var shortUrl = code.GetProperty("shortUrl").GetString();

Premik cilja

PATCH https://enqre.com/api/v1/qrcodes/{id}
Authorization: Bearer enq_…
Content-Type: application/json

{ "url": "https://maint.example/assets/4471/v2" }

Natisnjena koda ostane nedotaknjena; naslednje skeniranje gre drugam.

Branje skeniranj

GET /api/v1/qrcodes/{id}/scans odgovori z { total, data }, najnovejša najprej, do 1.000 zapisov: čas, vrsta naprave, sistem, brskalnik.

Brez identitete in brez lokacije — ne mesta ne države.

Kaj bo res odpovedalo

  • 401 invalid_api_key
  • 400 invalid_body — skoraj vedno naslov, ki to ni.
  • 402 plan_limit_reached
  • 429 rate_limited — več kot 60 zahtev na minuto.

Vsak jezik napako skriva drugače: requests molči brez raise_for_status, fetch zavrne le ob omrežni napaki, HttpClient zahteva EnsureSuccessStatusCode.

Dve pravili, ki veljata več kot koda

Ustvarjanje naredite idempotentno. Dva klica ustvarita dve kodi.

Ne tiskajte tistega, česar niste prebrali nazaj.

Kdaj integracije ne pisati

Za nekaj sto kod enkratno je nalaganje CSV hitrejše od katere koli kode, ki bi jo napisali.

Kratki odgovori

  • Najboljša knjižnica? qrcode, node-qrcode, QRCoder.
  • Ali API vrne sliko? Ne, shortUrl.
  • Preverjanje pristnosti? Authorization: Bearer enq_….
  • Omejitev? 60 na minuto.
  • Lokacija v skeniranjih? Ne.
  • Je mogoče spremeniti po tisku? V tem je vse bistvo — PATCH.

Preberite še