این روزها کیوآر کد (QR Code) همهجا هست: روی منوی کافههای رشت، پشت قبض برق، روی بلیت کنسرت و حتی گوشهٔ کارت ویزیت. اما این مربع سیاهوسفید دقیقا چطور کار میکند و گوشی از کجا میفهمد پشت آن چه نوشته شده است؟ در این مقاله از آموزشگاه کادوس، اول ساختار یک QR Code را قدمبهقدم باز میکنیم و بعد سراغ ساخت QR Code با پایتون میرویم؛ با چند خط کد، بدون هیچ سرویس آنلاین و بدون API.
QR Code چیست و از کجا آمد؟
QR مخفف Quick Response یعنی «پاسخ سریع» است. سال ۱۹۹۴ ماساهیرو هارا، مهندس شرکت ژاپنی دنسو ویو (Denso Wave) که از زیرمجموعههای تویوتا بود، این کد را برای ردیابی قطعات خودرو در خط تولید طراحی کرد. بارکدهای معمولی (Barcode) یکبعدیاند و فقط چند ده کاراکتر جا میگیرند، اما QR Code دوبعدی است و اطلاعات را هم در طول و هم در عرض ذخیره میکند. میگویند ایدهٔ اولیهاش از مهرههای سیاه و سفید بازی «گو» به ذهن هارا رسید.
هر QR Code از مربعهای کوچکی به نام ماژول (Module) ساخته شده است. کوچکترین نسخه (Version 1) ابعاد ۲۱×۲۱ ماژول دارد و هر نسخه چهار ماژول به هر ضلع اضافه میکند تا برسیم به نسخهٔ ۴۰ با ۱۷۷×۱۷۷ ماژول. بزرگترین QR Code میتواند ۷۰۸۹ رقم یا ۲۹۵۳ بایت داده را در خود نگه دارد.
آناتومی QR Code؛ هر بخش چه کاری میکند؟
اگر دقیق به یک QR Code نگاه کنید، میبینید همهٔ بخشهایش داده نیستند. بخشی از آن فقط برای این است که اسکنر بتواند کد را پیدا کند و درست بخواند:

- الگوهای یاب (Finder Patterns): سه مربع بزرگ در گوشهها. نسبت نوارهای سیاه و سفیدشان در هر جهت ۱:۱: ۳:۱: ۱ است و اسکنر با پیدا کردن همین الگو، مکان و زاویهٔ کد را تشخیص میدهد. چون گوشهٔ چهارم مربع ندارد، کد حتی وارونه هم خوانده میشود.
- الگوهای زمانبندی (Timing Patterns): دو خطچین سیاهوسفید بین مربعها که اندازهٔ هر ماژول و تعداد سطرها و ستونها را نشان میدهند.
- الگوی تراز (Alignment Pattern): مربع کوچکتری که از نسخهٔ ۲ به بعد اضافه میشود تا اگر کاغذ خم شده باشد یا عکس کج گرفته شود، شبکه باز هم درست بازسازی شود.
- اطلاعات فرمت (Format Information): ۱۵ بیت که سطح تصحیح خطا و نوع ماسک را مشخص میکنند و برای اطمینان دو بار در کد تکرار شدهاند. از نسخهٔ ۷ به بعد، اطلاعات نسخه (Version Information) هم کنار آنها میآید.
- ناحیهٔ سکوت (Quiet Zone): حاشیهٔ سفید دستکم چهار ماژولی دور کد که مرز آن را از محیط اطراف جدا میکند.
بقیهٔ فضا به دادهٔ اصلی و کدهای تصحیح خطا تعلق دارد.
گوشی شما QR Code را چطور میخواند؟
- دوربین تصویر را میگیرد و نرمافزار سه الگوی یاب را پیدا میکند.
- با کمک آنها و الگوی تراز، کجی و پرسپکتیو تصویر اصلاح میشود و شبکهٔ ماژولها به دست میآید.
- اطلاعات فرمت خوانده میشود تا سطح تصحیح خطا و نوع ماسک معلوم شود.
- ماسک (Mask) برداشته میشود. ماسک یک الگوی ریاضی است که هنگام ساخت روی دادهها اعمال میشود تا لکههای بزرگ همرنگ یا طرحهایی شبیه مربعهای یاب ایجاد نشود؛ سازندهٔ کد از بین ۸ ماسک، مناسبترین را انتخاب میکند.
- بیتها بهصورت زیگزاگ، از گوشهٔ پایین سمت راست و در ستونهای دوتایی، خوانده و به بایت تبدیل میشوند.
- الگوریتم تصحیح خطا ایرادها را برطرف میکند و در نهایت متن، لینک یا هر دادهٔ دیگری تحویل داده میشود.
دادهها در یکی از چهار حالت رمزگذاری (Encoding Mode) ذخیره میشوند: عددی، حرفیعددی، بایتی و کانجی. متن فارسی در حالت بایتی و با استاندارد UTF-8 ذخیره میشود؛ پس ساختن QR Code با متن فارسی هم کاملا ممکن است.
تصحیح خطا؛ راز لوگوی وسط QR Code
QR Code از الگوریتم ریدسالومون (Reed–Solomon) استفاده میکند؛ همان روشی که باعث میشد سیدی خطافتاده هم پخش شود. هنگام ساخت کد، یکی از چهار سطح تصحیح خطا (Error Correction Level) را انتخاب میکنید:

