бот картинки телеграм

Створення Telegram бота на PHP: Відправлення та отримання картинок. Урок 3

Коли користувач надсилає картинки боту, то на PHP скрипт приходить масив прев'ю цих картинок. Останнім елементом масиву є оригінальне зображення.

Максимальний допустимий розмір файлу зображення – 20 МБ.

Отримання та збереження графічних файлів

Якщо ми надішлемо боту картинку (у месенджері), то отримаємо від Telegram наступний запит:

Нагадаю, що цей запит ми можемо побачити в файлі message.txt після відправки фото.

Тут нас цікавить file_id в якому вказано ID зображення.

Тепер ми можемо дізнатись шлях до файлу зображення і скачати його. Для цього можна ввести в адресному рядку браузера посилання з наступною конструкцією:

https://api.telegram.org/bot<token>/getFile?file_id=<the_file_id>

де, 

  • <token> – токен бота.
  • <the_file_id> – ID файлу який потрібно завантажити.

Наприклад, щоб скачати картинку, яку я раніше відправив боту в месенджері, потрібно в адресному рядку браузера вписати наступне:

https://api.telegram.org/bot5741786015:AAGTuEwCBGHmcJP9kO-OzV_xKIduBkbAK6Y/getFile?file_id= AgACAgIAAxkBAAPAY5iRncFiTaQqFAGQRMV27WCzqbQAAq_FMRvPkMlI5UK0Qv021REBAAMCAAN5AAMsBA

У відповіді ви отримаєте:

Тут, в file_path вказана адреса картинки.

Щоб скачати цю картинку ми можемо сформувати наступне посилання:

https://api.telegram.org/file/bot<token><file_path>

де,

  • <token> – токен бота.
  • <file_path> – шлях до файлу зображення, який ми отримали в результаті попереднього запиту (https://api.telegram.org/bot<token>/getFile?file_id=<the_file_id>)

Приклад посилання, перейшовши по якому ми завантажуємо картинку, яка була відправлена боту в месенджері:

https://api.telegram.org/file/bot5741786015:AAGTuEwCBGHmcJP9kO-OzV_xKIduBkbAK6Y/photos/file_0.jpg

Отримання та збереження картинки на сервері

Отримання картинки за допомогою PHP та її збереження на сервері можна реалізувати таким чином:

<?php
    // Приймаємо запит
    $data = file_get_contents('php://input');
    $data = json_decode($data, true);
    file_put_contents(__DIR__ . '/message.txt', print_r($data, true)); //зберігаємо вхідні дані у файл
    
    // Константа токен
    define('TOKEN', '5741786015:AAGTuEwCBGHmcJP9kO-OzV_xKIduBkbAK6Y');
    
    // Функція виклику методів API
    function sendTelegram($method, $response) {
        $ch = curl_init('https://api.telegram.org/bot' . TOKEN . '/' . $method);  
        curl_setopt($ch, CURLOPT_POST, 1);  
        curl_setopt($ch, CURLOPT_POSTFIELDS, $response);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($ch, CURLOPT_HEADER, false);
        $res = curl_exec($ch);
        curl_close($ch);
     
        return $res;
}
        
    //відповідь на збереження картинки
    if (!empty($data['message']['photo'])) {
        $photo = array_pop($data['message']['photo']);
        $res = sendTelegram(
            'getFile', 
            array(
                'file_id' => $photo['file_id']
            )
        );
        
        $res = json_decode($res, true);
        if ($res['ok']) {
            $src = 'https://api.telegram.org/file/bot' . TOKEN . '/' . $res['result']['file_path'];
            $dest = __DIR__ . '/' . time() . '-' . basename($src);
     
            if (copy($src, $dest)) {
                sendTelegram(
                    'sendMessage', 
                    array(
                        'chat_id' => $data['message']['chat']['id'],
                        'text' => 'Картинка збережена на сервері'
                    )
                );
                
            }
        }
        
        exit();    
    }
?>

Відправлення картинок Telegram боту

Для надсилання файлів зображень Telegram боту використовують метод sendPhoto.

<?php
// Приймаємо запит
$data = file_get_contents('php://input');
$data = json_decode($data, true);
file_put_contents(__DIR__ . '/message.txt', print_r($data, true)); //зберігаємо вхідні дані у файл
    
// Константа токен
define('TOKEN', '5741786015:AAGTuEwCBGHmcJP9kO-OzV_xKIduBkbAK6Y');
    
// Функція виклику методів API
function sendTelegram($method, $response) {
    $ch = curl_init('https://api.telegram.org/bot' . TOKEN . '/' . $method);  
    curl_setopt($ch, CURLOPT_POST, 1);  
    curl_setopt($ch, CURLOPT_POSTFIELDS, $response);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_HEADER, false);
    $res = curl_exec($ch);
    curl_close($ch);
    
    return $res;
}
 
