ربات تلگرام
MadelineProto یا Bot API؟ مقایسه برای ساخت ربات تلگرام با PHP
در انتخاب MadelineProto یا Bot API، ربات های فروش، پشتیبانی و عضویت معمولا با Bot API و وبهوک راه می افتند. MadelineProto وقتی لازم می شود که ربات فایل بزرگ تر از ۵۰ مگابایت آپلود کند، فایل بالای ۲۰ مگابایت دانلود کند یا کار باید با اکانت کاربری انجام شود.
اگر ربات تلگرام را با PHP می نویسید، کار معمولا با Bot API شروع می شود و سؤال MadelineProto یا Bot API وقتی پیش می آید که ربات به اولین سقف Bot API می خورد. هر دو به تلگرام وصل می شوند، ولی از دو مسیر جدا. Bot API رابط HTTP است که تلگرام برای ربات ها ساخته و MadelineProto کلاینت MTProto است که مثل اپ تلگرام مستقیم با سرورها حرف می زند. همین تفاوت مسیر روی حجم فایل، دسترسی به گروه ها و کانال ها، درگیر شدن اکانت شخصی و نوع هاست اثر می گذارد.
Bot API چطور کار می کند
ربات Bot API با توکنی کار می کند که از @BotFather می گیرید. هر درخواست با HTTPS به آدرسی به شکل https://api.telegram.org/bot<token>/METHOD_NAME فرستاده می شود و جواب به صورت JSON برمی گردد. برای فرستادن پیام، کد شما متد sendMessage را صدا می زند و هر کتابخانه HTTP در PHP برای این کار کافی است.
برای گرفتن پیام ها دو روش هست و طبق مستندات Bot API نمی شود هم زمان از هر دو استفاده کرد:
- با
getUpdatesیا long polling، اسکریپت شما خودش آپدیت های جدید را از تلگرام می خواهد. هر پاسخ حداکثر ۱۰۰ آپدیت دارد و برای تأیید آن ها باید در فراخوانی بعدیoffsetرا یکی بیشتر از آخرینupdate_idبفرستید. - با وبهوک (
setWebhook)، تلگرام هر آپدیت را با یک درخواست POST به آدرسی که ثبت کرده اید می فرستد. آدرس باید گواهی SSL معتبر داشته باشد و فقط پورت های 443، 80، 88 و 8443 پذیرفته می شوند.
آپدیت هایی که ربات تحویل نگرفته، حداکثر ۲۴ ساعت روی سرور تلگرام می مانند. اگر اسکریپت چند ساعت از کار بیفتد، پیام ها بعد از برگشتنش می رسند، ولی اگر بیشتر از یک روز خاموش بماند، بخشی از آن ها از دست رفته است.
وبهوک برای هاست ساده ترین حالت است. هر آپدیت یک اجرای کوتاه PHP است، مثل باز شدن یک صفحه سایت، و برای همین روی هاست اشتراکی cPanel هم اجرا می شود. مراحل ثبت وبهوک و خطاهای رایجش را در مقاله جدایی نوشته ایم.
MTProto چیست و MadelineProto کجای کار قرار می گیرد
MTProto پروتکلی است که اپ های رسمی تلگرام روی موبایل و دسکتاپ با آن به سرورها وصل می شوند. سرور Bot API، که تلگرام کدش را هم منتشر کرده، بین کد شما و همین پروتکل قرار دارد. درخواست HTTP شما را می گیرد و کار را از طریق MTProto انجام می دهد.
MadelineProto کتابخانه ای PHP است که MTProto را مستقیم پیاده سازی کرده. هم با شماره تلفن وارد می شود و هم با توکن ربات، و در حالت دوم هم درخواست ها از Bot API عبور نمی کنند. با آن دو نوع برنامه می شود نوشت:
- یوزربات، یعنی یک اکانت واقعی تلگرام که اسکریپت کنترلش را دارد. کارهایی که کاربر در اپ انجام می دهد، مثل عضو شدن در کانال یا خواندن پیام های گروهی که عضوش است، از کد هم شدنی است.
- ربات روی MTProto، یعنی همان رباتی که با BotFather ساخته اید و این بار مستقیم به سرورهای تلگرام وصل می شود.
ورود از طریق MTProto ربات را به کاربر تبدیل نمی کند و محدودیت های حساب ربات سر جایش می ماند؛ برای مثال ربات ها پیام ربات های دیگر را نمی بینند. مسیر اتصال عوض می شود و سقف هایی که مخصوص سرور Bot API هستند، مثل سقف حجم فایل، کنار می روند.
تفاوت MadelineProto و Bot API در یک جدول
روشن ترین تفاوت در حجم فایل است: Bot API آپلود را به ۵۰ مگابایت و دانلود را به ۲۰ مگابایت محدود می کند و MadelineProto فایل تا ۴ گیگابایت را پشتیبانی می کند. عددهای جدول از مستندات Bot API، سؤالات رایج ربات ها و مستندات MadelineProto آمده اند.
| موضوع | Bot API | MadelineProto |
|---|---|---|
| اتصال | HTTPS به api.telegram.org | اتصال مستقیم MTProto به سرورهای تلگرام |
| نوع حساب | فقط ربات | کاربر یا ربات |
| دریافت آپدیت | وبهوک یا getUpdates | پروسس همیشه روشن با event handler |
| آپلود فایل | ۵۰ مگابایت، عکس ۱۰ مگابایت | تا ۴ گیگابایت طبق مستندات، بسته به نوع حساب |
| دانلود فایل | ۲۰ مگابایت با getFile | تا ۴ گیگابایت |
| دسترسی به گروه و کانال | فقط جایی که ربات عضو است، با قید privacy mode | هر جایی که اکانت عضو است (در حالت کاربر) |
| نسخه PHP | تلگرام شرطی ندارد؛ به کتابخانه شما بستگی دارد | PHP 8.3 یا بالاتر با افزونه gmp و چند افزونه دیگر |
| هاست | هاست اشتراکی با SSL | پروسس طولانی مدت و رم بیشتر؛ هاست مخصوص یا VPS |
| ریسک اکانت | اکانت شخصی درگیر نیست | اکانت های کلاینت غیررسمی زیر نظر تلگرام اند |
| شروع کار | چند خط کد و یک وبهوک | نصب، ورود، نگهداری session |
محدودیت Bot API در حجم فایل و سرعت ارسال
حجم فایل
Bot API عمومی آپلود عکس را به ۱۰ مگابایت، آپلود فایل های دیگر را به ۵۰ مگابایت و دانلود با getFile را به ۲۰ مگابایت محدود می کند. اگر فایل را با لینک بفرستید، سقف پایین تر است:
| کار | سقف در Bot API |
|---|---|
| آپلود عکس با multipart/form-data | ۱۰ مگابایت |
| آپلود فایل های دیگر با multipart/form-data | ۵۰ مگابایت |
| ارسال عکس با لینک HTTP | ۵ مگابایت |
| ارسال فایل های دیگر با لینک HTTP | ۲۰ مگابایت |
| دانلود فایل با getFile | ۲۰ مگابایت |
برای فایلی که قبلا روی سرورهای تلگرام هست، مستندات فرستادن file_id را توصیه می کند تا فایل دوباره آپلود نشود. سقف ها وقتی دردسر می شوند که ربات باید فایل تازه ای بزرگ تر از ۵۰ مگابایت، مثلا ویدیویی از یک لینک، آپلود کند یا فایل بالای ۲۰ مگابایتی را که کاربر فرستاده دانلود و پردازش کند.
برای این حالت دو راه دارید. اولی اجرای سرور Bot API روی سرور خودتان است. با سرور محلی آپلود تا ۲۰۰۰ مگابایت ممکن می شود، دانلود سقف ندارد و وبهوک می تواند HTTP ساده و روی هر پورتی باشد. این سرور برنامه مستقلی است که باید همیشه روشن بماند، پس جایش روی VPS است و روی هاست اشتراکی معمولا اجرا نمی شود.
راه دوم MTProto است. MadelineProto در مستنداتش حداکثر حجم فایل را ۴ گیگابایت اعلام کرده، ولی سقف واقعی به حساب هم بستگی دارد. تلگرام از سال ۲۰۲۰ ارسال فایل تا ۲ گیگابایت را برای همه کاربران باز کرده و آپلود ۴ گیگابایتی را جزو امکانات Premium گذاشته است.
سرعت ارسال پیام
طبق سؤالات رایج ربات ها، ربات Bot API در هر چت نباید بیشتر از یک پیام در ثانیه بفرستد، در گروه بیشتر از ۲۰ پیام در دقیقه نمی تواند بفرستد و سقف ارسال همگانی اش حدود ۳۰ پیام در ثانیه است. تلگرام جهش کوتاه را تحمل می کند، ولی اگر ادامه پیدا کند خطای 429 برمی گرداند.
ربات هایی که paid broadcast را در BotFather فعال کنند تا ۱۰۰۰ پیام در ثانیه می فرستند و برای پیام های بالای سقف رایگان، هر پیام ۰٫۱ Star می پردازند. شرط فعال شدنش ۱۰۰ هزار Star موجودی و ۱۰۰ هزار کاربر فعال ماهانه است، پس ربات کوچک یا متوسط به آن دسترسی ندارد. تلگرام به بقیه پیشنهاد می کند پیام همگانی را در بازه ای طولانی تر، مثلا ۸ تا ۱۲ ساعت، پخش کنند.
برای اکانت کاربری سقف عددی منتشر نشده است. وقتی درخواست ها زیاد شود، سرور خطای FLOOD_WAIT_X برمی گرداند، یعنی باید X ثانیه صبر کنید. ارسال انبوه پیام از اکانت کاربری همان flooding و spamming است که تلگرام ممنوع کرده، پس برای اطلاع رسانی همگانی از ربات و Bot API استفاده کنید.
ربات با اکانت کاربری و ریسک مسدود شدن
یوزربات ممکن است مسدود شود، حتی اگر خلافی نکرده باشید. تلگرام در صفحه دریافت api_id نوشته همه اکانت هایی که با کلاینت های غیررسمی API وارد می شوند خودکار زیر نظر قرار می گیرند و استفاده از API برای flooding، اسپم یا دستکاری آمار عضو و بازدید کانال به مسدود شدن دائمی می رسد.
مستندات MadelineProto هم می گوید شماره ای که با این کتابخانه وارد می شود ممکن است بدون هیچ خلافی مسدود شود. توصیه نویسنده کتابخانه این است که هنگام اولین ورود یا قبل از آن به [email protected] ایمیل بزنید، شماره را بنویسید و توضیح دهید یوزربات دقیقا چه کاری می کند. درخواست بررسی اکانت مسدودشده هم به همین آدرس فرستاده می شود.
قوانین API تلگرام دو بند دارد که مستقیم به یوزربات ها مربوط است. بند 1.4 انجام کار از طرف کاربر بدون اطلاع و رضایت او را ممنوع می کند. بند 1.5 استفاده از داده های تلگرام یا جمع کردن آن ها برای آموزش، تنظیم یا به کارگیری مدل های هوش مصنوعی را ممنوع می کند. یوزرباتی که پیام گروه ها را جمع می کند و به یک مدل زبانی می دهد، ممکن است مشمول همین بند شود.
در Bot API با توکن ربات کار می کنید و اکانت شخصی تان در درخواست ها نقشی ندارد. در یوزربات، اکانتی که ممکن است مسدود شود همان شماره ای است که با آن وارد شده اید، پس یوزربات را روی اکانتی که گروه ها و پیام های کاری تان در آن است امتحان نکنید.
هاست مناسب Bot API و MadelineProto
ربات Bot API با وبهوک روی هاست اشتراکی cPanel اجرا می شود. MadelineProto پروسسی همیشه روشن، PHP 8.3 و رم بیشتری می خواهد و جایش روی هاست مخصوص میدلاین یا سرور مجازی است.
ربات وبهوکی تقریبا منبع دائمی مصرف نمی کند، چون تا آپدیتی نرسد کدی از آن اجرا نمی شود. هاست ربات تلگرام cPanel پیکوهاست کنترل پنل cPanel، وب سرور LiteSpeed و امکان انتخاب نسخه PHP دارد و ساب دامین و SSL رایگان روی آن خودکار فعال می شود، یعنی همان چیزهایی که وبهوک لازم دارد.
ربات getUpdates به حلقه ای همیشه روشن نیاز دارد که پشت سرهم از تلگرام آپدیت بخواهد. روی هاست اشتراکی این حلقه به محدودیت زمان اجرا و تعداد پروسس می خورد، پس آنجا وبهوک انتخاب ساده تری است.
MadelineProto شرایط سخت تری دارد. به PHP 8.3 یا بالاتر با افزونه gmp و چند افزونه دیگر نیاز دارد و ربات با event handler کار می کند، یعنی پروسسی که باید همیشه روشن بماند و اتصالش به تلگرام را نگه دارد. داده های داخلی ربات، مثل اطلاعات چت ها و کاربرها، به طور پیش فرض در رم می مانند و برای کم کردن مصرف رم می شود آن ها را در MySQL، Postgres یا Redis نگه داشت. فهرست کامل افزونه ها و روش روشن نگه داشتن ربات با کرون جاب را در پیش نیازها و تنظیم اجرای دائمی MadelineProto آورده ایم.
برای یک یا دو ربات که با اجرای وب و کرون جاب کار می کنند، هاست میدلاین آلمان و هلند پیکوهاست با cPanel، سیستم عامل CloudLinux، دیتابیس MySQL و PostgreSQL و امکان انتخاب نسخه PHP ارائه می شود. جدول پلن ها تعداد پروسس و کانکشن هم زمان هر پلن را نشان می دهد و برای ربات MadelineProto باید قبل از خرید به آن نگاه کنید.
اگر Docker، دسترسی root یا چند ربات هم زمان لازم دارید، سرور مجازی بگیرید. Docker یکی از روش های اجرایی است که مستندات MadelineProto پیشنهاد می کند و بعضی تنظیمات، مثل بالا بردن vm.max_map_count برای رفع خطای Fiber stack، فقط با دسترسی root انجام می شوند. سرور مجازی هلند پیکوهاست با مجازی سازی KVM، هارد NVMe و رم DDR4 در آمستردام است. لوکیشن ها و انواع دیگر هاست ربات در راهنمای کامل میزبانی ربات تلگرام مقایسه شده اند.
MadelineProto یا Bot API برای کدام نوع ربات
ربات های فروش، پشتیبانی، عضویت و ارسال پست در کانال با Bot API راحت تر نوشته و نگهداری می شوند. MadelineProto برای فایل های بزرگ تر از سقف Bot API، خواندن پیام های قدیمی چت ها و کارهایی که اکانت کاربری لازم دارند مناسب است.
| نوع ربات | روش پیشنهادی | هاست |
|---|---|---|
| فروش، پشتیبانی یا عضویت | Bot API با وبهوک | هاست ربات تلگرام cPanel |
| ارسال و دریافت فایل تا ۵۰ مگابایت | Bot API | هاست ربات تلگرام cPanel |
| فایل بزرگ تر از ۵۰ مگابایت | MadelineProto با توکن ربات، یا سرور Bot API محلی | هاست میدلاین، یا VPS برای سرور محلی |
| پست گذاشتن در کانالی که ربات ادمین آن است | Bot API | هاست ربات تلگرام cPanel |
| خواندن پیام های قدیمی کانال یا گروهی که عضوش هستید | MadelineProto با اکانت کاربری | هاست میدلاین یا VPS |
| چند اکانت هم زمان، Docker یا تنظیمات root | MadelineProto | سرور مجازی |
ربات فروش، پشتیبانی یا عضویت
این ربات ها با دستور و دکمه کار می کنند، به دیتابیس وصل اند و فایل کوچک جابه جا می کنند. برای Bot API کتابخانه و نمونه کد زیادی هست و ربات روی هر هاست PHP با SSL اجرا می شود. MadelineProto در این حالت فقط نصب، نگهداری session و یک پروسس همیشه روشن را به کار اضافه می کند.
ربات دانلود و آپلود فایل
اگر ربات فایل بالای ۵۰ مگابایت آپلود نمی کند و فایل های بالای ۲۰ مگابایت کاربران را دانلود نمی کند، Bot API کافی است. برای فایل های بزرگ تر، یا MadelineProto را با توکن ربات به کار بگیرید یا سرور Bot API محلی را روی VPS راه بیندازید. MadelineProto شناسه فایل های Bot API را هم می پذیرد، پس file_idهایی که در دیتابیس دارید قابل استفاده می مانند.
مدیریت کانال و گروه
ارسال پست زمان بندی شده، ویرایش و حذف پیام در کانالی که ربات ادمین آن است با Bot API انجام می شود. ولی Bot API متدی برای خواندن تاریخچه پیام های یک چت ندارد و ربات فقط آپدیت هایی را می گیرد که برایش فرستاده می شود. در گروه هم اگر privacy mode روشن باشد و ربات ادمین نباشد، فقط دستورهای خطاب به خودش، پاسخ به پیام هایش و چند مورد محدود دیگر به دستش می رسد. برای خواندن پیام های قدیمی کانالی که عضوش هستید، یا کار در کانالی که ادمینش نیستید، اکانت کاربری و MadelineProto لازم است.
یوزربات و اتوماسیون اکانت
پاسخ خودکار از اکانت شخصی یا آمار گرفتن از گروه هایی که مدیرشان هستید فقط با اکانت کاربری انجام می شود. قبل از شروع، بخش ریسک مسدود شدن را بخوانید و مطمئن شوید هر کاری که یوزربات انجام می دهد با اطلاع و رضایت صاحب همان اکانت است. برای ارسال پیام انبوه یا جمع کردن اطلاعات اعضای گروه ها سراغ یوزربات نروید؛ ارسال انبوه همان flooding و اسپمی است که به مسدود شدن دائمی می رسد.
مهاجرت از Bot API به MadelineProto
اگر ربات فعلی روی Bot API کار می کند و فقط یک بخشش به MTProto نیاز دارد، لازم نیست همه کد را بازنویسی کنید. آن بخش را در یک ربات جدا با MadelineProto بنویسید و بقیه را روی وبهوک نگه دارید. برای انتقال کامل، این ترتیب کار را ساده تر می کند:
- با یک ربات آزمایشی از BotFather شروع کنید تا ربات اصلی وسط کار از دسترس خارج نشود. نصب و ورود را طبق آموزش قدم به قدم نصب MadelineProto روی cPanel انجام دهید.
- منطق هر نوع پیام را، که در وبهوک داخل یک فایل PHP بود، به متدهایی با attribute
#[Handler]در کلاس event handler منتقل کنید. - توابع مسدودکننده مثل
file_get_contents،curl_exec،PDOوmysqli_queryرا با کتابخانه های amphp، مثل amphp/http-client و amphp/mysql، عوض کنید. MadelineProto اگر این توابع را در event handler ببیند، ربات را اجرا نمی کند. file_idهای ذخیره شده را نگه دارید، چون متدهای فایل MadelineProto شناسه فایل Bot API را قبول می کنند.- آیدی عددی چت ها و کاربرها فقط وقتی کار می کند که ربات قبلا آن ها را دیده باشد و در غیر این صورت خطای
This peer is not present in the internal peer databaseمی گیرید. resolve کردن یوزرنیم باgetInfoیا عضو شدن با لینک دعوت، آن چت را به دیتابیس داخلی اضافه می کند.