إنشاء QR Code باستخدام بايثون لأي رابط أو نص مع حفظ الصورة | بايثون بالمثال 27

إنشاء QR Code باستخدام بايثون لأي رابط أو نص

هل تريد إنشاء QR Code باستخدام بايثون لرابط موقع أو نص عربي، ثم حفظه كصورة PNG قابلة للمشاركة أو الطباعة؟ في هذا الدرس من سلسلة بايثون بالمثال 27 سنبدأ بأربعة أسطر من الكود، ثم نتعلم التحكم بحجم الرمز وألوانه وإنشاء عدة رموز دفعة واحدة من ملف CSV.

سنستخدم مكتبة qrcode، وسنوفر مشروعًا صغيرًا قابلًا للتشغيل على جهازك. لا تحتاج إلى خدمة ويب ولا إلى API خارجي لتوليد الرموز بعد تثبيت المكتبة.

{alertInfo}المتطلبات: Python 3.9 أو أحدث، ومكتبة qrcode مع دعم Pillow. الصور الناتجة بصيغة PNG.

تحميل ملفات مشروع QR Code ببايثون

حمّل أكواد الدرس وملف CSV التجريبي والاختبارات، ثم تابع الشرح لتوليد رموز QR خطوة بخطوة.

تحميل ملفات الدرس ZIP

{getToc} $title={محتوى المقال}


ما هو QR Code وماذا يخزن؟

رمز QR Code هو رمز ثنائي الأبعاد يمكن لكاميرا الهاتف أو تطبيق قارئ الرموز قراءته. يمكن أن يخزن رابط موقع أو نصًا أو بيانات أخرى. في مثالنا سنضع رابط بايثون العرب داخل الرمز، ثم سنقرأه بالكاميرا للتأكد من أن النتيجة صحيحة.

معلومة مهمة: إنشاء QR لا يعني اختصار الرابط؛ فإذا أدخلت رابطًا طويلًا، فسيحتوي الرمز على الرابط نفسه. كما أن قراءة QR لا تجعل الرابط آمنًا تلقائيًا، لذا افحص وجهته قبل فتحها.

شرح إنشاء رمز QR Code من رابط أو نص باستخدام بايثون

تثبيت مكتبة qrcode في بايثون

افتح الطرفية داخل مجلد مشروعك ونفّذ الأمر التالي:

python -m pip install "qrcode[pil]"

تقوم الإضافة [pil] بتثبيت دعم Pillow لإنتاج صور PNG والتحكم بالألوان. وللتأكد من أن التثبيت تم في بيئة بايثون التي تستخدمها، نفّذ:

python -m pip show qrcode
{alertWarning}إذا ظهرت رسالة ModuleNotFoundError: No module named qrcode، تأكد أنك نفّذت التثبيت بواسطة مفسّر بايثون نفسه المستخدم لتشغيل الملف.

أبسط كود لإنشاء QR Code لرابط موقع

أنشئ ملفًا باسم first_qr.py واكتب الكود التالي:

import qrcode

url = "https://www.arabpython.com/"
image = qrcode.make(url)
image.save("arabpython-qr.png")

print("تم إنشاء رمز QR بنجاح")

شغّل الملف:

python first_qr.py

ستجد الصورة arabpython-qr.png في المجلد نفسه. افتح الصورة ووجّه إليها كاميرا هاتفك؛ ينبغي أن يظهر رابط الموقع داخلها.

كيف يعمل هذا الكود؟

السطروظيفته
import qrcodeاستيراد مكتبة توليد الرموز
url = ...تحديد الرابط الذي سيُخزَّن داخل QR
qrcode.make(url)بناء صورة الرمز من الرابط
image.save(...)حفظ الصورة على جهازك

إنشاء QR Code لنص عربي بدل الرابط

يمكن إدخال أي نص، وليس بالضرورة رابطًا. غيّر المتغير فقط كما يلي:

import qrcode

message = "أهلًا بك في بايثون العرب"
qrcode.make(message).save("arabic-message.png")

عند قراءة الرمز ستظهر الجملة العربية. تأكد من حفظ ملف Python بترميز UTF-8، وهو الترميز الافتراضي المعتاد في المحررات الحديثة.

تغيير حجم الرمز وألوانه باستخدام QRCode

لخيارات أكثر من qrcode.make()، استخدم الصنف QRCode. المثال التالي ينشئ رمزًا أزرق على خلفية بيضاء ويحدد حجم كل مربع:

import qrcode

qr = qrcode.QRCode(
    version=None,
    error_correction=qrcode.constants.ERROR_CORRECT_M,
    box_size=12,
    border=4,
)
qr.add_data("https://www.arabpython.com/")
qr.make(fit=True)

