# Создание Telegram бота на PHP #4: отправка файлов и изображений в Telegram

В новом уроке мы с вами научимся отправлять файлы и изображения в 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 запроса.

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

<figure><img src="https://habrastorage.org/r/w780q1/getpro/habr/upload_files/5fc/a4a/5ca/5fca4a5caa6030b27300d479b25bc002.jpeg" alt="" height="485" width="594"><figcaption></figcaption></figure>

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

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

<figure><img src="https://habrastorage.org/r/w780q1/getpro/habr/upload_files/db7/8f0/2ff/db78f02ff6bbd77db8604e72cfb1ffcb.jpeg" alt="" height="468" width="627"><figcaption></figcaption></figure>

**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);
```

<figure><img src="https://habrastorage.org/r/w1560/getpro/habr/upload_files/643/356/8c6/6433568c687a003fe26a793a29c6f8b4.png" alt="" height="126" width="525"><figcaption></figcaption></figure>

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

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

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

```
{
  "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()**, который просто принимает путь до изображения.

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

<figure><img src="https://habrastorage.org/r/w780q1/getpro/habr/upload_files/f05/2e6/00c/f052e600ccc8cba2ccc9163fd34a206b.jpeg" alt="" height="453" width="576"><figcaption></figcaption></figure>

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

* работать с функцией **curl\_file\_create()** и классом **CURLFile()**
* отправлять документы в Telegram чат
* отправлять сжатые изображения в Telegram
* отправлять сгруппированные изображения в одном сообщение

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

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