// Відповідь на текстове повідомлення
// Отримуємо текст, який відправив користувач Телеграм боту в месенджері
if (!empty($data['message']['text'])) {
    $text = $data['message']['text'];
 
    // Відправили фото в Telegram бот, якщо користувач ввів команду /sendimg
    if (mb_stripos($text, '/sendimg') !== false) {
        sendTelegram(
            'sendPhoto', 
            array(
                'chat_id' => $data['message']['chat']['id'],
                'photo' => curl_file_create(__DIR__ . '/foto-ua.jpg')
            )
        );
        
        exit();    
    }
}
?>

В даному прикладі, якщо користувач відправить нашому Телеграм боту команду /sendimg, то у відповіді, він отримає картинку foto-ua.jpg, яка знаходиться на сервері в папці з нашим скриптом.

Код PHP з прикладом отримання та надсилання фото

<?php
// Приймаємо запит
$data = file_get_contents('php://input');
$data = json_decode($data, true);
file_put_contents(__DIR__ . '/message.txt', print_r($data, true)); //зберігаємо вхідні дані у файл
    
// Константа токен
define('TOKEN', '5741786015:AAGTuEwCBGHmcJP9kO-OzV_xKIduBkbAK6Y');
    
// Функція виклику методів API
function sendTelegram($method, $response) {
    $ch = curl_init('https://api.telegram.org/bot' . TOKEN . '/' . $method);  
    curl_setopt($ch, CURLOPT_POST, 1);  
    curl_setopt($ch, CURLOPT_POSTFIELDS, $response);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_HEADER, false);
    $res = curl_exec($ch);
    curl_close($ch);
    
    return $res;
}
 
// Відповідь якщо користувач прислав фото в месенджері, а ми його зберегли на сервері
if (!empty($data['message']['photo'])) {
    $photo = array_pop($data['message']['photo']);
    $res = sendTelegram(
        'getFile', 
        array(
            'file_id' => $photo['file_id']
        )
    );
    
    $res = json_decode($res, true);
    if ($res['ok']) {
        $src = 'https://api.telegram.org/file/bot' . TOKEN . '/' . $res['result']['file_path'];
        $dest = __DIR__ . '/' . time() . '-' . basename($src);
 
        if (copy($src, $dest)) {
            sendTelegram(
                'sendMessage', 
                array(
                    'chat_id' => $data['message']['chat']['id'],
                    'text' => 'Картинка збережена на сервері'
                )
            );
            
        }
    }
    
    exit();    
}
 
// Відповідь на текстове повідомлення
// Отримуємо текст, який відправив користувач Телеграм боту в месенджері
if (!empty($data['message']['text'])) {
    $text = $data['message']['text'];
 
    // Відправили фото в Telegram бот, якщо користувач ввів команду /sendimg
    if (mb_stripos($text, '/sendimg') !== false) {
        sendTelegram(
            'sendPhoto', 
            array(
                'chat_id' => $data['message']['chat']['id'],
                'photo' => curl_file_create(__DIR__ . '/foto-ua.jpg')
            )
        );
        
        exit();    
    }
}
?>

Main Menu