image = qr.make_image(fill_color="#164a8c", back_color="white")
image.save("blue-qr.png")
الخيارماذا يغيّر؟
version=None مع fit=Trueيسمح بتحديد حجم مصفوفة QR وفق كمية البيانات
box_size=12حجم المربع الواحد في الصورة بوحدة البكسل
border=4الهامش الفارغ المحيط بالرمز بوحدة المربعات
ERROR_CORRECT_Mمستوى متوسط لتصحيح الأخطاء، بنحو 15% تقريبًا
fill_colorلون مربعات الرمز
back_colorلون الخلفية
تخصيص حجم وألوان رمز QR Code باستخدام بايثون
{alertWarning}قابلية المسح أهم من الشكل. استخدم ألوانًا ذات تباين قوي، وحافظ على هامش فارغ حول الرمز، ولا تضع نصوصًا أو العلامة المائية فوق مربعات QR. اختبر الصورة بكاميرا الهاتف، خصوصًا قبل الطباعة.

مشروع عملي: دالة لإنشاء QR Code وحفظه في مجلد

بدل تكرار كود توليد الصورة في كل مرة، ننشئ ملفًا باسم qr_core.py يحتوي دالة قابلة لإعادة الاستخدام، وتتحقق من النص والمدخلات قبل الحفظ. هذا هو الكود نفسه الموجود في حزمة المشروع:

"""إنشاء رموز QR بصيغة PNG باستخدام مكتبة qrcode."""
from pathlib import Path

import qrcode
from PIL import ImageColor


def make_qr(data, output_path, fill="black", background="white", box_size=10):
    """إنشاء صورة QR من نص أو رابط وإرجاع مسار الصورة."""
    if not isinstance(data, str) or not data.strip():
        raise ValueError("يجب إدخال رابط أو نص غير فارغ.")
    if not 1 <= box_size <= 40:
        raise ValueError("حجم المربعات يجب أن يكون من 1 إلى 40.")

    foreground = ImageColor.getrgb(fill)
    backdrop = ImageColor.getrgb(background)
    if foreground == backdrop:
        raise ValueError("يجب أن يختلف لون المربعات عن لون الخلفية.")

    output = Path(output_path)
    if output.suffix.lower() != ".png":
        raise ValueError("يجب أن ينتهي اسم الصورة بالامتداد .png")
    output.parent.mkdir(parents=True, exist_ok=True)

    qr = qrcode.QRCode(
        version=None,
        error_correction=qrcode.constants.ERROR_CORRECT_M,
        box_size=box_size,
        border=4,
    )
    qr.add_data(data)
    qr.make(fit=True)
    image = qr.make_image(fill_color=foreground, back_color=backdrop)
    image.save(output)
    return output

لاحظ أن الدالة تتعامل مع المسار بواسطة Path، وتنشئ مجلد الحفظ عند الحاجة. كما ترفض النص الفارغ أو استخدام اللون نفسه للمربعات والخلفية.

تشغيل المشروع من سطر الأوامر

ملف make_qr.py في الحزمة يستخدم الدالة السابقة مع argparse لتحديد النص ومسار الصورة والألوان. لتشغيله استخدم:

python make_qr.py --text "https://www.arabpython.com/" --output output/website.png

ولإنشاء رمز لنص عربي:

python make_qr.py --text "مرحبا بك في بايثون العرب" --output output/arabic.png

وللتخصيص:

python make_qr.py --text "https://www.arabpython.com/" --output output/blue.png --fill "#164a8c" --background white --box-size 12

يمكنك الاطلاع على الكود الكامل لملف make_qr.py ضمن الحزمة. هذا الأسلوب مفيد عندما ترغب في توليد رموز جديدة من الطرفية دون تعديل الكود في كل مرة.

إنشاء عدة رموز QR من ملف CSV دفعة واحدة

إذا أردت إنشاء رمز لكل رابط أو نص من مجموعة كبيرة، استخدم ملف CSV بعمودين هما filename لاسم الصورة وdata للمحتوى الذي سيُخزَّن داخل الرمز. أنشئ ملف examples/links.csv بالمحتوى التالي:

filename,data
arabpython,https://www.arabpython.com/
docs,https://docs.python.org/3/
welcome,مرحبا بك في بايثون العرب

وفي ملف batch_qr.py سنقرأ الصفوف بواسطة مكتبة csv المدمجة، ونولّد صورة لكل صف. الكود الكامل كما في الحزمة:

"""إنشاء عدة رموز QR من CSV بأعمدة filename,data."""
import argparse
import csv
import re
from pathlib import Path

from qrcode.exceptions import DataOverflowError
from qr_core import make_qr


def clean_filename(value):
    """توليد اسم ملف آمن من عنوان الصف."""
    name = re.sub(r"[^A-Za-z0-9_-]+", "_", value.strip()).strip("_")
    if not name:
        raise ValueError("اسم الملف غير صالح")
    return name[:80] + ".png"


