شروع برنامه نویسی ربات تلگرام با پایتون

تو این پست نمیخوام یه دوره آموزشی رو شروع کنم و صرفا فقط درباره ربات تلگرام و کدنویسیش تو پایتون رو توضیح میدم طوری که ادامشو بتونید خودتون یاد بگیرید.

برای استفاده از متود های تلگرامی دو راه وجود داره:

با ای پی آی ربات های تلگرامی, به سادگی میشه هر دستوری رو در هرزبانی اجرا کرد

قالب کلی api به این شکل است:

https://api.telegram.org/bot<token>/METHOD_NAME

بجای <token> توکنی که از Bot Father گرفته شده و بجای METHOD_NAME دستوری که میخواید ربات اجرا کنه رو جاگذاری کنید

برای مثال میخوایم با ربات یه پیام به خودمون بفرستیم

برای اینکه ربات بتونه به یه کاربر پیام بفرسته حتما باید اون کاربر رباتو حداقل یک بار /start کرده باشه

برای اینکار از متود sendMessage استفاده میکنیم

https://core.telegram.org/bots/api#sendmessage
https://core.telegram.org/bots/api#sendmessage
https://api.telegram.org/bot<token>/sendMessage?chat_id=<your_id>&text=سلام


در این لینک اگر توکن رباتتون و آیدی خودتون رو بجای <your_id> جاگذاری کنید و لینکو با یه مرورگر بارگذاری کنید, ربات متن سلام رو برای شما میفرسته.

بقیه دستورات ربات هم با همین روش کار میکنند ولی ورودی‌(Parameter) های مختلفی دارند.

ولی ربات هایی که از MTproto استفاده میکنن با این روش کار نمیکنن.

ربات های MTProto دقیقا مثل اپلیکیشن تلگرام خود شما عمل میکنن.

یعنی برای اولین بار مثل اپلیکیشن باید در اکانت یا ربات لاگین کنن و متود هاشونم مثل اونه.

بنابراین قابلیت های یکسانی هم دارند.

مثلا وقتی شما یه متنی رو تایپ میکنی و میفرستی, مثل همون کاری هست که یه ربات MTproto موقع sendMessage میکنه.



تو این آموزش از فریم ورک pyrogram استفاده میکنیم که با MTproto کار میکنه.

پایروگرم بعد از ورژن 1.0.0 کتابخونه async شده و به همین دلیل سرعتش هم بالاتر رفته, ولی برای استفاده از ورژن های بالاتر 1.0.0 باید آشنایی حدودی با async داشته باشید تا در نوشتن کدتون به مشکل نخورید.

درغیر این صورت میتونید از ورژن 0.18.0 استفاده کنید ولی امکان داره به این مشکلات بربخورید:

  • دلیت شدن اکانت! یکی از بزرگترین مشکلات پایروگرم ورژن 0.18.0 و پایین تر, اینه که به محض اینکه شما کد رو روی اکانتتون ران میکنید, اکانت دلیت میشه. (اگر اکانتتون با شماره مجازی ساخته شده باشه احتمال دلیت شدن خیلی بیشتره)
  • اگر قابلیت جدیدی به تلگرام اضافه بشه و آپدیت بشه, کتابخونه پایروگرم فقط اون آپدیت هارو روی نسخه async پیاده میکنه, و شما در نسخه 0.18.0 قادر به استفاده از اون قابلیت جدید نیستید.

برای همین نسخه پیشنهادی من 1 به بالا یا همون نسخه آخر هست.

نصب پایروگرم نسخه آخر:

pip install pyrogram tgcrypto

نصب پایروگرم نسخه 0.18.0 (sync):

pip install pyrogram==0.18.0 tgcrypto

برای شروع کدنویسی, باید Client رو از pyrogram ایمپورت کنیم

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

from pyrogram import Client

حالا با استفاده از Client آبجکت رباتمون رو میسازیم.

app = Client('my_telegram_bot', api_id, api_hash)

'my_telelgram_bot' اسمی هست که ما برای سشن انتخاب کردیم تا برای هردفعه ران کردن ربات, نیاز به لاگین نداشته باشیم

api_id و api_hash اطلاعات مربوط به api key شما هست

که باید اونارو از My Telegram بگیرید.

حالا برای شروع ربات به کار کردن باید متود run رو فراخوانی کنیم

app.run()

درحال حاضر کد به این شکله:

from pyrogram import Client
app = Client('my_telegram_bot', api_id, api_hash)
app.run()

کد رو اجرا میکنیم. بعد از اجرا برنامه از ما شماره تلفن و کدی که تلگرام فرستاده رو میگیره, و اگر اطلاعات رو درست وارد کنید از تلگرام براتون پیامی درباره لاگین در اکانتتون میاد.

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


قبل از اون بیاید نگاهی به app.run بندازیم. کل این دستور از این کد تشکیل شده:

from pyrogram import idle

app.start()
idle()
app.stop()

متود استارت باعث میشه ربات شروع به کار کردن کنه

بعد از استارت idle برنامه رو وارد یه حلقه بینهایت میکنه تا ربات همیشه بتونه update ها و پیام هارو دریافت کنه

وقتی برنامه با Ctrl-C یا هر نحو دیگه ای kill بشه, از حلقه idle خارج میشه و app.stop رو اجرا میکنه تا دیتابیس برنامه رو ببنده.

تمام دستورات باید بعد از start شدن و قبل از stop شدن ربات اجرا بشه.


