چگونه از طریق ربات از کاربر فایل دریافت کنیم؟

آموزش ساخت ربات تلگرام

چگونه از طریق ربات از کاربر فایل دریافت کنیم؟

خوب نبودخوبخیلی خوبعالیخیلی عالی (3 votes, average: 5٫00 out of 5)

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

برای انجام این کار من فانکشنی را آماده کرده ام:

function getFile($fileIds, $download_path)
{

    switch ($fileIds) {

        case (!empty($fileIds[3]['file_id'])) :

            $dlUrl = API_URL . "/getFile?file_id=" . $fileIds[3]['file_id'];
            $file_id = $fileIds[3]['file_id'];

            break;

        case (!empty($fileIds[2]['file_id'])):

            $dlUrl = API_URL . "/getFile?file_id=" . $fileIds[2]['file_id'];
            $file_id = $fileIds[2]['file_id'];

            break;

        case (!empty($fileIds[1]['file_id'])):

            $dlUrl = API_URL . "/getFile?file_id=" . $fileIds[1]['file_id'];
            $file_id = $fileIds[1]['file_id'];

            break;

        case (!empty($fileIds[0]['file_id'])):

            $dlUrl = API_URL . "/getFile?file_id=" . $fileIds[0]['file_id'];
            $file_id = $fileIds[0]['file_id'];

            break;

        default:

            $dlUrl = API_URL . "/getFile?file_id=" . $fileIds['file_id'];
            $file_id = $fileIds['file_id'];

            break;


    }

    $dlUrl = file_get_contents($dlUrl);
    $dlUrl = json_decode($dlUrl, true);

    if (!$dlUrl['result']) {
        exit;
    }

    $file = 'https://api.telegram.org/file/bot' . BOT_TOKEN . '/' . $dlUrl['result']['file_path'];

    //used file_id for name of the file
    $img = $download_path . '/' . $file_id . '.' . substr($dlUrl['result']['file_path'], strpos($dlUrl['result']['file_path'], ".") + 1);
    file_put_contents($img, file_get_contents($file));

}

اما چگونه از این فانکشن استفاده کنیم؟

getFile($message['message']['photo'], 'download/photo');

این فانکشن ۲ پارامتر دریافت می‌کند، اول آدرس فایل مربوطه ( این آدرس مربوط به تلگرام است)، دوم آدرسی که می‌خواهیم فایل مورد نظر در آنجا ذخیره شود ( آدرس مورد نظر در سرور ما). برای گرفتن آدرس فایل در تلگرام می‌توانیم به این شکل عمل کنیم:

$data['message']['photo']

مقداری که به شما بر می‌گرداند یک آرایه است، در این آرایه یک یا چند آدرس وجود دارد که به حجم‌ها و اندازه‌های متفاوتی از فایل ارسالی اشاره دارد ( بسته به نوع فایل). حال فرض کنید ساختاره پوشه‌های من به شکل زیر است:

می‌خواهم فایل تصویری از کاربر دریافت کنم برای این کار بدین شکل عکل خواهم کرد.

<?php

/**
 * Created by IntelliJ IDEA.
 * User: Pouria
 * Date: 6/28/2017
 * Time: 9:57 PM
 */

error_reporting(E_ALL);
ini_set('display_errors', TRUE);
ini_set('display_startup_errors', TRUE);

define('BOT_TOKEN', 'your token id');
define('API_URL', 'https://api.telegram.org/bot' . BOT_TOKEN);

$update1 = file_get_contents("php://input");
$update = json_decode($update1, TRUE);

$chatId = $update["message"]["chat"]["id"];
$message = $update["message"]["text"];

if (!$update) {
    // receive wrong update, must not happen
    exit;
}

//get file function
function getFile($fileIds, $download_path)
{

    switch ($fileIds) {

        case (!empty($fileIds[3]['file_id'])) :

            $dlUrl = API_URL . "/getFile?file_id=" . $fileIds[3]['file_id'];
            $file_id = $fileIds[3]['file_id'];

            break;

        case (!empty($fileIds[2]['file_id'])):

            $dlUrl = API_URL . "/getFile?file_id=" . $fileIds[2]['file_id'];
            $file_id = $fileIds[2]['file_id'];

            break;

        case (!empty($fileIds[1]['file_id'])):

            $dlUrl = API_URL . "/getFile?file_id=" . $fileIds[1]['file_id'];
            $file_id = $fileIds[1]['file_id'];

            break;

        case (!empty($fileIds[0]['file_id'])):

            $dlUrl = API_URL . "/getFile?file_id=" . $fileIds[0]['file_id'];
            $file_id = $fileIds[0]['file_id'];

            break;

        default:

            $dlUrl = API_URL . "/getFile?file_id=" . $fileIds['file_id'];
            $file_id = $fileIds['file_id'];

            break;


    }

    $dlUrl = file_get_contents($dlUrl);
    $dlUrl = json_decode($dlUrl, true);

    if (!$dlUrl['result']) {
        exit;
    }

    $file = 'https://api.telegram.org/file/bot' . BOT_TOKEN . '/' . $dlUrl['result']['file_path'];

    //used file_id for name of the file
    $img = $download_path . '/' . $file_id . '.' . substr($dlUrl['result']['file_path'], strpos($dlUrl['result']['file_path'], ".") + 1);
    file_put_contents($img, file_get_contents($file));

}

