مجموعه آموزش ها و ترفند های پایتونی(7): ساخت کپچا با پایتون


سلام امیدوارم که حالتون عالی باشه. به یه قسمت دیگه از مجموعه آموزش ها و ترفند های پایتونی خوش اومدید! توی این آموزش پروژه محور همونطور که گفتم قراره یه برنامه بسازیم که کپچا بسازه و بعدش ما کپچا رو وارد کنیم و درستی یا اشتباه بودنشو بهمون بگه. ساخت کپچا با پایتون کار تقریبا ساده‌ایه ولی برای اینکه بتونید این پروژه رو بسازین باید یه دانش متوسط از پایتون داشته باشید. البته من اینجا همه چی رو سعی کردم از صفر بگم ولی خب خودتونم یکم بلد باشین خیلی خوب میشه... خب بریم سراغ تقسیم مراحل:

تقسیم مراحل پروژه ساخت کپچا با پایتون:

همونطور که خودتون میدونید و قبلا هم گفتم، برای اینکه بتونید یه پروژه رو با دردسر کمتری جلو ببرین باید اولین قدم رو اختصاص بدین به کشیدن یه تصویر ذهنی از پروژه و تقسیم بندی مراحل مختلف. این کار بهتون یه مسیر واضح نشون میده که اگه توی اون مسیر جلو برین شانس اینکه پروژه‌تون خطا بده خیلی کمتر میشه..! پس بیاین این پروژه رو تقسیم بندی کنیم:

1- نصب ماژول‌ها و ایمپورت اونا به کتابخونه

2- تعریف کپچا

3- ساخت کپچا به شکل عکس

4- ساخت پنجره گرافیکی و اضافه کردن کپچا به شکل عکس

5- اضافه کردن تکست باکس و دکمه و لیبل

6- ساخت بخش چک کننده درست بودن کپچا

1- نصب ماژول‌ها و ایمپورت اونا به کتابخونه

خیلی خب. برای اینکه بتونیم توی پایتون کپچا درست کنیم به کتابخونه captcha نیاز داریم. این کتابخونه قابلیت ساخت کپچاهای تصویری و صوتی رو داره که توی این پروژه ما میخوایم از قابلیت کپچا تصویری استفاده کنیم اما قبل از استفاده باید این کتابخونه رو نصب کنیم چون به صورت پیشفرض توی پایتون وجود نداره. پس توی ترمینال یا CMD سیستم عاملتون بنویسید:

pip install captcha

مرحله نصب که تموم شد، یعنی کتابخونه رو دانلود کرد و نصب کرد و پیغام نصب با موفقیت براتون نشون داده شد، میتونید برین سراغ کدنویسی! پس یه فایل پایتونی درست کنید و یه اسم براش بذارین. دقت کنید که اسم فایل captcha نباشه! چون ممکنه به خطا بخورین.

حالا باید بخشی که کپچای تصویری درست میکنه رو به برنامه وارد کنیم. برای اینکار باید بنویسیم:

from captcha.image import ImageCaptcha

مرحله اول تموم شد! خسته نباشید

2- تعریف کپچا

هدف ما تو این مرحله اینه که برنامه‌ای بنویسیم که یه کلمه بهش بدیم و توی سایز دلخواه اون کلمه رو به شکل عکس کپچا مانند درست کنه! برای اینکار باید از تابع ImageCaptcha استفاده کنیم. یعنی:

cap = ImageCaptcha(width=280, height=90)

اینجا گفتیم که یه عکس خالی درست کن با ابعاد 280 در 90 و به متغیری به اسم cap نسبت بده. توی این cap قراره یه کلمه بنویسیم. کلمه از کجا بیاریم؟ خیلی ساده:

c_text = "tameshk"

data = cap.generate(c_text)

خب اینجا یه کلمه دادیم و توی متغیر c_text ذخیره کردیم. حالا اون cap که ساختیم یادتونه؟ باید بهش بگیم که توی اون تصویر، کلمه‌ای که دادیم رو generate کن. پس همین کارو کردیم و داخل متغیر data ذخیره کردیم. الان وقت چیه؟ وقت اینه که این کپچا که ساختیم رو به شکل عکس در بیاریم…

3- ساخت کپچا به شکل عکس

توی این مرحله باید کپچایی که ساختیم رو به شکل عکس در بیاریم. پس مینویسیم:

cap.write(c_text , "c.png")

اینجا چیکار کردیم؟ گفتیم که توی تصویر cap با متد write بیا توش یه چیزی قرار بده. چی؟ خب این متد دو تا پارامتر میگیره، یکی اون کلمه‌ای که باید توی تصویر قرار بگیره و دومی هم مسیری برای ذخیره عکس ساخته شده. پس چیزایی که میخواد رو بهش میدیم. الان اگه تا اینجا برنامه رو نوشته باشید و اجراش کنید باید کنار فایل پایتونی‌‌تون یه عکس کپچا شکل با اون کلمه‌ای که دادین ساخته شده باشه! خب.. اینطوری کیف نمیده خیلی! پس بیاین برنامه رو گرافیکیش کنیم

