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

تو این پست نمیخوام یه دوره آموزشی رو شروع کنم و صرفا فقط درباره ربات تلگرام و کدنویسیش تو پایتون رو توضیح میدم طوری که ادامشو بتونید خودتون یاد بگیرید.برای استفاده از متود های تلگرامی دو راه وجود داره:HTTP API تلگرامMTProtoبا ای پی آی ربات های تلگرامی, به سادگی میشه هر دستوری رو در هرزبانی اجرا کردقالب کلی api به این شکل است:https://api.telegram.org/bot<token>/METHOD_NAMEبجای <token> توکنی که از Bot Father گرفته شده و بجای METHOD_NAME دستوری که میخواید ربات اجرا کنه رو جاگذاری کنیدبرای مثال میخوایم با ربات یه پیام به خودمون بفرستیمبرای اینکه ربات بتونه به یه کاربر پیام بفرسته حتما باید اون کاربر رباتو حداقل یک بار /start کرده باشهبرای اینکار از متود sendMessage استفاده میکنیمhttps://core.telegram.org/bots/api#sendmessagehttps://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ما هم در این کد از 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امیدوارم این پست بتونه بهتون کمک کنه. یاعلی.