def main():
    parser = argparse.ArgumentParser(description="إنشاء رموز QR من CSV")
    parser.add_argument("csv_file", help="ملف CSV يحتوي filename,data")
    parser.add_argument("--output", default="output/batch", help="مجلد النتائج")
    args = parser.parse_args()
    success = 0
    failed = 0
    used = set()

    try:
        with Path(args.csv_file).open("r", encoding="utf-8-sig", newline="") as file:
            reader = csv.DictReader(file)
            if not reader.fieldnames or not {"filename", "data"}.issubset(reader.fieldnames):
                raise ValueError("يجب أن يحتوي CSV على العمودين filename,data")

            for row_number, row in enumerate(reader, start=2):
                try:
                    filename = clean_filename(row.get("filename") or "")
                    data = row.get("data") or ""
                    if filename in used:
                        raise ValueError("اسم ملف مكرر داخل CSV")
                    used.add(filename)
                    output = Path(args.output) / filename
                    make_qr(data, output)
                    success += 1
                    print(f"نجاح: {output}")
                except (ValueError, OSError, DataOverflowError) as error:
                    failed += 1
                    print(f"تخطي السطر {row_number}: {error}")
    except (OSError, ValueError) as error:
        parser.exit(1, f"خطأ: {error}\n")

    print(f"اكتمل التنفيذ: نجح {success}، تعذر {failed}")
    if failed:
        parser.exit(1)


if __name__ == "__main__":
    main()

شغّل الأمر:

python batch_qr.py examples/links.csv --output output/batch

ستحصل على الصور arabpython.png وdocs.png وwelcome.png داخل المجلد output/batch. إذا كان صف غير صالح، سيعرض السكربت سبب تخطيه بدل إيقاف معالجة كل الصفوف.

إنشاء عدة رموز QR Code من ملف CSV باستخدام بايثون

ملفات المشروع وطريقة تشغيلها

حزمة المشروع قابلة للتجربة مباشرة، وبداخلها ملفات الشرح والاختبارات وأمثلة جاهزة:

qr-code-python-example-27/
├── qr_core.py
├── make_qr.py
├── batch_qr.py
├── requirements.txt
├── README.md
├── examples/
│   └── links.csv
├── tests/
│   └── test_qr_core.py
└── output/
    ├── website.png
    ├── arabic.png
    └── batch/

بعد فك الضغط، افتح الطرفية داخل مجلد المشروع وثبّت التبعيات ثم شغّل الاختبارات:

python -m pip install -r requirements.txt
python -m unittest discover -s tests -v

الاختبارات تغطي إنشاء صورة PNG، والتعامل مع نص عربي، ورفض البيانات الفارغة، والألوان المتطابقة، وتنظيف أسماء الصور.

الأخطاء الشائعة عند إنشاء QR Code ببايثون

المشكلةالسبب المحتمل والحل
No module named qrcodeشغّل python -m pip install "qrcode[pil]" بالمفسّر الصحيح
الصورة لا تظهرتحقق من مجلد التشغيل ومسار الحفظ، واستخدم مجلد output
الهاتف لا يقرأ الرمزارفع التباين، لا تقص الهامش الأبيض، وجرّب زيادة box_size
النص العربي غير صحيحاحفظ ملفات Python وCSV بترميز UTF-8
الرمز كبير أو مزدحمقلّل طول النص أو الرابط، ولا ترفع مستوى تصحيح الأخطاء دون حاجة
DataOverflowErrorالبيانات تتجاوز سعة رمز QR؛ اختصر المحتوى

إذا أردت التوسع في كتابة برامج قصيرة قابلة للتجربة، راجع أوامر بايثون الأساسية للمبتدئين. وللتفاصيل التقنية عن مكتبة توليد الرموز يمكنك الاطلاع على توثيق مكتبة qrcode على GitHub.

الأسئلة الشائعة عن QR Code في بايثون

هل يمكن إنشاء QR Code باستخدام بايثون دون إنترنت؟

نعم، بعد تثبيت مكتبة qrcode وPillow، يمكن توليد الرمز محليًا دون إرسال الرابط أو النص إلى خادم خارجي.

هل يدعم QR Code النص العربي؟

نعم، يمكنك استخدام نص عربي مباشرة، كما في المثال السابق. اختبر النتيجة باستخدام قارئ QR على الهاتف للتأكد من عرض النص كما تريد.

هل يمكن حفظ QR بصيغة PNG؟

نعم. جميع الأمثلة في هذا الدرس تحفظ الصور بصيغة PNG باستخدام save().

هل يمكن وضع شعار داخل رمز QR؟

يمكن ذلك باستخدام أدوات تنسيق متقدمة، لكنه قد يؤثر في إمكانية قراءة الرمز. لهذا لم نضف شعارًا داخل QR في هذا الدرس؛ ضَع العلامة المائية خارج مساحة الرمز عند تصميم صور المقال.

هل يمكن تغيير الرابط بعد إنشاء صورة QR؟

إذا خزّنت رابطًا مباشرًا داخل QR ثابت، فلن يتغير الرابط داخل الصورة إلا بإعادة إنشاء الرمز. الروابط القابلة للتغيير لاحقًا تحتاج وسيط إعادة توجيه تتحكم به، وليست ميزة تلقائية في مكتبة qrcode.

إرسال تعليق

أحدث أقدم