Telegram-бот на PHP
Telegram-бот на PHP
Несколько лет назад я сделал на своем сайте отправку сообщений в Telegram средствами серверного PHP. В конце статьи я упомянул, что кроме отправки данных можно организовать взаимодействие с сайтом через Telegram. Настало время это реализовать, то есть написать полноценного Telegram-бота на PHP.
Основная часть, касающаяся регистрации бота, получения токена и идентификатора, подробно расписана по ссылке из первого абзаца, дублировать не буду. В дальнейшем предполагается, что бот создан и все необходимые данные получены.
Для того, чтобы серверный бот мог получать все сообщения и уведомления, первым делом надо зарегистрировать так называемый webhook, то есть указать ссылку на скрипт, куда Telegram будет отправлять все данные. Формируем ссылку вида:
https://api.telegram.org/bot[token]/setWebhook?url=https://вашсайт.ру/telebot.php
где [token] - это токен, полученный при регистрации бота. Например, для описанного ранее тестового бота ссылка будет вот такой:
https://api.telegram.org/bot629705209:AAFhFqFbhR3VHHrOgOM7R4OnQT-usqJwTBk/setWebhook?url=https://вашсайт.ру/telebot.php
Если все сделано правильно, то в браузере будет получен ответ:
{"ok":true,"result":true,"description":"Webhook was set"}
Telegram отправляет данные на указанный скрипт при помощи POST-запроса, формат передаваемых данных всегда JSON. Для удобства разбора полетов, особенно на первых этапах, лучше логировать все полученные данные куда-нибудь в файл. Каркас скрипта-приемника будет иметь следующий вид:
Code (PHP) : Убрать нумерацию
- $data=file_get_contents('php://input');
- if ($json=json_decode($data, true)) {
- if (isset($json['update_id'])) {
- // $json - отправленные данные
- }
- else {
- // Это точно не данные от Telegram
- exit;
- }
- }
- else {
- // Получены некорректные данные
- exit;
- }
Array (
[update_id] => 434540657
[message] => Array (
[message_id] => 1702
[from] => Array (
[id] => 698237240
[is_bot] =>
[first_name] => Dmitry
[language_code] => ru
)
[chat] => Array (
[id] => 698237240
[first_name] => Dmitry
[type] => private
)
[date] => 1679039931
[text] => Привет
)
)
В зависимости от функционала и назначения, бот самостоятельно анализирует входящее сообщение, на его основании выполняет какие-то действия и, если надо, отправляет пользователю ответ. Отправлять данные мы уже умеем. По такой схеме работают, например, боты-переводчики.
Бот может принимать управляющие команды, они начинаются с косой черты "/". Если Telegram распознает такую команду, то в этом случае в уведомлении будет присутствовать дополнительный блок, хотя в остальном оно ничем не отличается от обычного текстового сообщения.
Array (
[update_id] => 434540657
[message] => Array (
[message_id] => 1702
[from] => Array (
[id] => 698237240
[is_bot] =>
[first_name] => Dmitry
[language_code] => ru
)
[chat] => Array (
[id] => 698237240
[first_name] => Dmitry
[type] => private
)
[date] => 1679039931
[text] => /dosomething
[entities] => Array (
[0] => Array (
[offset] => 0
[length] => 12
[type] => bot_command
)
)
)
)
Тут указывается, с какой позиции сообщения начинается управляющая команда и какой она длины. Реакция на ту или иную команду, естественно, остается на совести разработчика бота. Пользователь может передавать несколько команд в одном сообщении, даже перемежая их текстом. Telegram поможет их определить и для каждой команды передаст ее позицию в отправленном сообщении и длину.
Array (
[update_id] => 434540657
[message] => Array (
[message_id] => 1702
[from] => Array (
[id] => 698237240
[is_bot] =>
[first_name] => Dmitry
[language_code] => ru
)
[chat] => Array (
[id] => 698237240
[first_name] => Dmitry
[type] => private
)
[date] => 1679039931
[text] => Yo, bota! /krush /kill and /destroy
[entities] => Array (
[0] => Array (
[offset] => 10
[length] => 6
[type] => bot_command
)
[1] => Array (
[offset] => 17
[length] => 5
[type] => bot_command
)
[2] => Array (
[offset] => 27
[length] => 8
[type] => bot_command
)
)
)
)
Когда пользователь отправляет боту картинку со своего устройства, то фактически боту никаких файлов не передается. Файл загружается на сервер Telegram, а боту приходит информация об этом файле.
Array (
[update_id] => 434540657
[message] => Array (
[message_id] => 1702
[from] => Array (
[id] => 698237240
[is_bot] =>
[first_name] => Dmitry
[language_code] => ru
)
[chat] => Array (
[id] => 698237240
[first_name] => Dmitry
[type] => private
)
[date] => 1679039931
[photo] => Array (
[0] => Array (
[file_id] => AgAAAAAA1111111222222444zF-06666667777DDDDD
[file_unique_id] => AQ111111111111h4
[file_size] => 1575
[width] => 55
[height] => 90
)
[1] => Array (
[file_id] => AgAAAAAA1111111222222444zF-06666667777CCCCC
[file_unique_id] => AQ111111111111hy
[file_size] => 23882
[width] => 197
[height] => 320
)
[2] => Array (
[file_id] => AgAAAAAA1111111222222444zF-06666667777BBBBB
[file_unique_id] => AQ111111111111h9
[file_size] => 99568
[width] => 493
[height] => 800
)
[3] => Array (
[file_id] => AgAAAAAA1111111222222444zF-06666667777AAAAA
[file_unique_id] => AQ111111111111h-
[file_size] => 175335
[width] => 789
[height] => 1280
)
)
)
)
Как видите, Telegram и тут позаботился о web-мастере, передавая не только оригинальное изображение, но и подготовив аж три превьюшки разного размера. Сам файл получается в два этапа. Сперва надо определить, какой из четырех файлов нам нужен, они отличаются по полю file_id. Допустим, превьюшки нас не интересуют, поэтому просто берем последний элемент массива и получаем информацию о загруженном файле, используя его идентификатор.
Code (PHP) : Убрать нумерацию
- // Токен бота
- $token='629705209:AAFhFqFbhR3VHHrOgOM7R4OnQT-usqJwTBk';
- $photo=array_pop($json['message']['photo']);
- $ch=curl_init();
- curl_setopt($ch, CURLOPT_URL, 'https://api.telegram.org/bot'.$token.'/getFile');
- curl_setopt($ch, CURLOPT_POST, TRUE);
- curl_setopt($ch, CURLOPT_POSTFIELDS, 'file_id='.$photo['file_id']);
- curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
- curl_setopt($ch, CURLOPT_HEADER, FALSE);
- curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
- $result=curl_exec($ch);
- curl_close($ch);
- $json=json_decode($result,true);
Array (
[ok] => 1
[result] => Array (
[file_id] => AgAAAAAA1111111222222444zF-06666667777AAAAA
[file_unique_id] => AQ111111111111h-
[file_size] => 175335
[file_path] => photos/file_0.jpg
)
)
Только теперь, получив имя файла, можно загрузить его содержимое с сервера Telegram. Код будет примерно таким:
Code (PHP) : Убрать нумерацию
- $ch=curl_init();
- curl_setopt($ch, CURLOPT_URL,
- 'https://api.telegram.org/file/bot'.$token.'/'.$json['result']['file_path']);
- curl_setopt($ch, CURLOPT_POST, FALSE);
- curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
- curl_setopt($ch, CURLOPT_HEADER, FALSE);
- curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
- $source=curl_exec($ch);
- curl_close($ch);
- // $source - содержимое файла
Все прочие файлы, в том числе и изображения в форматах PNG, WebP и других, пересылаются как документы. По возможности, если удалось распознать файл как изображение, для него генерится превьюшка.
Array (
[update_id] => 434540657
[message] => Array (
[message_id] => 1702
[from] => Array (
[id] => 698237240
[is_bot] =>
[first_name] => Dmitry
[language_code] => ru
)
[chat] => Array (
[id] => 698237240
[first_name] => Dmitry
[type] => private
)
[date] => 1679039931
[document] => Array (
[file_name] => my_image.png
[mime_type] => image/png
[thumbnail] => Array (
[file_id] => AgAAAAAA1111111222222444zF-06666667777CCCCC
[file_unique_id] => AQ111111111111hA
[file_size] => 25093
[width] => 320
[height] => 282
)
[thumb] => Array (
[file_id] => AgAAAAAA1111111222222444zF-06666667777BBBBB
[file_unique_id] => AQ111111111111hB
[file_size] => 25093
[width] => 320
[height] => 282
)
[file_id] => AgAAAAAA1111111222222444zF-06666667777AAAAA
[file_unique_id] => AQ111111111111hC
[file_size] => 33560
)
)
)
Остальные документы считаются бинарными файлами и передаются как есть.
Array (
[update_id] => 434540657
[message] => Array (
[message_id] => 1702
[from] => Array (
[id] => 698237240
[is_bot] =>
[first_name] => Dmitry
[language_code] => ru
)
[chat] => Array (
[id] => 698237240
[first_name] => Dmitry
[type] => private
)
[date] => 1679039931
[document] => Array (
[file_name] => my_book.fb2
[mime_type] => application/octet-stream
[file_id] => AgAAAAAA1111111222222444zF-06666667777AAAAA
[file_unique_id] => AQ111111111111hC
[file_size] => 1236900
)
)
)
Содержимое файла получается точно так же в два захода. И вот тут от получения информации о файле уже не отвертеться.
Code (PHP) : Убрать нумерацию
- // Токен бота
- $token='629705209:AAFhFqFbhR3VHHrOgOM7R4OnQT-usqJwTBk';
- $ch=curl_init();
- curl_setopt($ch, CURLOPT_URL, 'https://api.telegram.org/bot'.$token.'/getFile');
- curl_setopt($ch, CURLOPT_POST, TRUE);
- curl_setopt($ch, CURLOPT_POSTFIELDS,
- 'file_id='.$json['message']['document']['file_id']);
- curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
- curl_setopt($ch, CURLOPT_HEADER, FALSE);
- curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
- $result=curl_exec($ch);
- $json=json_decode($result,true);
- curl_setopt($ch, CURLOPT_URL,
- 'https://api.telegram.org/file/bot'.$token.'/'.$json['result']['file_path']);
- curl_setopt($ch, CURLOPT_POST, FALSE);
- $source=curl_exec($ch);
- curl_close($ch);
- // $source - содержимое файла
В дополнение к предыдущей статье об отправке обычных текстовых сообщений расскажу, как можно отправлять пользователю изображения и документы. Делается это достаточно просто.
Отправка изображения
Code (PHP) : Убрать нумерацию
- // Подготовить локальный файл для отправки
- $file=__DIR__.'/original.jpg';
- if (function_exists('curl_file_create')) {
- $attachment=curl_file_create($file);
- }
- else {
- $info=pathinfo($file);
- $attachment='@'.realpath($file).';filename='.$info['basename'].
- ';type='.mime_content_type($file);
- }
- $query=array(
- 'chat_id'=>$chat_id,
- 'photo'=>$attachment,
- 'caption'=>'Тестовая картинка',
- );
- $ch=curl_init();
- curl_setopt($ch, CURLOPT_URL,
- 'https://api.telegram.org/bot'.$token.'/sendPhoto');
- curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
- curl_setopt($ch, CURLOPT_HEADER, false);
- curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
- curl_setopt($ch, CURLOPT_POST, true);
- curl_setopt($ch, CURLOPT_POSTFIELDS, $query);
- $result=curl_exec($ch);
- curl_close($ch);
Отправка документа выполняется почти так же, только меняется название ключа массива и ссылка API.
Отправка документа
Отправка документа
Code (PHP) : Убрать нумерацию
- // Подготовить локальный файл для отправки
- $file=__DIR__.'/example.xls';
- if (function_exists('curl_file_create')) {
- $attachment=curl_file_create($file);
- }
- else {
- $info=pathinfo($file);
- $attachment='@'.realpath($file).';filename='.$info['basename'].
- ';type='.mime_content_type($file);
- }
- $query=array(
- 'chat_id'=>$chat_id,
- 'document'=>$attachment,
- 'caption'=>'Тестовый документ',
- );
- $ch=curl_init();
- curl_setopt($ch, CURLOPT_URL,
- 'https://api.telegram.org/bot'.$token.'/sendDocument');
- curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
- curl_setopt($ch, CURLOPT_HEADER, false);
- curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
- curl_setopt($ch, CURLOPT_POST, true);
- curl_setopt($ch, CURLOPT_POSTFIELDS, $query);
- $result=curl_exec($ch);
- curl_close($ch);
Отправка аудио
Code (PHP) : Убрать нумерацию
- // Подготовить локальный файл для отправки
- $file=__DIR__.'/example.mp3';
- if (function_exists('curl_file_create')) {
- $attachment=curl_file_create($file);
- }
- else {
- $info=pathinfo($file);
- $attachment='@'.realpath($file).';filename='.$info['basename'].
- ';type='.mime_content_type($file);
- }
- $query=array(
- 'chat_id'=>$chat_id,
- 'audio'=>$attachment,
- 'caption'=>'Тестовая песенка',
- );
- $ch=curl_init();
- curl_setopt($ch, CURLOPT_URL,
- 'https://api.telegram.org/bot'.$token.'/sendAudio');
- curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
- curl_setopt($ch, CURLOPT_HEADER, false);
- curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
- curl_setopt($ch, CURLOPT_POST, true);
- curl_setopt($ch, CURLOPT_POSTFIELDS, $query);
- $result=curl_exec($ch);
- curl_close($ch);
Отдельно хочется остановиться на взаимодействии пользователя с ботом. Конечно, можно сколько угодно набирать вручную текстовые сообщения и команды управления, но это быстро надоедает, к тому же повышается риск ошибки. Гораздо удобнее сразу же предоставлять пользователю список возможных действий в привычном ему формате, например, в виде кнопок.
Первый тип клавиатуры - inline-клавиатура, которая прикрепляется к конкретному сообщению. Как правило в ней содержится список действий, которые связаны с этим сообщением, например, переход по ссылке или открытие конкретной карточки товара. Для отправки такой клавиатуры надо сперва сформировать массив с кнопками, которые будут прикреплены к сообщению, а затем передать его в параметре reply_markup.
Пример inline-клавиатуры
Code (PHP) : Убрать нумерацию
- $keyboard=array(
- "resize_keyboard"=>true,
- "inline_keyboard"=>array(
- // Первая строка кнопок
- array(
- array(
- 'text' => 'Перейти на сайт www.manhunter.ru',
- 'url'=>'https://www.manhunter.ru',
- ),
- ),
- // Вторая строка кнопок
- array(
- array(
- 'text' => 'Привет!',
- 'callback_data'=>'Нажата внопка 1'
- ),
- array(
- 'text' => 'До свидания!',
- 'callback_data'=>'Нажата внопка 2'
- ),
- ),
- ),
- );
- $text='Вот такие кнопки. Попробуй их все!';
- $ch=curl_init();
- curl_setopt($ch, CURLOPT_URL,
- 'https://api.telegram.org/bot'.$token.'/sendMessage');
- curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
- curl_setopt($ch, CURLOPT_HEADER, false);
- curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
- curl_setopt($ch, CURLOPT_POST, true);
- curl_setopt($ch, CURLOPT_POSTFIELDS,
- 'chat_id='.$chat_id.'&text='.rawurlencode($text).
- '&reply_markup='.json_encode($keyboard));
- curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 10);
- $result=curl_exec($ch);
Array (
[update_id] => 434540657
[callback_query] => Array (
[id] => 1111222223333344444
[from] => Array (
[id] => 698237240
[is_bot] =>
[first_name] => Dmitry
[language_code] => ru
)
[message] => Array (
[message_id] => 74
[from] => Array (
[id] => 1112223445
[is_bot] => 1
[first_name] => MySupaTestBot
[username] => MySupaTestBot_bot
)
[chat] => Array (
[id] => 698237240
[first_name] => Dmitry
[type] => private
)
[date] => 1679227556
[text] => Вот такие кнопки. Попробуй их все!
[reply_markup] => Array (
[inline_keyboard] => Array (
[0] => Array (
[0] => Array (
[text] => Перейти на сайт
[url] => https://www.manhunter.ru/
)
)
[1] => Array (
[0] => Array (
[text] => Привет
[callback_data] => Нажата внопка 1
)
[1] => Array (
[text] => До свидания
[callback_data] => Нажата внопка 2
)
)
)
)
)
[chat_instance] => -123456789081123230
[data] => Нажата внопка 1
)
)
После отправки callback-сообщения клиент Telegram переходит в режим ожидания ответа, при этом на нажатой кнопке появляется значок часиков. Если в течение определенного времени ответ от серверного обработчика не получен, то значок часиков пропадает. Но хорошей практикой будет отправлять из обработчика ответ на callback-сообщения с помощью метода answerCallbackQuery. В этом случае для идентификации получателя используется поле ['callback_query']['id'].
Code (PHP) : Убрать нумерацию
- $callback_id=$json['callback_query']['id'];
- $text='';
- $ch=curl_init();
- curl_setopt($ch, CURLOPT_URL,
- 'https://api.telegram.org/bot'.$token.'/answerCallbackQuery');
- curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
- curl_setopt($ch, CURLOPT_HEADER, false);
- curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
- curl_setopt($ch, CURLOPT_POST, true);
- curl_setopt($ch, CURLOPT_POSTFIELDS,
- 'callback_query_id='.$callback_id.'&text='.rawurlencode($text));
- curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 10);
- $result=curl_exec($ch);
Второй тип клавиатуры - обычная, она предназначена для отправки пользователем в чат предустановленных сообщений и располагается под строкой ввода. В массиве описания клавиатуры меняется название ключа и передаются только названия кнопок, они же являются предустановленным текстом сообщений.
Пример обычной клавиатуры
Code (PHP) : Убрать нумерацию
- $keyboard=array(
- "resize_keyboard"=>true,
- "keyboard"=>array(
- array(
- array(
- 'text' => 'Всем привет!',
- ),
- array(
- 'text' => 'До свидания!',
- ),
- ),
- ),
- );
- $text='Вот такие кнопки. Попробуй их все!';
- $ch=curl_init();
- curl_setopt($ch, CURLOPT_URL,
- 'https://api.telegram.org/bot'.$token.'/sendMessage');
- curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
- curl_setopt($ch, CURLOPT_HEADER, false);
- curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
- curl_setopt($ch, CURLOPT_POST, true);
- curl_setopt($ch, CURLOPT_POSTFIELDS,
- 'chat_id='.$chat_id.'&text='.rawurlencode($text).
- '&reply_markup='.json_encode($keyboard));
- curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 10);
- $result=curl_exec($ch);
Через @BotFather можно задавать список команд бота. Он появится в меню команд при нажатии кнопки рядом с полем ввода. Но можно сделать это и программно, например, сразу после старта бота.
Меню команд бота
Code (PHP) : Убрать нумерацию
- $commands=array(
- array(
- 'command'=>'start',
- 'description'=>'Запуск бота'
- ),
- array(
- 'command'=>'monster',
- 'description'=>'Монстр дня'
- ),
- array(
- 'command'=>'crossword',
- 'description'=>'Кроссворд'
- ),
- array(
- 'command'=>'coupon',
- 'description'=>'Купон'
- ),
- );
- $query=array(
- 'commands'=>json_encode($commands),
- );
- $ch=curl_init();
- curl_setopt($ch, CURLOPT_URL,
- 'https://api.telegram.org/bot'.$token.'/setMyCommands');
- curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
- curl_setopt($ch, CURLOPT_HEADER, false);
- curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
- curl_setopt($ch, CURLOPT_POST, true);
- curl_setopt($ch, CURLOPT_POSTFIELDS, $query);
- curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 10);
- $result=curl_exec($ch);
- curl_close($ch);
И напоследок буквально пару слов об оформлении сообщений, которые бот отправляет пользователю. Чтобы определенный фрагмент текста можно было скопировать одним нажатием, его надо оформить тегами <code> и дополнить список полей отправки параметром parse_mode=HTML.
Code (PHP) : Убрать нумерацию
- $text='Длинный текст, <code>а этот фрагмент можно копировать</code>, и еще текст';
- $ch=curl_init();
- curl_setopt($ch, CURLOPT_URL,
- 'https://api.telegram.org/bot'.$token.'/sendMessage');
- curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
- curl_setopt($ch, CURLOPT_HEADER, false);
- curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
- curl_setopt($ch, CURLOPT_POST, true);
- curl_setopt($ch, CURLOPT_POSTFIELDS,
- 'chat_id='.$chat_id.'&text='.rawurlencode($text).'&parse_mode=HTML');
- curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 10);
- $result=curl_exec($ch);
- curl_close($ch);
Изображение в сообщении
В этом случае превью изображения будет расположено сразу под текстом, независимо, где оно находилось в оригинале. И такая превьюшка в сообщении может быть только одна. Что ж, это лучше, чем ничего.
Code (PHP) : Убрать нумерацию
- $text='Посмотрите, какая картинка есть у нас ';
- $text.='<a href="https://вашсайт.ру/image.jpg">‍</a>';
- $text.='Вам нравится?';
- $ch=curl_init();
- curl_setopt($ch, CURLOPT_URL,
- 'https://api.telegram.org/bot'.$token.'/sendMessage');
- curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
- curl_setopt($ch, CURLOPT_HEADER, false);
- curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
- curl_setopt($ch, CURLOPT_POST, true);
- curl_setopt($ch, CURLOPT_POSTFIELDS,
- 'chat_id='.$chat_id.'&text='.rawurlencode($text).
- '&disable_web_page_preview=false&parse_mode=HTML');
- curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 10);
- $result=curl_exec($ch);
- curl_close($ch);
Текст в подписи и inline-клавиатура
Пост можно дополнить инлайновыми кнопками-ссылками, украсить иконками эмодзи, главное во всем знать меру. Код для отправки будет следующим:
Code (PHP) : Убрать нумерацию
- $keyboard=array(
- "resize_keyboard"=>true,
- "inline_keyboard"=>array(
- array(
- array(
- 'text' => 'Перейти на сайт www.manhunter.ru',
- 'url'=>'https://www.manhunter.ru',
- ),
- ),
- ),
- );
- // Подготовить локальный файл для отправки
- $file=__DIR__.'/example.jpg';
- if (function_exists('curl_file_create')) {
- $attachment=curl_file_create($file);
- }
- else {
- $info=pathinfo($file);
- $attachment='@'.realpath($file).';filename='.$info['basename'].
- ';type='.mime_content_type($file);
- }
- $query=array(
- 'chat_id'=>$chat_id,
- 'photo'=>$attachment,
- 'caption'=>'Новинка! Распродажа!'."\n".
- 'Только сейчас и только у нас!'."\n".
- 'Налетай, торопись, покупай живопись!',
- 'reply_markup'=>json_encode($keyboard),
- );
- $ch=curl_init();
- curl_setopt($ch, CURLOPT_URL,
- 'https://api.telegram.org/bot'.$token.'/sendPhoto');
- curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
- curl_setopt($ch, CURLOPT_HEADER, false);
- curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
- curl_setopt($ch, CURLOPT_POST, true);
- curl_setopt($ch, CURLOPT_POSTFIELDS, $query);
- $result=curl_exec($ch);
- curl_close($ch);
Отправка группы картинок
Локальные файлы для отправки готовятся следующим образом. Обратите внимание, что если требуется общий сопроводительный текст для группы, то он прописывается в описании первого элемента. В противном случае текст описания будет виден только при открытии на просмотр каждой отдельной картинки или видео.
Code (PHP) : Убрать нумерацию
- // Подготовить локальные файлы для отправки
- $file1=__DIR__.'/original_3.jpg';
- $file2=__DIR__.'/original_2.jpg';
- $file3=__DIR__.'/original_1.jpg';
- if (function_exists('curl_file_create')) {
- $attachment1=curl_file_create($file1);
- $attachment2=curl_file_create($file2);
- $attachment3=curl_file_create($file3);
- }
- else {
- $info=pathinfo($file1);
- $attachment1='@'.realpath($file1).';filename='.$info['basename'].
- ';type='.mime_content_type($file1);
- $info=pathinfo($file2);
- $attachment2='@'.realpath($file2).';filename='.$info['basename'].
- ';type='.mime_content_type($file2);
- $info=pathinfo($file3);
- $attachment3='@'.realpath($file3).';filename='.$info['basename'].
- ';type='.mime_content_type($file3);
- }
- $query=array(
- 'chat_id'=>$chat_id,
- 'media'=>json_encode(array(
- array(
- 'type'=>'photo',
- 'media'=>'attach://attach_1',
- 'caption'=>'Группа картинок',
- ),
- array(
- 'type'=>'photo',
- 'media'=>'attach://attach_2',
- ),
- array(
- 'type'=>'photo',
- 'media'=>'attach://attach_3',
- ),
- )),
- 'attach_1'=>$attachment1,
- 'attach_2'=>$attachment2,
- 'attach_3'=>$attachment3,
- );
- $ch=curl_init();
- curl_setopt($ch, CURLOPT_URL,
- 'https://api.telegram.org/bot'.$token.'/sendMediaGroup');
- curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
- curl_setopt($ch, CURLOPT_HEADER, false);
- curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
- curl_setopt($ch, CURLOPT_POST, true);
- curl_setopt($ch, CURLOPT_POSTFIELDS, $query);
- $result=curl_exec($ch);
- curl_close($ch);
Комбинируя описанные тут методы приема и отправки сообщений разного типа, вы можете написать собственного Telegram-бота с нужным функционалом. В очередной раз скажу, что перечисленными функциями возможности Telegram-ботов не ограничиваются. Изучайте документацию, смотрите примеры, пробуйте и у вас все получится.
Просмотров: 5135 | Комментариев: 11
Внимание! Статья опубликована больше года назад, информация могла устареть!
Комментарии
Отзывы посетителей сайта о статье
ManHunter
(07.10.2023 в 23:31):
Нигде больше не сижу, на свой сайт с трудом времени хватает
morgot
(04.10.2023 в 23:51):
ManHunter, да сейчас везде такой подход. Взять любой форум по кодингу или тот же хабр (не знаю, сидишь ли где-то, видел только на кряклабе). Нельзя самому делать гуи, есть QT/Electron. Нельзя самому закодить простейшую анимацию или там ajax - бери Vue/React. И с РНР аналогично - везде composer, фреймворки. Кодить никто с нуля не умеет, все ищут либы чтобы сделать то или это. А потом еще случаются истории, как с node-ipc.
ManHunter
(04.10.2023 в 23:36):
Ха, а мне тут совсем недавно выкатили, что так ботов писать нельзя, надо взять готовую библиотеку и все.
morgot
(04.10.2023 в 23:15):
Спасибо. Единственное, наверное, на весь инет нормальное руководство - чистый процедурный код. А то везде ООП, композер, симфони и подобный гуан. Вообще, РНР последние годы стал какой-то монструозной джавой, где для хелловорлда надо написать 20 строк и вызвать 120 зависимостей.
ManHunter
(04.05.2023 в 13:08):
Добавил в статью информацию про answerCallbackQuery, про список команд, подкорректировал код создания объектов отправляемых файлов.
ManHunter
(22.03.2023 в 21:35):
С чего вдруг такая забота?
Petya
(22.03.2023 в 19:24):
Я надеюсь, токены бота в статье липовые приведены?
ManHunter
(20.03.2023 в 09:53):
У меня их две: Huawei P30 и Huawei P30 Pro
master-ufa, разместить скрипт-приемник можно на любом ресурсе, который доступен извне по https. Оптимально это свой сайт или сервер, зависит от задачи. У меня скрипт залит на этот сайт, по уведомлениям о разных событиях я одним нажатием нужной кнопки мгновенно выполняю нужное действие. И не важно, где я нахожусь, не надо лезть в комп, открывать браузер, заходить в админку и все такое.
Скрипт для отправки может работать вообще хоть откуда, лишь бы был исходящий интернет.
nordpoint
(20.03.2023 в 09:46):
Спасибо за труды! Если не секрет, какую мобилу юзаете?
master-ufa
(20.03.2023 в 08:56):
Вчера только решил изучить телеграм-бота, а тут уже все расписано. СПАСИБО. Один только вопрос: где можно разместить Скрипт?
1. На домашнем компьютере который постоянно включен?
2. Если на "мойсайт.ру", то в каком месте?
3. В самом Телеграмм есть возможность?
4. Какие надежные сторонние сервисы для размещения Вы используете?
1. На домашнем компьютере который постоянно включен?
2. Если на "мойсайт.ру", то в каком месте?
3. В самом Телеграмм есть возможность?
4. Какие надежные сторонние сервисы для размещения Вы используете?
Добавить комментарий
Заполните форму для добавления комментария
Единственное - мне пришлось добавить mb_convert_encoding("тут сообщение на русском",'UTF-8')); - т.к. почему-то телеграм ругался на "Bad Request: strings must be encoded in UTF-8"". Хотя сам файл скрипта был в кодировке утф-8, ну да ладно, не суть.