В новом уроке мы с вами научимся отправлять файлы и изображения в Telegram сообщениях. Мы с вами изучим 2 новых метода: sendPhoto() и sendDocument().

Для отправки файлов в Телеграм, нам необходимо воспользоваться функцией curl_file_create(), которая формирует специальный объект файла, для того чтобы его можно было передавать через HTTP запросы.

Полный список всех записей курса находится на сайте https://prog-time.ru/course_cat/telegram-bot-basic/ или в публикациях на Хабр https://habr.com/ru/users/Prog-Time/posts/

Отправка изображений в Telegram чат

Пример отправки изображения выглядит так:

/*токен который выдаётся при регистрации бота */
$token = "5340791844:AAEXXDdu324vInvQrlWHyk8V91USOQSevrPVU";

$arrayQuery = array(
    'chat_id' => 1424646511,
    'caption' => 'Проверка работы',
    'photo' => curl_file_create(__DIR__ . '/cat.jpg', 'image/jpg' , 'cat.jpg')
);		
$ch = curl_init('https://api.telegram.org/bot'. $token .'/sendPhoto');
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $arrayQuery);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HEADER, false);
$res = curl_exec($ch);
curl_close($ch);

Здесь мы как и в прошлый раз собираем в массив $arrayQuery параметры для отправки запросов. Для отправки изображения, нам необходимо передать id чата, текст сообщения (для изображений он передается в параметре caption), и новый параметр photo в который мы передаём сформированный, с помощью функции curl_file_create(), объект изображения.

Ниже мы указываем что все данные должны передаваться методом POST и не забываем передавать токен в URL запроса.

Таким образом мы отправляем сжатое изображение в чат с указанной подписью.

Давайте рассмотрим дополнительные параметры, которые предлагает нам документация Telegram.

protect_content — данный параметр запрещает сохранение и пересылку изображения.

reply_markup — позволяет добавить кнопки под изображение

Отправка файлов в Telegram чат

Отправка документов производится аналогичным образом, меняется только метод отправки и параметр photo заменяется на document.

/*токен который выдаётся при регистрации бота */
$token = "5340791844:AAEXXDdu324vInvQrlWHyk8V91USOQSevrPVU";

$arrayQuery = array(
    'chat_id' => 1424646511,
    'caption' => 'Проверка работы',
    'document' => curl_file_create(__DIR__ . '/cat.jpg', 'image/jpg' , 'cat.jpg')
);		
$ch = curl_init('https://api.telegram.org/bot'. $token .'/sendDocument');
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $arrayQuery);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HEADER, false);
$res = curl_exec($ch);
curl_close($ch);

Разбор ответа при отправке файла

Давайте теперь разберём ответ получаемый от сервера при отправке файла в чат.

В данном примере я получаю следующий ответ:

{
  "ok": true,
  "result": {
    "message_id": 20,
    "from": {
      "id": 5340791844,
      "is_bot": true,
      "first_name": "test_prog_time",
      "username": "test_prog_time_bot"
    },
    "chat": {
      "id": 1424646511,
      "first_name": "Илья",
      "last_name": "Лящук",
      "username": "iliyalyachuk",
      "type": "private"
    },
    "date": 1658991191,
    "document": {
      "file_name": "cat.jpg",
      "mime_type": "image/jpeg",
      "thumb": {
        "file_id": "AAMCAgADGQMAAxRi4jJXqhVVPzULdQ1xw_LeYcZGRwACGhkAAmCwEEuw8OvQNNsHDQEAB20AAykE",
        "file_unique_id": "AQADGhkAAmCwEEty",
        "file_size": 24268,
        "width": 320,
        "height": 320
      },
      "file_id": "BQACAgIAAxkDAAMUYuIyV6oVVT81C3UNccPy3mHGRkcAAhoZAAJgsBBLsPDr0DTbBw0pBA",
      "file_unique_id": "AgADGhkAAmCwEEs",
      "file_size": 132208
    },
    "caption": "Проверка работы"
  }
}