سطح L تا حدود ۷٪، سطح M تا ۱۵٪، سطح Q تا ۲۵٪ و سطح H تا ۳۰٪ از کد را بازسازی میکند. هرچه سطح بالاتر برود، کد مقاومتر اما شلوغتر و بزرگتر میشود. به همین دلیل وقتی میخواهید لوگو را وسط QR Code بگذارید، باید سطح H را انتخاب کنید.
ساخت QR Code با پایتون بدون API
سایتها و سرویسهای آنلاین زیادی QR Code میسازند، اما کار با آنها چند ایراد دارد: دادهٔ شما (مثلا رمز وایفای) به سرور دیگری فرستاده میشود، تعداد درخواستها محدود است، بعضی کدها بعد از مدتی از کار میافتند و با قطع یا محدودیت اینترنت هم کارتان متوقف میشود. با زبان برنامهنویسی پایتون (Python) و کتابخانهٔ متنباز qrcode، همهچیز روی کامپیوتر خودتان و کاملا آفلاین ساخته میشود؛ ابزاری که جایش در جعبهابزار آفلاین هر برنامهنویس پایتون خالی است.
۱. نصب کتابخانه
pip install "qrcode[pil]"بخش [pil] یعنی کتابخانهٔ Pillow هم نصب شود تا خروجی تصویری بگیرید. اگر pip به خاطر محدودیت اینترنت خطا داد، راهنمای نصب پکیجهای پایتون با Mirror را بخوانید.
۲. سادهترین QR Code در دو خط
import qrcode
img = qrcode.make("https://kadoosedu.ir")
img.save("kadoos.png")فایل kadoos.png کنار برنامه ساخته میشود؛ با دوربین گوشی اسکنش کنید تا به سایت کادوس بروید. تابع make بهطور پیشفرض سطح M را انتخاب میکند.
۳. کنترل کامل: اندازه، رنگ و سطح تصحیح خطا
import qrcode
qr = qrcode.QRCode(
version=None, # None = smallest version that fits the data
error_correction=qrcode.constants.ERROR_CORRECT_M,
box_size=12, # pixels per module
border=4, # quiet zone, in modules
)
qr.add_data("https://kadoosedu.ir")
qr.make(fit=True)
print("version:", qr.version)
img = qr.make_image(fill_color="#d95f00", back_color="white")
img.save("kadoos-orange.png")
مقدار version=None یعنی کتابخانه کوچکترین نسخهای را که داده در آن جا میشود خودش انتخاب کند (برای این لینک، نسخهٔ ۲). box_size اندازهٔ هر ماژول به پیکسل است و border همان ناحیهٔ سکوت.
۴. QR Code وایفای برای مهمانها
import qrcode
ssid, password = "Kadoos-Guest", "rasht1234"
wifi = f"WIFI:T:WPA;S:{ssid};P:{password};;"
qrcode.make(wifi).save("wifi.png")مهمان شما کد را اسکن میکند و بدون تایپ رمز به شبکه وصل میشود. چون این کد آفلاین ساخته شده، رمز وایفای هیچوقت از کامپیوترتان خارج نمیشود.
۵. گذاشتن لوگو وسط QR Code
import qrcode
from PIL import Image
qr = qrcode.QRCode(error_correction=qrcode.constants.ERROR_CORRECT_H, box_size=12)
qr.add_data("https://kadoosedu.ir")
qr.make(fit=True)
img = qr.make_image(fill_color="black", back_color="white").convert("RGB")
logo = Image.open("kadoos-logo.png").convert("RGBA")
size = img.size[0] // 4 # the logo covers at most ~1/4 of the width
logo.thumbnail((size, size))
pos = ((img.size[0] - logo.size[0]) // 2, (img.size[1] - logo.size[1]) // 2)
img.paste(logo, pos, mask=logo)
img.save("kadoos-logo-qr.png")سطح H را انتخاب کردهایم و اندازهٔ لوگو را به یکچهارم عرض کد محدود کردهایم. خروجی همین برنامه را در تصویر بخش تصحیح خطا دیدید و همچنان بدون مشکل اسکن میشود.
۶. خروجی برداری (SVG) برای چاپ
import qrcode
import qrcode.image.svg
img = qrcode.make("https://kadoosedu.ir", image_factory=qrcode.image.svg.SvgPathImage)
img.save("kadoos.svg")فایل SVG برداری است و برای بنر و بیلبورد در هر اندازهای بدون افت کیفیت چاپ میشود.
چند نکته برای QR Code بیدردسر
- ماژولها تیره و پسزمینه روشن باشد؛ بعضی اسکنرها کد با رنگ معکوس را نمیخوانند.
- ناحیهٔ سکوت را حذف نکنید و متن یا تصویر را به لبهٔ کد نچسبانید.
- برای چاپ، اندازه را دستکم ۲ در ۲ سانتیمتر بگیرید. هرچه لینک کوتاهتر باشد، کد سادهتر و خواناتر است.
- قبل از چاپ نهایی، کد را با چند گوشی مختلف تست کنید.
- مراقب QR Codeهای جعلی باشید! به کلاهبرداری با کیوآر کد «کوئیشینگ» (Quishing) میگویند؛ قبل از باز کردن لینک، آدرس آن را چک کنید. اگر این موضوع برایتان جذاب است، مقالهٔ ورود به دنیای امنیت سایبری را از دست ندهید.
یادگیری پایتون در آموزشگاه کادوس رشت
همین پروژهٔ کوچک نشان میدهد پایتون چقدر سریع یک ایده را به ابزاری واقعی تبدیل میکند. اگر میخواهید برنامهنویسی را اصولی و پروژهمحور یاد بگیرید، دپارتمان کامپیوتر و برنامهنویسی مؤسسه فنی و آموزشی کادوس در رشت مسیر کاملی برایتان آماده کرده است. اگر هنوز مطمئن نیستید، مقالهٔ چرا در سال ۲۰۲۶ هنوز باید برنامهنویسی یاد بگیریم؟ را بخوانید.
- دوره پایتون مقدماتی: از نصب پایتون تا توابع، کلاسها و کار با کتابخانههایی مثل qrcode.
- دوره پایتون پیشرفته: برای نوشتن برنامههای بزرگتر و حرفهایتر.
- دوره FastAPI و دوره جنگو (Django): تا همین QR Code ساز را به یک سرویس تحت وب تبدیل کنید (بیشتر بخوانید: چرا FastAPI برای برنامهنویسان پایتون مهم است؟).
برای مشاورهٔ رایگان و ثبتنام با شعبهٔ مرکزی آموزشگاه کادوس در خیابان لاکانی رشت به شمارهٔ ۰۱۳۹۱۰۰۲۳۴۳ تماس بگیرید، از صفحهٔ تماس با ما پیام بدهید یا فهرست کامل دورههای برنامهنویسی و طراحی وب را ببینید.
