# Создание 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/>


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://book.konstantinsecurity.com/readme/architect/bots/telegram/sozdanie-telegram-bota-na-php-4-otpravka-failov-i-izobrazhenii-v-telegram.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
