Общая информация

Данная статья описывает способ создания простых чат-ботов сервисов Telegram и Slack на примере проверки IP|Email на спам с помощью антиспам-сервиса CleanTalk.


Telegram

Первый шаг — это создание своего бота (в нашем случае @CleanTalkBot) — для этого в Telegram существует бот @BotFather. Добавляем его в Ваш аккаунт Telegram и задаём команду /newbot. Бот попросит Вас ввести название бота — вводим название. После этого вводим имя пользователя бота — мы сделали название бота и имя пользователя бота одинаковыми — при этом имя пользователя должно оканчиваться на bot или Bot — например HabrArticleBot или CleanTalkBot. После ввода имени пользователя бот будет создан и Вам будет выдан токен, который будет использоваться в дальнейшем для идентификации.



Второй шаг — установка так называемого webhook — проще говоря обработчика запросов, поступающих в чат-бот от пользователей. Когда пользователь задаёт команду Вашему чат-боту, Telegram обращается к адресу, который был задан в качестве webhook, передаёт сообщение пользователя и служебную информацию, Ваш обработчик формирует ответ и передаёт обратно Telegram, после чего Telegram отдаёт ответ пользователю. Делается это с помощью команды curl в терминале -


curl -d "url=https://example.com/telegramwaiter.php" https://api.telegram.org/botYOUR_TELEGRAM_TOKEN/setWebhook

где YOUR_TELEGRAM_TOKEN — тот самый токен, который был выдан Вам ботом @BotFather ранее, а https://example.com/telegramwaiter.php — это тот адрес, по которому будет обращаться Telegram с запросами. В ответ Telegram должен вернуть json строку типа


{"ok":true,"result":true,"description":"Webhook is set"}

что означает — обработчик для Вашего чат-бота успешно установлен.


Здесь нужно добавить, что Telegram работает только по https — если у Вас сертификат, выпущенный специальными организациями (не самоподписанный), то всё отлично, если же Вы желаете использовать самоподписанные сертификаты — обратитесь к документации здесь https://core.telegram.org/bots/self-signed .


Третий шаг — остается написать сам обработчик запросов от Telegram telegramwaiter.php — примерный скрипт на языке PHP выглядит так


<?php

    set_time_limit(0);

    // Установка токена

    $botToken = "YOUR_TELEGRAM_TOKEN";
    $website = "https://api.telegram.org/bot".$botToken;

    // Получаем запрос от Telegram 

    $content = file_get_contents("php://input");
    $update = json_decode($content, TRUE);
    $message = $update["message"];

    // Получаем внутренний номер чата Telegram и команду, введённую пользователем в   чате 

    $chatId = $message["chat"]["id"];
    $text = $message["text"];

    // Пример обработки команды /start

    if ($text == '/start') {
        $welcomemessage = 'Welcome!!! Check IP/Email for spam giving "check IP/Email" command';

       // Отправляем сформированное сообщение обратно в Telegram пользователю   

       file_get_contents($website."/sendmessage?chat_id=".$chatId."&text=".$welcomemessage);    
    }    
?>

Порядок такой — получаем в переменной $text команду от пользователя в чате, формируем в соответствии с нужной логикой сообщение и отдаём обратно пользователю с помощью функции file_get_contents().


Как всё это работает можно посмореть добавив бота @CleanTalkBot в Telegram — вводим команду check IP|Email и получаем информацию о том, является ли указанный IP|Email спамным.


Пример ответа


Email stop_email@example.com is BLACKLISTED. Frequency 999. Updated Apr 24 2019. https://cleantalk.org/blacklists/stop_email@example.com.

Slack


У сервиса Slack немного другой подход к созданию чат-ботов.


Идём сюда — https://api.slack.com/apps/new — и создаём новое приложение Slack.



AppName — название приложения.
Short description — краткое описание приложения.
Describe what your app does on Slack — полное описание приложения.
Link to clear instructions on how to install your Slack app.
Link to support for your Slack app
— две ссылки на страницы с описанием установки и использования данного приложения.


В списке приложений https://api.slack.com/apps выбираем наше приложение и переходим в меню справа по ссылке Slash Commands и жмём кнопку Create new command.



В появившейся форме следующие поля



Command — вводим команду, начинающуюся с / — например /ctcheck.


