Для создания такого простого бота как HelloBot нам нужно лишь словить служебные сообщения от Telegram Bot Api, которое отправляется из группы при добавлении нового участника. Новый участник может быть добавлен действующим участником, присоединиться по ссылке приглашению или самостоятельно присоединиться.
Нас интересует объект
и в нем объект по ключу message
и там находиться информация о новом участнике.new_chat_participant
Структура служебного уведомления:
Array
(
[update_id] =>
[message] => Array
(
[message_id] =>
[from] => Array
(
[id] =>
[is_bot] =>
[first_name] =>
[last_name] =>
[username] =>
[language_code] =>
)
[chat] => Array
(
[id] =>
[title] =>
[type] =>
[all_members_are_administrators] =>
)
[date] =>
[new_chat_participant] => Array
(
[id] =>
[is_bot] =>
[first_name] =>
[username] =>
)
[new_chat_member] => Array
(
[id] =>
[is_bot] =>
[first_name] =>
[username] =>
)
[new_chat_members] => Array
(
[0] => Array
(
[id] =>
[is_bot] =>
[first_name] =>
[username] =>
)
)
)
)
В наш класс бота добавим свойство, в котором будем хранить приветствие, имя пользователя {%username%} будем в последствии заменять на полученные данные из объекта функцией str_replace
<?php
// Приветствие пользователя
private $helloText = "Приветствую, {%username%}";
?>
Для получения необходимого объекта в методе
нашего класса сделаем проверку передаваемых данных и при наличии получим имя пользователя и выведем приветствие.router()
<?php
/** Роутер - Определяем что делать с данными от АПИ
* @param $data
* @return bool
*/
private function router($data)
{
// проверяем массив данных на нужный нам ключ
if (array_key_exists("new_chat_participant", $data['message'])) {
// достаем имя нового пользователя
$name = trim($data['message']['new_chat_participant']['first_name']
. ' ' . $data['message']['new_chat_participant']['last_name']);
// отправляем приветствие в чат
$this->botApiQuery("sendMessage", [
'chat_id' => $data['message']['chat']['id'],
'text' => str_replace("{%username%}", $name, $this->helloText)]
);
}
return true;
}
?>
* * *
Исходный код бота
Привожу исходный код бота приветствия для группы в Телеграм по типу HelloBot.
<?php
// определим кодировку UTF-8 и ответ 200
header("HTTP/1.1 200 OK");
header('Content-type: text/html; charset=utf-8');
// создаем объект бота
$newBot = new HelloBot();
// запускаем бота
$newBot->init();
/** Класс Бота
* Class HelloBot
*/
class HelloBot
{
// токен вашего бота
private $token = "ВАШ_ТОКЕН";
// Приветствие пользователя
private $helloText = "Приветствую, {%username%}";
/** Стартуем бота
* @return bool
*/
public function init()
{
// получаем данные от АПИ и преобразуем их в ассоциативный массив
$rawData = json_decode(file_get_contents('php://input'), true);
// направляем данные из бота в метод
// для определения дальнейшего выбора действий
$this->router($rawData);
// в любом случае вернем true для бот апи
return true;
}
/** Роутер - Определяем что делать с данными от АПИ
* @param $data
* @return bool
*/
private function router($data)
{
// проверяем массив данных на нужный нам ключ
if (array_key_exists("new_chat_participant", $data['message'])) {
// достаем имя нового пользователя
$name = trim($data['message']['new_chat_participant']['first_name']
. ' ' . $data['message']['new_chat_participant']['last_name']);
// отправляем приветствие в чат
$this->botApiQuery("sendMessage", [
'chat_id' => $data['message']['chat']['id'],
'text' => str_replace("{%username%}", $name, $this->helloText)
]
);
}
return true;
}
/** Запрос к BotApi
* @param $method
* @param array $fields
* @return mixed
*/
private function botApiQuery($method, $fields = array())
{
$ch = curl_init('https://api.telegram.org/bot' . $this->token . '/' . $method);
curl_setopt_array($ch, array(
CURLOPT_POST => count($fields),
CURLOPT_POSTFIELDS => http_build_query($fields),
CURLOPT_SSL_VERIFYPEER => 0,
CURLOPT_RETURNTRANSFER => 1,
CURLOPT_TIMEOUT => 10
));
$r = json_decode(curl_exec($ch), true);
curl_close($ch);
return $r;
}
}
?>
Откройте по ссылке или QR бот @iMakeBot, нажмите кнопку Старт/Start.
Следуйте инструкциям бота.
На Node.JS и Telegraf это делается в несколько строчек кода.
Олег, рад вас видеть!
Даже не сомневаюсь в возможностях Node.JS и тем более Telegraf - по сути это же полноценный фреймворк для разработки Telegram Bot.
Если вы поделитесь своими знаниями, буду очень благодарен, ведь у вас в части разработки ботов Телеграм опыта много (стараюсь следить за вашим творчеством).
Добрый день, а как включить форматирование для приветственного сообщения: маркдаун, например?
Можете добавить в массив данных параметр parse_mode
спасибо) будем пробовать. То есть если я передам с этим параметром сообщение - телеграм интерпретирует мой текст как форматированный?
Да, только по их правилам форматирования.
Куда вставлять этот крд
Не совсем понятен вопрос.
Загружайте на хостинг, настраивайте вебхук, добавляйте бота в группу.
Настроил WebHook, создал php файл с кодом бота, добавил бота в группу. Ничего не происходит при входе нового участника.
Посмотрите логи на сервере и в Телеграм getWebhookInfo
Здравствуйте! Подскажите, пожалуйста, доступен ли этот способ не для группы, а для канала?
Зарегистрировал бота, добавил его в канал админом, настроил вебхук, но при добавлении пользователя в канал не записывается ничего в лог, хотя если написать самому пост в канал, то в логе вижу свои данные приходящие от вебхука.
Кому то удалось запустить бота? Не понимаю, как этот бот интегрируется в группу, как он обрабатывает новых пользователей, точнее, как он их видит то, ему никто не говорит, что следи именно за этой группой, а не за тем, кто тебя активирует?
Решил, бдагодарю
Здравствуйте, подскажите пожалуйста, как мне собрать этот код и запустить бота?
Код собран, его надо разместить на хостинге например и настроить на него вебхук бота