Для написания простейшего бота для телеграмма будем использовать схему работы через webhook, те отдадим телеге ссылку, по которой она будет стучаться, когда происходит какое-нибудь событие.
Всего у нас будет 2 файла: webhook.php, который содержит логику работы, и tg.class.php, который содержит методы для отправки сообщений и ответа на запросы.
Для того, что бы телеграм знаю куда стучаться при наступлении события сообщим ему о нашем обработчике открыв в браузере страницу с адресом, обратите внимание, что обязательно нужен SSL: https://api.telegram.org/botAPI_TOKEN_TG/setWebhook?url=https://YOUR_DOMAIN/webhook.php
webhook.php
<?php
define('TGKEY', 'TELEGRAM_API_KEY-insert here your tg api key');
include_once('tg.class.php');
$body = file_get_contents('php://input');
$arr = json_decode($body, true);
$tg = new tg(TGKEY);
$tg_id = $arr['message']['chat']['id'];
$rez_kb = array();
$message_text = $arr['message']['text'];
$tg->sendChatAction($tg_id);
$sms_rev='';
switch($message_text){
case '/start':
$sms_rev = 'Здравствуйте, Вас приветсвует Простейший Бот Telegram!
';
break;
case '/help':
$sms_rev = 'Я могу выполнить следующюю функцию:
/rev - переворачиваею строку наоборот.
';
break;
case '/rev':
$sms_rev = strrev($message_text);
break;
default:
$sms_rev ='Команда не распознана';
break;
}
$tg->send($tg_id, $sms_rev, $rez_kb);
exit('ok'); // говорим телеге, что все окей
?>
tg.class.php
<?php
class TG {
public $token = '';
public function __construct($token) {
$this->token = $token;
}
public function send($id, $message, $kb) {
$data = array(
'chat_id' => $id,
'text' => $message,
'parse_mode' => 'HTML',
'disable_web_page_preview'=>true,
'reply_markup' => json_encode(array('inline_keyboard' => $kb))
);
$this->request('sendMessage', $data);
}
public function editMessageText($id, $m_id, $m_text, $kb=''){
$data=array(
'chat_id' => $id,
'message_id' => $m_id,
'parse_mode' => 'HTML',
'text' => $m_text
);
if($kb)
$data['reply_markup']=json_encode(array('inline_keyboard' => $kb));
$this->request('editMessageText', $data);
}
public function editMessageReplyMarkup($id, $m_id, $kb){
$data=array(
'chat_id' => $id,
'message_id' => $m_id,
'reply_markup' => json_encode(array('inline_keyboard' => $kb))
);
$this->request('editMessageReplyMarkup', $data);
}
public function answerCallbackQuery($cb_id, $message) {
$data = array(
'callback_query_id' => $cb_id,
'text' => $message
);
$this->request('answerCallbackQuery', $data);
}
public function sendChatAction($id,$action='typing') {
$data = array(
'chat_id' => $id,
'action' => $action
);
$this->request('sendChatAction', $data);
}
public function request($method, $data = array()) {
$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, 'https://api.telegram.org/bot' . $this->token . '/' . $method);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_CUSTOMREQUEST, 'POST');
curl_setopt($curl, CURLOPT_POST, true);
curl_setopt($curl, CURLOPT_POSTFIELDS, $data);
$out = json_decode(curl_exec($curl), true);
curl_close($curl);
return $out;
}
}
Разберем отдельно по функциям
Конструктор
class TG {
public $token = '';
public function __construct($token) {
$this->token = $token;
}
Все крайне просто, в конструкторе сохраняем во внутреннюю переменную Api ключ, который получили от BotFather бота телеграмма.
Функция отправки запроса в телегу
public function request($method, $data = array()) {
$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, 'https://api.telegram.org/bot' . $this->token . '/' . $method);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_CUSTOMREQUEST, 'POST');
curl_setopt($curl, CURLOPT_POST, true);
curl_setopt($curl, CURLOPT_POSTFIELDS, $data);
$out = json_decode(curl_exec($curl), true);
curl_close($curl);
return $out;
}
Отправляем запрос вида https://api.telegram.org/botAPI_KEY/ИМЯ_МЕТОДА по протоколу post через curl.
Функция отправки сообщения — sendMessage
public function send($id, $message, $kb) {
$data = array(
'chat_id' => $id,
'text' => $message,
'parse_mode' => 'HTML',
'disable_web_page_preview'=>true,
'reply_markup' => json_encode(array('inline_keyboard' => $kb))
);
$this->request('sendMessage', $data);
}
Получаем в параметрах ID диалога, сообщение и инлайн клавиатуру, если она нужна.
Функция редактирования текста сообщения — editMessageText
public function editMessageText($id, $m_id, $m_text, $kb=''){
$data=array(
'chat_id' => $id,
'message_id' => $m_id,
'parse_mode' => 'HTML',
'text' => $m_text
);
if($kb)
$data['reply_markup']=json_encode(array('inline_keyboard' => $kb));
$this->request('editMessageText', $data);
}
Редактируем с помощью нее сообщение бота в телеграме всемсте с инлайн клавиатурой, если нужно. Получаем в качестве параметров ID чата, ID сообщения, новый текст сообщения, инлайн клавиатуру.
Функция ответа на событие нажатия кнопки (обратного запроса) — answerCallbackQuery
public function answerCallbackQuery($cb_id, $message) {
$data = array(
'callback_query_id' => $cb_id,
'text' => $message
);
$this->request('answerCallbackQuery', $data);
}
Получаем в параметрах ID обратного запроса и текст ответа.
Функция редактирования разметки/кнопок — editMessageReplyMarkup
public function editMessageReplyMarkup($id, $m_id, $kb){
$data=array(
'chat_id' => $id,
'message_id' => $m_id,
'reply_markup' => json_encode(array('inline_keyboard' => $kb))
);
$this->request('editMessageReplyMarkup', $data);
}
Получаем как параметр ID чата, ID сообщения, новую разметку/клавиатуру. Используем в паре с answerCallbackQuery, для ответа на запрос с заменой разметки.