حالا برای مثال با دستور send_message یه پیام میفرستیم.

این دستور پارامترهای زیرو میگیره که chat_id و text الزامی هستن.

همونطور که گفته شد باید دستورات بین استارت و استاپ نوشته بشن

ولی میتونیم از with هم استفاده کنیم, with app قبل از کدی که زیرش نوشته میشه app رو استارت و بعد از اون app رو استاپ میکنه. یعنی دقیقا همون چیزی که ما میخوایم!

from pyrogram import Client
app = Client('my_telegram_bot', api_id, api_hash)

with app:
    app.send_message('me', 'تست')

بجای پارامتر chat_id, کلمه me قرار داده شده که منظور همون اکانتیه که ربات روش ران شده,

به عبارتی پیام به Saved Messages فرستاده میشه.

به جز send_message میتونید از هر متودی که میخواید استفاده کنید,

لیست کامل دستورات رو میتونید از این لینک دریافت کنید


برای دریافت پیام ها و آپدیت ها, برنامه باید همیشه درحال کار کردن باشه پس باید از app.run استفاده کنیم و روش بالا جوابگو نیست.

در ربات های تلگرامی چند نوع آپدیت گرفته میشه که پر استفاده ترینشون این ها هستند:

  • Message - هر پیامی که توی چت دیده میشه
  • Callback - وقتی روی دکمه شیشه ای کلیک میشه
  • Inline - وقتی یوزرنیم یه ربات اینلاین توی چت نوشته میشه و ربات جواب میده


برای دریافت پیام, از دیکوریتور on_message استفاده میکنیم.

@app.on_message()
def message_handler(client, message):
    print('I received a message!')

به این صورت, هروقت پیامی به کلاینت فرستاده میشه, آبجکت appـی که پیام رو دریافت کرده به client, و آبجکت Message ساخته شده با پیام به متود پاس داده میشه و متود رو اجرا میکنه و عبارت I received a message چاپ میشه.

حالا مشکل اینجاست که هرپیامی بیاد تابع اجرا میشه, باید از filters استفاده کنیم تا نحوه دریافت پیام رو محدود کنیم.

به خط اول برمیگردیم و filters رو ایمپورت میکنیم:

from pyrogram import Client, filters

نسخه 0.18.0 و پایین تر:

from pyrogram import Client, Filters as filters

برای مثال برای دریافت پیام هایی که به صورت دستور هستند از filters.command استفاده میکنیم:

@app.on_message(filters.command('start'))
def start_command(client, message):
    print('I received /start command!')

در کد بالا هر پیامی که با کلمه /start شروع شه موجب اجرای تابع start_command میشه.

لیست کاملی از فیلتر ها رو میتونید از این لینک دریافت کنید


خب حالا چجوری به پیام دریافت شده پاسخ بدیم؟

اگه یادتون باشه برای فرستادن پیام به خود کلاینت, از "me" بجای پارامتر chat_id در متود send_message استفاده کردیم.

ولی چت آیدی کسی که پیامو فرستاده رو میتونیم از message خارج کنیم!

message.chat چتی هست که پیام داخلش فرستاده شده

و message.chat.id هم آیدی اون چت.

همونطور که گفته شد, client هم دریافت کننده پیام هست.

پس:

@app.on_message(filters.command('start'))
def start_command(client, message):
    client.send_message(message.chat.id, f'Salam {message.from_user.first_name}')

این کد به کسی که دستور /start رو ارسال کنه یه پیام حاوی اسمش میفرسته!

message.from_user کسی هست که پیامو فرستاده و تمام اطلاعاتش هم تو همین آبجکت قرار داده

مثلا ما از message.from_user.first_name استفاده کردیم که اسم فرستنده پیامه.

از بقیه اطلاعات message هم میتونید به نحوی که میخواید ارسال کنید.

لیست کامل اطلاعات message رو میتونید از این لینک دریافت کنید


کتابخونه پایروگرم یه سری Bound Method واسه راحتی کار ما درست کرده,

درواقع این متود ها دقیقا متود های Client هستن با این تفاوت که بعضی پارامتر ها خودکار داده میشن تا کار رو برای ما آسون کنن

‌Bound Method: message.reply_text
‌Bound Method: message.reply_text

ما هم در این کد از message.reply_text استفاده میکنیم تا خیلی راحت تر و تمیز تر به کاربر جواب بدیم:

@app.on_message(filters.command('start'))
def start_command(client, message):
    message.reply_text(f'Salam {message.from_user.first_name}')

همونطور که میبینید این متود همونکار send_message رو انجام میده ولی پارامتر های chat_id و reply_to_message_id خودکار داده شدن.

برای دریافت همه Bound Method ها روی این لینک کلیک کنید.


کد نهایی:

from pyrogram import Client, filters

app = Client('my_telegram_bot', api_id, api_hash)

@app.on_message(filters.command('start'))
def start_command(client, message):
    message.reply_text(f'Salam {message.from_user.first_name}')

app.run()


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

هر متود یا تایپ یا چیز دیگه ای که خواستید استفاده کنید میتونید از داکیومنت پایروگرم توضیحاتشو بخونید.

Pyrogram Documentation

برای یادگیری اون Callback و Inline و چیزای دیگه میتونید از بخش مثال ها کمک بگیرید.

Pyrogram Code Examples


امیدوارم این پست بتونه بهتون کمک کنه. یاعلی.