В ответе мы видим много знакомых параметров, которые мы с вами разбирали в уроке по отправке текстовых сообщений. Это информация о чате, о получателе, о дате отправки и текст сообщения.

Новым параметром для нас, в данном случае является — document, в котором указываются данные об отправленном файле.

Для того чтобы не дублировать отправку файлов с сервера, вы можете обратиться к ранее отправленному файлу указав его идентификатор.

ID отправленного файла хранится в массиве ответа, в параметре document -> file_id.

Выглядит это следующим образом

$arrayQuery = array(
    'chat_id' => 1424646511,
    'caption' => 'Проверка работы',
    'document' => "BQACAgIAAxkDAAMUYuIyV6oVVT81C3UNccPy3mHGRkcAAhoZAAJgsBBLsPDr0DTbBw0pBA",
);		
$ch = curl_init('https://api.telegram.org/bot'. $token .'/sendDocument');
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $arrayQuery);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HEADER, false);
$res = curl_exec($ch);
curl_close($ch);

Групповая отправка изображений и файлов

Для групповой отправки изображений в чат, нам необходимо воспользоваться методом sendMediaGroup() и немного переделать наш массив с параметрами запроса.

Вот так будет выглядеть наш следующий пример.

/*токен который выдаётся при регистрации бота */
$token = "5340791844:AAEXXDduvInvQrlWHRXykV91USOQSevrPVU";

$arrayQuery = [
    'chat_id' => 1424646511,
    'media' => json_encode([
	    ['type' => 'photo', 'media' => 'attach://cat.jpg' ],
	    ['type' => 'photo', 'media' => 'attach://cat_2.jpg' ],
	    ['type' => 'photo', 'media' => 'attach://cat_3.jpg' ],
    ]),
    'cat.jpg' => new CURLFile(__DIR__ . '/cat.jpg'),
    'cat_2.jpg' => new CURLFile(__DIR__ . '/cat_2.jpg'),
    'cat_3.jpg' => new CURLFile(__DIR__ . '/cat_3.jpg'),
];


$ch = curl_init('https://api.telegram.org/bot'. $token .'/sendMediaGroup');
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $arrayQuery);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HEADER, false);
$res = curl_exec($ch);
curl_close($ch);

echo $res;

Для передачи группы файлов, нам необходимо передать в качестве параметра media массив с параметрами изображений которые необходимо сгруппировать.

Каждый массив вложенный в параметр media имеет следующие параметры:

  • type — тип файла который необходимо передать (в нашем случае это photo)

  • media — строка указывающая вложенный файл. Добавление подстроки attach:// является обязательным правилом.

Далее указываем файлы которые необходимо передать. Название параметра приравнивается к названию передаваемого файла.

Для формирования объекта изображений мы будем использовать аналог функции curl_file_create() — класс CURLFile(), который просто принимает путь до изображения.

После отправки запроса, мы получаем следующий результат.

Подведём итоги. В новом уроке мы с вами научились:

  • работать с функцией curl_file_create() и классом CURLFile()

  • отправлять документы в Telegram чат

  • отправлять сжатые изображения в Telegram

  • отправлять сгруппированные изображения в одном сообщение

В следующих уроках я научу вас обрабатывать хуки и принимать информацию, о действиях пользователей, на наш сервер.

Оригинал на сайте Prog-Time - https://prog-time.ru/course/bot-v-telegram-4/

Комментарии (2)


  1. olku
    04.11.2022 12:15
    +1

    curl_close не нужен - PHP 7 осталось жить 2 месяца. CURLOPT_SSL_VERIFYPEER, false все же сомнительная практика для обучающей статьи. Стиль кода (массивы) тоже можно единообразить.


    1. shornikov
      05.11.2022 16:59
      +1

      CURLOPT_SSL_VERIFYPEER = off, как по мне, помогает гораздо реже слышать что-то типа "ой у нас прайсы перестали обновляться"