switch ($update) {

    //if user send photo
    case array_key_exists('photo', $update) :
        
        //get the photo array
        $message_photo = $update['message']['photo'];
        
        getFile($message_photo, 'download/photo');
        
        sendMessage($chatId, 'I got a photo ');

        break;

}

همان طور که می‌بینید فایل photo من دارای ۲ تصویر است، حال تصویری را ارسال می‌کنیم:

حال محتوای پوشه photo را مجددا می‌بینیم:

نکته: نام فایل‌های ذخیره شده، آی دی آن‌ها خواهد بود.

نکته: این قسمت از مستندات تلگرام را مطالعه کنید.

پوریا پرهامی

پوریا پرهامی هستم، چند سالی هست که در مجموعه دارکوب وب فعالیت می‌کنم. عمده‌ی فعالیت من در زمینه برنامه نویسی هستش. همچنین به هوش مصنوعی و آموزش زبان‌های برنامه نویسی علاقه دارم.

[yuzo_related]

خبرنامه دارکوب وب

با عضویت در خبرنامه دارکوب وب، هر هفته یک ایمیل از آخرین مقالات و تخفیفات هیجان انگیز ما مطلع شوید.

8 پاسخ
    • پوریا
      پوریا گفته:

      سلام حسن عزیز
      ببخشید ابتدا متوجه نشدم سوال در مورد فانکش دیگری است.
      چه خطایی برای شما نمایش داده می‌شه؟
      فولدرهای مورد نیاز خودتونو ایجاد کردید؟ آدرس فولدرها را به صورت صحیح در فانکشن قرار دادید؟
      از همون لینک گیتهاب قبلی می ‌تونید کدهای نمونه این فانکشن که در فایل theBot.php قرار داره می‌تونید ببنید. آیا مطالعه کردید؟
      توجه کنید که فایل ارسالی توسط کاربر باید دارای حجم خواصی باشید، لینک مربوطه را مطالعه کنید https://core.telegram.org/bots/api#getfile

  1. Hassan
    Hassan گفته:

    سلام آقا پوریا ،آره کامل چک کردم اما هیچ مشکلی پیدا نکردم همه چی اوکیه فقط وقتی فایلی میفرستی برای ربات هیچ عکس العملی نشون نمیده و وقتی فولدر روی هاستم رو چک میکنم خالیه .

    پاسخ
    • پوریا
      پوریا گفته:

      سلام حسن عزیز
      اگر درون هاست تون کنار فایل ربات تون فایل خطایی وجود نداره در صورتی که از
      error_reporting(E_ALL);
      ini_set(‘display_errors’, TRUE);
      ini_set(‘display_startup_errors’, TRUE);
      استفاده کرده باشید، پس خطایی ندارید، مگر خطای در منطقی .
      حجم فایلی که ارسال می‌کنید چند مگ یا کیلوبایت هست؟ ( bots can download files of up to 20MB in size )
      نام متغییرهاتون BOT_TOKEN و API_URL هست ؟ توجه کنید که در انتهای آدرس بوت توکن به این شکل وارد کنید https://api.telegram.org/bot خود فانکش علامت / اگر نیاز باشه میزاه و اگر خودتون بزارید به این شکل می‌فرسته که اشتباه https://api.telegram.org/bot//something
      بدلیل مشکلاتی نمی‌تونم کدتونو بگیرم و در هاست خودمون چک کنم، اگر مایلید دسترسی اف تی پی برای من ایجاد کنید ( با ایمیل شخصی من در ارتبات باشید) تا کد نگاه کنم شاید بتونم کمک تون کنم.
      ما رباتی برای تست این فانکشن ها ایجاد کریدم بنام @testPlaceBot من چک کردم و فانکشن به درستی عمل می‌کرد.
      شاد و سلامت باشید.

  2. Hassan
    Hassan گفته:

    راهنمایی های رو گیت هاب رو هم دیدم متشکرم واسه لینکی که قراردادید ، مشکل اینجاست که هرچی میگردم و چک میکنم باید کار کنه ولی کار نمیکنه.

    پاسخ
  3. Hassan
    Hassan گفته:

    البته من توکن و آدرس ای پی آی رو بصورت متغیر نوشم نه بصورت کد شماکه بصورت ثابت بکار بردید اما موقع استفاده با تابع گلوبال قابل دسترس شدن در فانکشن حالا هرچی چک میکنم کد ایرادی نداره.

    پاسخ

دیدگاه خود را ثبت کنید

تمایل دارید در گفتگوها شرکت کنید؟
در گفتگو ها شرکت کنید.

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

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