qrcode - langer String

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Nobuddy
User
Beiträge: 1019
Registriert: Montag 30. Januar 2012, 16:38

Hallo zusammen,
befasse mich mit dem Encodieren und dem Decodieren von QR Code.

Zum Testen, verwende ich einen langen String, der in diesem Beispiel 292 Zeichen hat.
  • 1474213880199815695162460623888105935730534104205255941884502102953368170706331111751950927751012460743314855993388950608217095480447715933886311448108725045790529118931891070182118339841823764317131152951530608463099418351168978216870729315792136470673684124189440881712631049450614781615623
Das Encodieren mit qrcode und dem obigen String, funktioniert.

Code: Alles auswählen

		my_QR = QR(data = data, pixel_size = 10)
		my_QR.encode()
Beim Decodieren des QR Code, wird aber dieser String nicht zurückgegeben.

Code: Alles auswählen

		read_QR = QR(filename = my_QR.filename)
		read_QR.decode()
Warum wird der QR Code des obigen Strings als png-Datei erstellt, aber die Ausgabe beim Decodieren bleibt leer?

Grüße Nobuddy
Nobuddy
User
Beiträge: 1019
Registriert: Montag 30. Januar 2012, 16:38

Habe dafür jetzt folgende Lösung:
Encodieren:

Code: Alles auswählen

		data = '\t'.join(data)
		my_QR = QR(data = data, pixel_size = 10)
		my_QR.encode()
Decodieren:

Code: Alles auswählen

		read_QR = QR(filename = my_QR.filename)
		read_QR.decode()
		data = ''.join(read_QR.data.split('\t'))
Benutzeravatar
__blackjack__
User
Beiträge: 14078
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Nobuddy: Das sieht mir nicht nach einer sinnvollen Lösung aus. Wo kommt denn `QR` überhaupt her?
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
Nobuddy
User
Beiträge: 1019
Registriert: Montag 30. Januar 2012, 16:38

Hallo __blackjack__,
unter Kubuntu 20.04 habe ich python3-qrtools installiert.

Code: Alles auswählen

from qrtools import QR
Benutzeravatar
__blackjack__
User
Beiträge: 14078
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Hm, das bekomme ich nicht installiert, weil sich die Abhängigkeit `zbar` nicht mit Python 3.7 installieren lässt: ``error: legacy-install-failure``. Das versucht anscheinend eine veraltete Python-C-API zu verwenden. Das `zbar`-Package ist 2009 das letzte mal aktualisiert worden. Das ist auch ein bisschen sehr alt. Oder verwendest Du da etwas anderes?

Okay, beim kodieren bekomme ich einen `NameError` weil `unicode` nicht definiert ist. Dein `qrtools` ist also auch ein anderes als `qrtools` aus dem Package-Index.
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
Nobuddy
User
Beiträge: 1019
Registriert: Montag 30. Januar 2012, 16:38