4- ساخت پنجره گرافیکی و اضافه کردن کپچا به شکل عکس

برای اینکه یه برنامه گرافیکی توی پایتون بسازین باید با کتابخونه‌ها و فریم‌ورک‌های گرافیکی کار کنید. مثل کیوی، PyQt، tkinter و… اما ما میخوایم از دم دستی‌ترینشون یعنی tkinter استفاده کنیم که این پروژه رو زودتر بسازیم! خوبی که tkinter داره اینه که نیازی به نصب نداره و همینطوری یه راست میتونیم بریم سراغ برنامه‌نویسی. پس بیاین ایمپورتش کنیم و یه پنجره خالی بسازیم:

from tkinter import *

اینجا گفتیم که از کتابخونه tkinter هر چی داره رو ایمپورت کن! این کار خیلی کار درستی نیست و خودمم بهتون پیشنهاد نمیکنم! چون بهتره که فقط اون چیزایی که نیاز دارین رو وارد برنامه کنید. ولی چون توی این آموزش گیج نشین من اینطوری نوشتم. از آخر میگم شما چطوری بنویسید! (البته خودتونم فکر کنم باید بلد باشین).

نکته دیگه‌ای که باید دقت کنید اینه که این دستور رو هم بالای برنامه‌تون و اونجایی که کتابخونه کپچا رو ایمپورت کردید بنویسید. کلا سعی کنید بخش ایمپورت کردنا جدا باشه از بقیه کدهاتون! اینطوری تمیزتره

حالا بیاین یه پنجره خالی بسازیم:

root = Tk()

canvas = Canvas(root, width=300, height=300)

canvas.pack()

اینجا یه پنجره 300 در 300 ساختیم. اگه با کتابخونه tkinter آشنایی ندارین و دوست دارین یاد بگیرین توی کامنت‌ها بگین تا آموزش‌هاشو شروع کنم ولی اگه دوست ندارین کلا به شکل حفظ وار این کدها رو بنویسید! حالا بیاین و آخر برنامه‌تون هم این دستور رو بنویسید:

mainloop()

این دستور باعث میشه که پنجره گرافیکی‌مون به صورت دائم و پیوسته برامون نمایش داده بشه. اگه برنامه رو تا الان اجرا بکنید یه پنجره گرافیکی خالی مشاهده میکنید. حالا باید اون عکس کپچا که ساختیم رو وارد پنجره گرافیکی‌مون بکنیم. برای اینکار باید بنویسیم:

img = PhotoImage(file = "c.png")

canvas.create_image(20,20,anchor = NW, image = img)

اینجا یه متغیر ساختیم به اسم img و اون فایل عکس کپچا رو با تابع PhotoImage وارد کردیم. دقت کنید که P و I رو بزرگ بنویسید. حالا تصویر رو وارد برنامه کردیم پس بیاین توی پنجره گرافیکی هم نمایشش بدیم. برای اینکار باید از تابع create_image استفاده کنیم. این تابع چند تا ورودی میگیره که دو تای اولی که میبینید 20 دادیم، موقعیت تصویر هستش. anchor=NW هم برای اینه که عکس رو از گوشه چپ و سمت بالا موقعیتش رو درست کنه. NW یعنی شمال غربی! و درنهایت هم میگیم که اون تصویری که میخواد نشون بده img خودمون باشه. بازم میگم چون آموزش پروژه محور هستش خیلی وقت نیست که روی دونه دونه این پارامترها وقت بذاریم و توضیحشون بدیم. اگر خواستین عمیق‌تر یاد بگیرین توی کامنت‌ها بنویسید تا آموزشش رو درست کنم.

خب تا اینجا اگر برنامه رو اجرا کنید میبینید که اون کپچا ما توی پنجره گرافیکی نشون داده میشه!

5- اضافه کردن تکست باکس و دکمه و لیبل

خب حالا یه تکست باکس لازم داریم که کاربر بتونه کپچایی که میبینه رو بنویسه. پس بیاین بنویسیمش:

txt = Entry(root)

canvas.create_window(150, 140, window=txt)

Entry همون تکست باکس خودمونه! برای اضافه کردن تکست باکس به پنجره گرافیکی‌مون باید از تابع create_window استفاده کنیم. که 3 تا پارامتر میگیره، دوتای اولی موقعیت تکست باکس هستش و سومی هم اون چیزی که میخوایم به پنجره گرافیکی اضافه کنیم هستش که همون txt یا تکست‌ باکسمونه…

حالا بیاین یه دکمه هم اضافه کنیم:

btn = Button(root, text="Check!")

btn.place(x = 120,y=160)

اینم که ساده‌اس یه دکمه با متن Check! ساختیم. فقط اینجا برای اینکه دکمه رو به پنجره‌مون اضافه کنیم از تابع place استفاده کردیم که دو تا پارامتر میگیره که همون ورودی هستش.

