سلام، اگه سابقه توسعه ربات تلگرام رو داشته باشید یکی از مفاهیمی که احتمالا درگیرش بودید وبهوک هستش اما واقعا این وبهوک چیه؟ روش جایگزینی نبوده؟ به غیر از توسعه ربات تلگرام کجا ها استفاده میشه؟
زمانی که یه سرویس خارجی (سرویسی که شما توسعش ندادید) رو استفاده میکنید و میخواید از تغییراتی که اون سمت ایجاد میشه مطلع بشید چه کارهایی میتونید بکنید؟ یکی از گزینه ها Polling هست و یکی دیگه از گزینه ها Webhook
توی توسعه ربات تلگرام یه API وجود داره که مسیرش(path) getUpdates هست و لیست اتفاقات جدیدی که از سمت یوزر ها با ربات افتاده(مثل استارت کردن ربات، ارسال یه عکس یا ...) رو داخل یه آرایه بهمون بر میگردونه و بر اساس اون ما میتونیم تصمیم بگیریم که چه پاسخی رو به کاربر بدیم.
اما یه سوال، هر چند وقت یکبار باید به این API ریکوئست بزنیم؟ اگه فقط یکبار بزنیم فقط آپدیتها رو تا اون لحظهای که ریکوئست زدیم داریم، پس نیازه که توی یه بازه زمانی مشخص درخواستامون رو به سرور های تلگرام ارسال کنیم، مثلا هر ۵ ثانیه یکبار.
اما حالتی رو تصور کنید که ساعت 15:00:05 هست و ما یه درخواست فرستادیم برای تلگرام و درخواست بعدیمون قراره ساعت 15:00:10 باشه، تکلیف کاربری که توی ثانیه 6 یه عملیاتی رو توی ربات انجام میده چیه؟ هیچی! باید تا ثانیه 10 صبر کنه تا تازه تصمیم بگیریم چیکار کنیم براش :(
اینجاست که روش Webhook میاد که بهمون یه راه حلی رو عرضه کنه.
روش قبلی توی دنیای واقعی مثل این بود که شما یه گمشدهای داشته باشید و هر چند وقت یکبار تماس بگیرید با افراد و بگید خبر جدیدی نشد؟
اما وبهوک یعنی به اون شخص اطلاع بدید که دنبال چی هستید و بگید به محض اینکه خبری گرفت به اون شماره تلفنی که بهش میدید زنگ بزنه و خبر بده.
مثلا توی مورد تلگرام یه API با مسیر /setWebhook وجود داره که یه URL رو ورودی میگیره تا هر اتفاق جدیدی که میوفته رو به اون URL در قالب یه POST Request اطلاع بده.
پس برای اینکه از Webhook استفاده کنیم قدم اولش اینه که اون سرویس خارجیای که قصد داریم ازش استفاده کنیم این امکان رو بهمون بده که اکشن هایی که از سمت کاربر استفاده کنندش انجام میشه رو به آدرسی که میگیم ارسال بکنه.
گیتهاب یکی از سرویس هاییه که از Webhook پشتیبانی میکنه و باهاش میتونید تغییراتی که روی ریپازیتوریتون ایجاد میشه رو ببینید.
اگه آدمی هستید که خیلی حوصله داکیومنت خوندن ندارید و میخواید ببینید چه دیتاهایی رو اون سرویس براتون ارسال میکنه یه وبسایت ساختن برامون به اسم webhook.site که یه URL میده تا بدیم به سرویس مورد نظرمون و اون اطلاعات رو به این آدرس ارسال بکنه و میتونیم جزئیات ریکوئست ارسال شده رو ببینیم :)
همونطور که توی تصویر بالا مشخصه توی تنظیمات ریپازیتوری های گیتهاب یه قسمت Webhooks وجود داره که میشه آدرسی که مد نظرمون هست برای ارسال تغییرات رو وارد کنیم.
همهی جزئیات تصویر بالا تقریبا از اسمشون مشخصه که کارشون چیه ولی اون پارامتر secret چیه؟
بذارید یه سوال بپرسم تا جواب سوال بالا مشخص بشه! اگه یکی آدرسی که ما به عنوان گیرنده webhook ایجاد کردیم رو پیدا بکنه چه اتفاقی میوفته؟ میتونه هر دیتایی که میخواد برامون بفرسته و باعث اختلال توی روند کارکرد سیستممون بشه. پس باید یه روشی رو بهمون بده اون سرویسی که webhook رو پشتیبانی میکنه تا ما بتونیم با یه درصد قابل قبولی اطمینان پیدا کنیم که سرویس ما فقط از سمت اون سرویس فراخوانی شده.
که اینجا گیتهاب بهمون Secret رو میده که نحوه کارش رو میتونید اینجا بخونید. تلگرام هم توی این داکیومنت توضیح میده که چطوری مطمئن بشیم درخواست از سمت سرورای تلگرام اومده.
حالا اگه یه اکشنی انجام بدم توی اون ریپازیتوری (مثل star کردن) یه ریکوئست برام به اون آدرسی که مشخص کردم ارسال میشه و توی body اون ریکوئست اطلاعات تغییرات موجوده. (مثل تصویر زیر)
مرسی ازتون که زمان گذاشتید و خوندید ?
Webhooks for Beginners - Full Course
محمد محمدعلیان | 23 اردیبهشت 1401