Bin mir nicht sicher, ob Dir das weiter hilft, poste mal die Info aus dem installierten Paket 'python3-qrtools'.
  • Details:
    This package provides high level APIs for reading and creating QR codes with minimal effort on Python. This library uses zbar barcode library.

    Canonical stellt keine Aktualisierungen für python3-qrtools bereit. Einige Aktualisierungen können von der Ubuntu-Gemeinschaft bereitgestellt werden.

    Quelltextpaket:
    qr-tools
    Version:
    2.0~bzr33-2

    Änderungsliste:
    qr-tools (2.0~bzr33-2) unstable; urgency=medium

    * Refresh patch to bump version to 2.0
    - thanks Infinity for the check and hint

    -- Gianfranco Costamagna <locutusofborg@debian.org> Tue, 15 Oct 2019 11:22:42 +0200

    qr-tools (2.0~bzr33-1) unstable; urgency=medium

    * QA upload.
    * New upstream release, Python3 ready
    * Migrate the package to Python3 (Closes: #941888, #932865, #938317)
    * Bump compat level to 12
    * Bump std-version to 4.4.1
    * Refresh patches
    * Set R^3 to no
    * Use pkg-info to avoid dpkg-parsechangelog calls
heyJo
User
Beiträge: 25
Registriert: Mittwoch 24. Januar 2018, 20:49
Wohnort: Köln

@Nobuddy

Zur QR-Code Erzeugung nehme ich das Modul qrcode.
Das Modul wir immer noch gepflegt (10/2021) und hat sich in meinen Progrämmchen bewährt.

Code: Alles auswählen

import qrcode
img = qrcode.make('1474213880199815695162460623888105935730534104205255941884502102953368170706331111751950927751012460743314855993388950608217095480447715933886311448108725045790529118931891070182118339841823764317131152951530608463099418351168978216870729315792136470673684124189440881712631049450614781615623')
img.show()
August1328
User
Beiträge: 71
Registriert: Samstag 27. Februar 2021, 12:18

Hallo Nobuddy,

ich habe vor ein paar Wochen ein wenig mit QRCodes & Python gespielt und für das Decodieren eines QR-Code das Modul pyzbar genutzt.

Der Code sieht so aus:

Code: Alles auswählen

from PIL import Image
from pyzbar.pyzbar import decode

result = decode(Image.open('code.png'))
#print(f"QRCode Daten: {result}\n\n")

data_utf8 = result[0][0]
data = data_utf8.decode("utf-8")
print(f"QRCode UTF8 Daten: {data}")
Um aus Daten ein QRCode zu machen, habe ich einen andere Modul genutzt: qrcode

Geht dann so:

Code: Alles auswählen

import qrcode

test_qrcode_data = "..."

test_qr_code = qrcode.make(test_qrcode_data)
test_qr_code.save("code1.png")
Mein kleines Projekt war das Auslesen des QRCodes auf dem Impfzertifikat. Ich hatte gelesen, daß das mit Python geht und dann habe ich das anhand ein paar Artikel im Internet versucht nachzuvollziehen und die Technik dahinter zu verstehen (zlib, base45, cbor2, cose). Hat ein paar Stunden gedauert, aber dann konnte ich den Inhalt in Klartext lesen - ist ja kein Geheimnis, was da drin steht und auch nicht verboten...

Am nächsten Tag habe ich probiert den QRCode aus den verschiedenen entkomptimierten und tw. entschlüsselten Teilen wieder zu erzeugen und auch das hat mit viel recherchieren und probieren wieder geklappt, d.h. die CovPass App hat den neuen QRCode als gütiges Zertifikat erkannt.

ABER, alle die jetzt meinen, man könnte damit sein digitales Zertifikat fälschen, die muss ich enttäuschen :lol: Wenn man beim Zusammenbauen 1 Ziffer ändert, erkennt die App das Zertifikat als ungültig. Dazu bräuchte man neben nem öffentlichen Schlüssel auch einen privaten Schlüssel und die sind halt ... geheim. So soll es ja auch sein. Es gibt ne interessante und längere Diskussion auf Github darüber.

Falls Interesse besteht und die Moderatoren nix dagegeben haben, kann ich beide vollständigen Codes posten.

Grüße Andy
Nobuddy
User
Beiträge: 1019
Registriert: Montag 30. Januar 2012, 16:38

Hallo heyJo,
das Encodieren des QR Codes mit dem langen String, ist nicht das Problem.
Das Decodieren des QR Codes, bei dem langen String, funktioniert so nicht.
Um das richtige Ergebnis aus dem Decodieren des QR Codes zu erhalten, habe ich den langen String zum Encodieren verändert.

Code: Alles auswählen

data = '\t'.join(long_string)
Nach dem Decodieren, wandle ich das Ergebnis wieder um, um den ursprünglich langen String wieder zu erhalten.

Code: Alles auswählen

		read_QR = QR(filename = QRCODEFILENAME)
		read_QR.decode()
		self.data = ''.join(read_QR.data.split('\t'))
Hallo August1328,
pyzbar kannte ich noch nicht, auch ein interessanter Ansatz, werde Deinen Code mal mit meinem langen String testen!

An das Impfzertifikat, habe ich nicht gedacht. Mein Interesse war, mich mal mit QR Code zu befassen und festzustellen, was möglich und sinnvoll ist.
Gerne, darfst Du Deinen Code zum Impfzertifikat hier posten, bestimmt interessant!

Grüße Nobuddy
Nobuddy
User
Beiträge: 1019
Registriert: Montag 30. Januar 2012, 16:38

Hallo August1328,
pyzbar, ist kein Paket von Kubuntu 20.04.
Habe python3-zbar in Kubuntu 20.04 gefunden und installiert.
decode, ist da wohl nicht dabei drin, vielleicht irre ich mich auch.
Vielleicht sind ja pyzbar und python3-zbar, zwei ganz unterschiedliche Python-Pakete?
Kann also momentan den von Dir geposteten Code nicht testen.

Vielleicht kann jemand, der sich mit python3-zbar auskennt, mir weiterhelfen?
Antworten