Request URL — URL обработчика запроса команды — аналог webhook Telegram (например https://cleantalk.org/slackwaiter.php).


Short description — краткое описание, что с помощью создаваемой команды можно сделать.


Сохраняем команду. Обратите внимание — Ваш сайт должен работать по https — при этом самоподписанные сертификаты НЕ ПОДДЕРЖИВАЮТСЯ сервисом Slack.


Токен для идентификации Вы можете получить на странице списка команд — под списком команд есть поле Verification token — далее он фигурирует как YOUR_SLACK_TOKEN.


Пишем обработчик slackwaiter.php на языке PHP


<?php

set_time_limit(0);

// Проверяем входящий от Slack токен на соответствие выданному в панели управления Slack 

if ($_POST['token'] == 'YOUR_SLACK_TOKEN') {

    // $param - это тот текст, который идёт за командой
    // например если команда /ctcheck 127.0.0.1
    // то $param = 127.0.0.1

    $param = $_POST['text'];

    // Далее в соответствии с внутренней логикой формируется ответ

    $slackresponse = ‘Здесь ответ на команду’;

}
else
    $slackresponse = ‘Ошибка’;

$response = array();

$response['text'] = $slackresponse;

header('Content-Type: application/json');

echo json_encode($response);

?>

Далее идём сюда https://api.slack.com/docs/slack-button и в разделе Add the Slack button ставим галочки incoming webhook и commands — Slack формирует html-код кнопки, по нажатию на которую другие команды смогут интегрировать Ваше приложение в свой аккаунт Slack.


Указанную выше кнопку размещаем на Вашем сайте — по её нажатию открывается следующая картина



Для авторизации нужно выбрать канал, где можно будет пользоваться приложением.


По нажатию на кнопку Authorize Slack редиректит пользователя на страницу Redirect URI(s), которая задаётся Вами (разработчиком) здесь — https://api.slack.com/apps, выбираем Ваше приложение и переходим по ссылке App Credentials — видим следующую картину



Slack не просто редиректит пользователя на данную страницу, а добавляет GET-переменную code со значением, которая позже должна быть обработано скриптом — например


https://cleantalk.org/authscript.php?code=Slack_Code

Далее приведём примерный код скрипта authscript.php. CLIENT_ID и CLIENT_SECRET берём из соответствующих полей на предыдущем изображении.


<?php

    if (isset($_GET['code'])) {

        $client_id = 'CLIENT_ID';
        $client_secret = 'CLIENT_SECRET';
        $code = $_GET['code'];
        $response =  file_get_contents("https://slack.com/api/oauth.access?client_id=".$client_id."&  client_secret=".$client_secret."&code=".$code);
        $responsearr = json_decode($response, true);
        if (isset($responsearr['team_name'])){
            header('Location: https://'.$responsearr['team_name'].'.slack.com');
            exit();
        }
        else {
            echo 'Ошибка.';
            exit();
        }                                        
    }
    else
        exit();
?>

Порядок такой — получаем от Slack GET переменную code и ещё с двумя параметрами — client_id и client_secret — отправляем GET запросом на страницу https://slack.com/api/oauth.access. В ответ Slack пришлёт json-строку с множеством полей — что-то типа такого


{‘ok’: true, ‘team_name’: ‘your_team_name’} 

после чего просто получаем имя команды и редиректим пользователя на главную страницу его команды https://your_team_name.slack.com — приложение авторизовано, можно пользоваться командами приложения.


Команда сервиса Cleantalk надеется, что данная информация окажется полезной для всех, кто интересуется разработкой чат-ботов.

Поделиться с друзьями
-->

Комментарии (6)


  1. ilyaplot
    15.06.2016 12:13
    +1

    Мне кажется, что информации по разработке чат-ботов слишком мало в посте.


    1. makarovct
      15.06.2016 12:15

      чего же не хватает с Вашей точки зрения?


      1. T-362
        15.06.2016 14:40
        +1

        Я бы не отказался от информации о возможности и ограничениях рассылки ботом сообщений пользователям. Кейс — пользователь добавляет бота (и инициализирует командой?), бот при каком-то своем внутреннем условии шлет пользователю сообщение.


        1. makarovct
          15.06.2016 14:44

          у нас нет такой функциональности в боте — посему не могу сказать как это делается

          мы ставили перед собой задачу показать как создать простого бота — с помощью документации Telegram и Slack подчас достаточно сложно разобраться в данном вопросе — например мне пришлось обращаться в техподдержку Slack для разьяснения некоторых вопросов, связанных с разработкой бота


        1. flr
          17.06.2016 12:25
          +1

          Ограничения есть в виде лимитов на кол-во запросов. В среднем это одно сообщение в секунду и в Slack, и в Telegram. Также Telegram разрешает за секунду послать одно сообщение до 30 юзерам. Но какой-то более массовой функциональности нет.

          Подробности лимитов Slack: api.slack.com/docs/rate-limits
          Подробности лимитов Telegram: core.telegram.org/bots/faq#broadcasting-to-users

          А так, мы, например, в основном и используем мессенджеры именно для оповещения пользователей о событиях или системных оповещений. То есть сообщение инициируется нами, а не пользователем. И у Slack, и у Telegram подробная документация, там вроде все понятно. =)


          1. T-362
            17.06.2016 16:41

            Спасибо! Как раз то что нужно.