به یازدهمین جلسه از آموزش ساخت ربات تلگرام خوش آمدید. در این جلسه به آموزش نحوه آپلود فایل در ربات تلگرام خواهیم پرداخت.
در جلسات گذشته نحوه ارسال انواع داده ها و فایل ها از سوی ربات تلگرام برای کاربر را با هم دیدیم. شاید برایتان این سوال پیش آمده باشد که اگر کاربر بخواهد فایلی را برای ربات ارسال کند، نحوه انجام این کار به چه صورت است؟ با ما همراه باشید تا نحوه آپلود فایل در ربات تلگرام را شرح دهیم…
در این جلسه به مباحث زیر خواهیم پرداخت:
- نحوه آپلود تصویر در ربات تلگرام
- نحوه آپلود فایل pdf در ربات تلگرام
لازم به ذکر است که انواع دیگر فایل ها بصورت مشابه قابل ارسال برای ربات هستند.
آپلود تصویر در ربات تلگرام
برای آپلود تصویر در ربات تلگرام ابتدا باید متوجه شویم که اطلاعات ارسالی برای ربات یک عکس (تصویر) بوده است. برای این کار می بایست کدهای بخش ابتدایی برنامه خود را به صورت زیر تغییر دهیم.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
<?php $bot_url = "https://api.telegram.org/bot[bot-token]"; $bot_dl_url = "https://api.telegram.org/file/bot[bot_token]"; $update = file_get_contents("php://input"); $update_array = json_decode($update, true); if( isset($update_array["message"]) ) { $text = $update_array["message"]["text"]; $chat_id = $update_array["message"]["chat"]["id"]; if( isset($update_array["message"]["photo"]) ) save_image(); if( isset($update_array["message"]["document"]) ) save_pdf(); } ?> |
در کد فوق، دو تابع ()save_image و ()save_pdf را فراخوانی کرده ایم. کدهای مربوط به آپلود تصویر و آپلود فایل pdf را در این دو تابع خواهیم نوشت.
تابع ()save_image جهت آپلود تصویر در ربات تلگرام
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 |
<?php function save_image() { $update_array = $GLOBALS['update_array']; $diff_size_count = sizeof($update_array["message"]["photo"]); for($i = $diff_size_count - 1 ; $i >= 0 ; $i--) { $file_size = $update_array["message"]["photo"][$i]["file_size"]; if($file_size < 1000000) { // 1 MB $file_id = $update_array["message"]["photo"][$i]["file_id"]; break; } } $url = $GLOBALS['bot_url'] . "/getFile"; $post_params = [ 'file_id' => $file_id ]; $result = send_reply($url, $post_params); $result_array = json_decode($result, true); $file_path = $result_array["result"]["file_path"]; $url = $GLOBALS['bot_dl_url'] . "/$file_path"; $file_data = file_get_contents($url); $img_path = "new_image.jpg"; $my_file = fopen($img_path, 'w'); fwrite($my_file, $file_data); fclose($my_file); $reply = "تصویر با موفقیت آپلود شد"; $url = $GLOBALS['bot_url'] . "/sendMessage"; $post_params = [ 'chat_id' => $GLOBALS['chat_id'] , 'text' => $reply ]; send_reply($url, $post_params); } ?> |
هر بار که تصویری برای ربات تلگرام ارسال می شود، این تصویر بر روی سرور تلگرام در چند سایز و ابعاد مختلف ذخیره می شود. ما ابتدا می بایست از بین این نسخه های مختلف تصویر، یکی را انتخاب کرده و سپس آن را از سرور تلگرام دانلود و روی سرور خودمان (هاست شخصی) ذخیره کنیم.
در خط ۷ تعداد نسخه های مختلف موجود از تصویر مورد نظر را محاسبه کرده ایم. در خطوط ۹ تا ۱۸ نیز توسط یک حلقه for از بین این تصاویر، یکی را که حجم کمتر از یک مگابایت دارد، انتخاب می کنیم. تنها چیزی که برای دانلود یک فایل از روی سرور تلگرام نیاز داریم، شناسه فایل (file_id) است.
در خطوط ۲۰ تا ۲۲ با استفاده از متد getFile اطلاعات فایل (تصویر) مورد نظر را از سرور تلگرام دریافت می کنیم. سپس با استفاده از خطوط ۲۴ و ۲۵ پاسخ دریافتی از سرور تلگرام را به آرایه تبدیل کرده و مسیر فایل مورد نظر را از آن استخراج می کنیم (file_path). در خطوط ۲۷ و ۲۸ نیز با استفاده از تابع ()file_get_contents تصویر مورد نظر را از سرور تلگرام دریافت و درون متغیر file_data ذخیره می کنیم.
در خطوط ۳۰ تا ۳۳ فایل دریافتی از سرور تلگرام را با نام و پسوند دلخواه بر روی سرور خودمان ذخیره می کنیم. و در نهایت پس از ذخیره (آپلود) موفقیت آمیز تصویر، پیامی را برای کاربر ارسال می کنیم (خطوط ۳۵ تا ۳۸). جهت توضیحات بیشتر به ویدئوی ضمیمه آموزش مراجعه نمایید.
خروجی کدهای فوق به این صورت است:
آپلود تصویر در ربات تلگرام – ۱
آپلود تصویر در ربات تلگرام – ۲
آپلود فایل pdf در ربات تلگرام
کدهای موردنیاز جهت آپلود فایل pdf در ربات تلگرام تا حد زیادی مشابه آپلود تصویر است. به قطعه کد زیر که پیاده سازی تابع ()save_pdf است، توجه کنید…
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 |
<?php function save_pdf() { $update_array = $GLOBALS['update_array']; $file_id = $update_array["message"]["document"]["file_id"]; $file_type = $update_array["message"]["document"]["mime_type"]; if($file_type == "application/pdf") { $url = $GLOBALS['bot_url'] . "/getFile"; $post_params = [ 'file_id' => $file_id ]; $result = send_reply($url, $post_params); $result_array = json_decode($result, true); $file_path = $result_array["result"]["file_path"]; $url = $GLOBALS['bot_dl_url'] . "/$file_path"; $file_data = file_get_contents($url); $file_path = "new_file.pdf"; $my_file = fopen($file_path, 'w'); fwrite($my_file, $file_data); fclose($my_file); $reply = "فایل پی دی اف با موفقیت آپلود شد"; $url = $GLOBALS['bot_url'] . "/sendMessage"; $post_params = [ 'chat_id' => $GLOBALS['chat_id'] , 'text' => $reply ]; send_reply($url, $post_params); } else { $reply = "خطا! لطفا یک فایل پی دی اف ارسال کنید"; $url = $GLOBALS['bot_url'] . "/sendMessage"; $post_params = [ 'chat_id' => $GLOBALS['chat_id'] , 'text' => $reply ]; send_reply($url, $post_params); } } ?> |
برای آپلود فایل pdf در ربات تلگرام دیگر نیازی به حلقه for ذکر شده در بحث آپلود تصویر نداریم. در عوض نیاز داریم تا شناسه فایل ارسالی و جنس آن را بدانیم.
در خطوط ۷ و ۸ شناسه فایل pdf ارسالی (file_id) و همچنین جنس فایل (file_type) را استخراج کرده ایم. در خط ۱۰ ابتدا مطمئن شده ایم که جنس فایل ارسالی برای ربات pdf بوده و کدهای مورد نیاز را درون if موردنظر نوشته ایم. در بخش else نیز پیغام خطایی را برای کاربر ارسال کرده ایم (زمانیکه فایل ارسالی برای ربات چیزی غیر از pdf باشد).
خروجی کدهای فوق به این صورت است:
آپلود فایل pdf در ربات تلگرام – ۱
آپلود فایل pdf در ربات تلگرام – ۲
آپلود فایل pdf در ربات تلگرام – ارسال فایل اشتباه
این جلسه آموزشی نیز به پایان رسید. دیدیم که چگونه می توانیم آپلود فایل در ربات تلگرام را انجام دهیم. در آینده با بخش های دیگری از ربات تلگرام آشنا خواهیم شد. با ما همراه باشید…
19 دیدگاه. ارسال دیدگاه جدید
سلام
من میخوام تو رباتم یک سری از پیام های کاربر برام ارسال بشه
مثل جلسه اول که گفتید نتایج نظرسنجی با یک ربات دیگه به مدیر ارسال میشه
چجوری میشه این کار رو کرد؟
دوست عزیز به جلسات ۷ و ۱۶ مراجعه کنید (البته برای ذخیره پیامها در دیتابیس به جلسات ۱۲ و ۱۳ هم نیاز دارید).
سلام
اولا تشکر می کنم بابت آموزش بسیار عالی تون
بعد هم عذرخواهی می کنم بابت وقتی که ازتون میگیرم
سناریویی که توی ذهنمه اینه که یه ربات فروش محصولات طراحی کنم
شخص کاربر محصولات رو انتخاب کنه و بازخورد انتخابش به همراه آدرس و عکس فیش واریزی برای مدیر ربات ارسال بشه
فقط بحثی که هست امکانش هست این اطلاعات به صورت تفکیک شده برای ادمین ارسال بشه
مثلا بشه تشخیص داد فلان اطلاعات برای این شناسه کاربری
ممنون
بله دوست عزیز اینکار شدنی هست
اطلاعات رو بر اساس چت آیدی (اکانت تلگرام )کاربر میشه تفکیک کرد و تشخیص داد.
سلام وقتتون بخیر
قبل از هر چیزی از آموزشهای عالی تون تشکر می کنم
استاد من میخوام رباتی بنویسم که هر فایلی براش ارسال میشه یا فوروارد میشه اون رو توی هاست یا سرور خودمون آپلود کنه و بعدش لینک مستقیم بده، منتها به کاربر هم بگه مثلا بعد از ۲۴ ساعت فایل پاک میشه، دقیقا یه رباتی مثله GetPublicLinkBot@ چطوری باید اینکار رو بکنیم؟
دوست عزیز پیاده سازی این سناریو کمی مفصله و راهنمایی زیادی در قالب پیام ممکن نیست.
ولی بطور کلی شما باید طبق آموزشهای همین جلسه و همینطور آموزشهای مربوط به دیتابیس، فایل دریافتی از کاربر رو روی هاست خودتون و البته مشخصاتش رو در دیتابیس ذخیره کنید، تا بعدا قابل پیگیری باشه. برای نامگذاری فایلهای ذخیره شده و تولید لینکها هم باید مکانیزمی رو شخصا خودتون در نظر بگیرین که نام فایلها و لینکها با هم تداخل نداشته باشن.
برای حذف کردن فایلها هم باید بصورت دوره ای دیتابیس چک بشه و فایلهایی که بیش از ۲۴ ساعت از زمان آپلودشون گذشته حذف بشن.
امیدوارم توضیحات بالا بهتون کمک کنه.
اگر هم مایل بودین شاید در قالب چند جلسه آموزش خصوصی از راه دور بتونم بهتون کمک کنم تا این سناریو رو پیاده سازی کنید.
استاد سلام و خسته نباشید
سوالی که خدمتتون دارم اینه که شما نام عکس یا نام فایل رو به چیزی که خودتون میخواین تغییر دادین. حالا سوال اینجاست که من اگه چندین عکس رو بخوام از کاربر که آپلود کنه آیا به خاطر این که در هاست اسم یکسانی رو پیدا میکنه overwrite نمیشن روی هم دیگه؟
اصلا چجوری میشه نام همون فایل که کاربر به ما میده باشه؟
در آخر جا داره خسته نباشید بهتون بگم بابت این آموزش کامل و مفید
در مورد دریافت و ذخیره تصاویر متعدد بله حق با شماست.
باید یک مکانیزم مشخص برای نامگذاری تصاویر دریافتی داشته باشید (ذخیره تصاویر با نامهای مختلف – مثلا شماره گذاری اونها)
به این صورت دیگه تصاویر رونویسی و جایگزین همدیگه نمیشن.
ضمنا تا جاییکه بنده اطلاع دارم، در زمان آپلود فایل، تلگرام سیستم نامگذاری خاص خودش رو برای فایلها داره و اطلاعاتی رو راجب نام اصلی فایل ذخیره نمیکنه (جهت جلوگیری از وجود نام فایل تکراری)
سلام، خسته نباشید.
من یک ربات دارم که فایل رو از کاربر دریافت و ذخیره میکنه روی هاست و به یک سرور دیگه منتقل میکنه.
در قسمت ذخیره تصویر یا فایل و … میخوام اسم فایل رو تغییر نده (img_path$) و هر اسمی که داره با همون اسم تو هاست ذخیره بشه و بعد از انتقال به سرور مقصد اون فایل رو به صورت خودکار از هاست پاک کنه.
چیکار باید بکنم برای این کار؟
اگر ممکنه راهنمایی بفرمایید. همه جا رو گشتم ولی جوابمو پیدا نکردم.
دوست عزیز تا جاییکه بنده اطلاع دارم، در زمان آپلود فایل، تلگرام سیستم نامگذاری خاص خودش رو برای فایلها داره و اطلاعاتی رو راجب نام اصلی فایل ذخیره نمیکنه (جهت جلوگیری از وجود نام فایل تکراری)
برای اطمینان میتونید جیسون دریافتی از سمت تلگرام در زمان دریافت اطلاعات فایل رو ببینید (در زمان استفاده از متد getFile)
سلام خسته نباشید
اگر بخوایم قابلیت اینکه کاربر هر تعداد عکس رو همزمان آپلود کنه قابلیت ذخیره وجود داشته به چه شکل باید پیاده سازی بشه؟
همچنین توی این کد هر عکسی که ارسال میشه جایگزین عکس قبلی میشه که این هم باید تغییر کنه
دوست عزیز این مورد رو شخصا تست نکردم.
شما باید در زمان ارسال همزمان عکسها به سرور، جیسون ورودی به ربات رو چک کنید و بر اساس محتویات اون عمل کنید.
باید ببینید عکسهای ارسال شده همزمان، آیا بصورت همزمان به دست ربات میرسه و یا بصورت تک به تک.
در مورد دریافت و ذخیره تصاویر متعدد هم بله حق با شماست. باید یک مکانیزم مشخص برای نامگذاری تصاویر دریافتی داشته باشید (ذخیره تصاویر با نامهای مختلف)
به این صورت دیگه تصاویر رونویسی و جایگزین همدیگه نمیشن.
سلام، ممنون بابت آمورشها
چندتا سوال:
من داکیومنت، تصویر و وویس رو فرستادم و توی هاست ذخیره شد.
۱- مشکل من توی وویس هستش، وویس ذخیره میشه ولی پخش نمیشه.
۲- چجوری میشه دیتا یا مسیج گرفته شده رو به یه شخص یا کانال فروارد کرد؟
دوست عزیز منظورتون از اینکه میگین وویس ذخیره میشه ولی پخش نمیشه چیه؟
اگر منظورتون ارسال وویس برای کاربر هست، باید از متد sendVoice استفاده کنید (نه sendAudio). نوع فایل ارسالی هم باید ogg. باشه
در مورد ارسال پیام از ربات به کانال هم باید از همون متد sendMessage معروف استفاده کنید.
انشاا.. در آینده آموزشهایی در این زمینه خواهیم داشت.
ممنون بابت راهنمایی
به طریقی حلش کردم
الان ربات من وویس رو از کاربر میگیره و با فرمت mp3 ذخیره میکنه و در مرحله بعد اون رو به ادمین میفرسته 🙂
(همچنین برای داکیومنت و عکس)
ممنون از شما
سلام و خسته نباشید و تشکر بابت آموزش های خوبتون
من میخواستم وقتی فایل عکس آپلود میشه به آیدی خاصی در تلگرام فرستاده بشه.
به صورت عامیانه بخوام بگم من یک ربات درست کردم با کمک آموزش های شما برای تبلیغات کانالم و میخوام در صورت واریز فیش، عکسش رو برام تو ربات بفرستن و ربات به آیدی شخصی خودم بفرستتش.
سپاس بابت آموزش ها و جوابتون
دوست عزیز برای انجام این کار کافیه تا در تابع ()save_image، در انتهای کد و پس از ذخیره فایل تصویر بر روی هاست، توسط متد sendPhoto که در جلسه چهارم آموزش داده شده، تصویر رو برای آیدی موردنظر (خودتون) ارسال کنید.
سلام خسته نباشید و تشکر از سایت خوبتون
یه سوالی داشتم ازتون، میخواستم ببینم که مثلا اگر ما بخوایم یه ربات بسازیم و مثلا شرط کنیم که اگر کاربری که به ربات وارد میشه، حتما باید عضو مثلا فلان کانال بشه بعد میتونه که مثلا از این ربات استفاده کنه و وقتی که وارد شد ربات متوجه بشه که عضو فلان کانال شده، بعد اجازه استفاده از ربات بهش داده بشه، باید از چه کدی استفاده کنیم؟
خیلی این قضیه مهمه برام، اگر که امکانش هست براتون جواب بدید، تشکر
دوست عزیز از طریق ایمیل با بنده مکاتبه کنید تا راهنماییتون کنم.