← Вернуться к списку тем

Отправить несколько картинок

Ребята! Только-только начинаю изучать telegram Ботов. Пожалуйста, подскажите, как организовать следующее. Есть папка /img в ней, несколько изображений. Например 1.jpg 2.jpg 3.jpg ....25.jpg.
Необходимо, дабы, по команде /портфолио - бот отправлял бы несколько 2-3 рандомных изображения из указанной папки.

Заранее, спасибо!

Ответы


  • iMakeBots [26.04.2020 в 22:10 → Alex Crowley]
    Используйте функцию scandir - получите массив - из него функцией array_rand($array, 3) получите 3 рандомных значения и отправьте медиаГруппу в бот пользователю с этими 3-мя картинками
  • Alex Crowley [26.04.2020 в 22:14 → iMakeBots]
    Спасибо, конечно! Но пока - это мне мало о чем говорит. Вот если бы, кусочек, нужного кода - был бы вам очень признателен.
  • iMakeBots [27.04.2020 в 12:36 → Alex Crowley]
    $token = "";
    // путь до директории с картинками относительно этого файла
    $dir = "./img";
    // путь до директории с картинками относительно корня сайта
    // https://ДОМЕН_САЙТА/$path
    $path = "/img/";
    // парсим то что прислал телеграм
    $data = json_decode(file_get_contents('php://input'));
    // проверяем что это тип данных - message
    if ($data->message) {
        // если это старт бота
        if ($data->message->text == "/start") {
            // выводим предложение за=кинуть команду /photos
            query("sendMessage", $token, ['chat_id' => $data->message->chat->id, 'text' => "Hello, send me /photos"]);
        }
        // если это команда /photos
        elseif ($data->message->text == "/photos") {
            // сканируем директорию с картинками - удаляем служебные пути ./ и ../
            $files = array_slice(scandir($dir), 2);
            // если в директории есть файлы
            if (count($files)) {
                // перебираем их
                foreach ($files as $key => $file) {
                    // если файл не картинка - удаляем из массива файлов
                    if (is_not_image(__DIR__ . "/" . $dir . "/" . $file)) {
                        unset($files[$key]);
                    }
                }
                // если файлы остались то значит они картинки
                if (count($files)) {
                    // берем в случайном порядке или 2 или 3 шт
                    $rand_img = array_rand($files, rand(2, 3));
                    // готовим контейнер для данных
                    $arrayMedia = [];
                    // перебираем рандомный выбор
                    foreach ($rand_img as $key) {
                        // добавляем в контейнер данные
                        $arrayMedia[] = ['type' => 'photo', 'media' => "https://" . $_SERVER['SERVER_NAME'] . $path . $files[$key]];
                    }
                    // отправляем дейсвтие - картинки загружаются
                    query("sendChatAction", $token, ['chat_id' => $data->message->chat->id, 'action' => 'upload_photo']);
                    // отправляем картинки
                    query("sendMediaGroup", $token, ['chat_id' => $data->message->chat->id, 'media' => json_encode($arrayMedia)]);
                } else {
                    // нет фоток в файлах
                }
            } else {
                // нет файлов в директории
            }
        } else {
            // лишние команды
        }
    } else {
        // не message
    }
    
    // проверка на не картинку
    function is_not_image($file)
    {
        $fi = finfo_open(FILEINFO_MIME_TYPE);
        $mime = (string)finfo_file($fi, $file);
        return strpos($mime, 'image') === false;
    }
    
    // отправляем данные
    function query($method, $token, $fields = array())
    {
        $ch = curl_init('https://api.telegram.org/bot' . $token . '/' . $method);
        curl_setopt_array($ch, array(
            CURLOPT_POST => count($fields),
            CURLOPT_POSTFIELDS => http_build_query($fields),
            CURLOPT_SSL_VERIFYPEER => 0,
            CURLOPT_RETURNTRANSFER => 1,
            CURLOPT_TIMEOUT => 10
        ));
        $r = json_decode(curl_exec($ch));
        curl_close($ch);
        return $r;
    }
  • amun ra [02.05.2021 в 22:01 → iMakeBots]
    Подскажите в чём у меня косяк?
    Вместо картинок хочу отправлять файлы.


    
     $type,
            'media' => "attach://" . $file,
        ];
    
        $postContent[] = [
            $file => new CURLFile("https://" . $_SERVER['SERVER_NAME'] . $path . $file)
        ];
    }
    
    $postContent[] = [
        'chat_id' => $chat_id,
        'media'   => json_encode($media),
    ];
    
    echo (json_encode($postContent));
    
    post($url, $postContent);
    function post($url, $postContent)
    {
        $curl = curl_init();
        curl_setopt($curl, CURLOPT_URL, $url);
        curl_setopt($curl, CURLOPT_POSTFIELDS, $postContent);
        curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($curl, CURLOPT_HTTPHEADER, ['Content-Type: multipart/form-data']);
        $result = curl_exec($curl);
        curl_close($curl);
        return $result;
        // Echo(json_encode($result));
    }
    
    .
  • iMakeBots [17.05.2021 в 14:33 → amun ra]
    Каким методом отсылаете? SendDocument?
  • amun ra [31.05.2021 в 16:39 → iMakeBots]
    sendMediaGroup
    Уже разобрался. Спасибо.