حالا در نهایت یه لیبل هم باید اضافه کنیم. این لیبل قراره بهمون بگه که کپچا رو درست وارد کردیم یا نه؟ پس اضافه‌اش میکنیم:

lbl = Label(root, text= "Enter Captcha!")

lbl.place(x = 120, y= 200)

توی اولین مرحله که کاربر هنوز هیچی وارد نکرده، متن لیبل رو گذاشتیم Enter Captcha!. قراره این متن وقتی روی دکمه کلیک کردیم عوض بشه و اگر کاربر کپچا رو درست نوشته بود، نوشته بشه که درسته و اگر کاربر درست ننوشته بود، نوشته بشه که درست نیست!

6- ساخت بخش چک کننده درست بودن کپچا

خب حالا برنامه از کجا چک کنه که ورودی کاربر برابر کپچا هستش یا نه!؟ چطوری باید بنویسیم وقتی کاربر روی دکمه Check! کلیک کرد این چک کردن انجام بشه؟ برای اینکار باید یه تابع بسازیم و شرط بذاریم که اگر ورودی کاربر برابر کپچا بود، متن لیبل رو به “درسته” تغییر بده و اگر برابر نبود متن لیبل رو به “غلطه” تغییر بده. پس بیاین اینو بنویسیم:


def check():

if txt.get() == c_text:

lbl['text'] = "Doroste!"

else:

lbl['text'] = "Ghalate!"


خب حالا باید بگیم که وقتی روی دکمه کلیک کردیم این تابع اجرا بشه. برای اینکار باید اون بخشی که دکمه ساختیم رو یه تغییر کوچولو بدیم:

1

btn = Button(root, text="Check!", command=check)

درواقع فقط یه تیکه command = check اضافه کردیم. این باعث میشه وقتی که روی دکمه کلیک کردیم تابع check که نوشتیم اجرا بشه. فقط اینو باید دقت کنید که چون پایتون کدها رو از بالا به پایین اجرا میکنه، وقتی میرسه به این دکمه که توش نوشتیم تابع check اجرا بشه، باید قبلش این تابع وجود داشته باشه دیگه… پس دستورات تابع رو حتما بالای تعریف دکمه بنویسید.


خب! خسته نباشید کارمون تمومه. برنامه رو اجرا کنید و از نتیجه‌اش لذت ببرید…

کل برنامه در یک نگاه:

from captcha.image import ImageCaptcha

from tkinter import *

#for gui window

root = Tk()

canvas = Canvas(root, width=300, height=300)

canvas.pack()

#for create captcha

cap = ImageCaptcha(width=280, height=90)

c_text = "learnpy"

data = cap.generate(c_text)

cap.write(c_text , "c.png")

#for show captcha

img = PhotoImage(file = "c.png")

canvas.create_image(20,20,anchor = NW, image = img)

#for textbox

txt = Entry(root)

canvas.create_window(150, 140, window=txt)

#check captcha

def check():

if txt.get() == c_text:

lbl['text'] = "Doroste!"

else:

lbl['text'] = "Ghalate!"

#for check button

btn = Button(root, text="Check!", command=check)

btn.place(x = 120,y=160)

#for label

lbl = Label(root, text= "Enter Captcha!")

lbl.place(x = 120, y= 200)

mainloop()

ادامه راه…

حالا بیاین و به عنوان تمرین چند تا ویژگی دیگه به این برنامه اضافه کنید…

ویژگی اول: چند تا کلمه مختلف بنویسید که هر بار یه کپچا مختلف نمایش داده بشه.

ویژگی دوم: اگر کاربر کلمه اشتباهی وارد کرد، کپچا عوض بشه.

سخن پایانی

خب توی این آموزش پروژه محور پایتون هم یه پروژه دیگه (ساخت کپچا با پایتون) ساختیم که امیدوارم ازش لذت برده باشین و چیزای جدید هم یاد گرفته باشید ازش. برای اینکه کتابخونه tkinter رو به شکل بهینه‌تری وارد برنامه کنیم میتونیم بگیم که فقط دکمه و تکست باکس و… رو ایمپورت کن یعنی:

from tkinter import Tk,Canvas,PhotoImage,Entry,Button,Label,mainloop,NW


و به رسم همیشه تا اینجا که اومدید...

حتما یوتیوب رو ساب کنید و اینستاگرام هم دنبال کنید که آموزشای باحالی تو راهن?

کد های آموزش هارو هم می تونید توی گیت هاب تمشک پیدا کنید...

راستی اگه دیسکورد دارین حتما تو سرور دیسکورد هم جوین بشید که برنامه ها و چالش های خفنی داریم!

اگه این پست رو دوست داشتین لایک، کامنت و دنبال کردن انتشارات یادتون نره?

راستی اگه مشکلی داشتید حتما تو کامنتا بگید باهم رفعش می کنیم ^_^

© منابع : تمشک، آی کد آکادمی