Однако чат-бот, который умеет общаться на естественном языке - это достаточно специфичная и сложная штука, в то время как сам принцип чат-ботов как приложений позволяет решать массу задач и без всякого искусственного интеллекта в удобной для пользователей форме.
Хочется сделать небольшое отступление для тех, кто еще слабо понимает, что такое чат-боты, зачем они нужны и зачем вообще заниматься их разработкой. В большей степени этот тренд формируется сейчас за рубежом – существует огромное количество ботов для Slack или Telegram, решающих самые разные задачи – от поиска авиабилетов, до управления небольшими командами разработчиков. И чтобы получить все это богатство пользователям даже не нужно выходить из предпочитаемого мессенджера.
В этом весь смысл – можно разработать мобильное приложение для вызова такси, делать его для всех мобильных платформ, затем поддерживать совместимость и т.д. А можно написать чатбота для Telegram, которому пользователь просто напишет в чате “трансфер до Шереметьево”, и бот подберет варианты и покажет их, либо сразу сформирует заказ. Пользователю не надо ставить отдельное приложение, не надо осваивать интерфейс, а разработчикам не надо с этим же интерфейсом париться.
Есть огромное количество сценариев, в которых использование чатботов удобнее для пользователей. Не буду переписывать уже известные материалы, полагаю, вы и сами сможете их найти, когда заинтересуетесь темой. Но начать можно, например, со статьи про
Тем, кто сомневается, что это направление разработки играет какую-то заметную роль на рынке, могу порекомендовать переводной материал про грядущий
Чатботы в Битрикс24
И здесь мы плавно подходим к тому, какое отношение этот тренд имеет к Битрикс24. Ведь что такое Slack, Telegram, What’sUp, Viber и т.д.? Это мессендеры, которые живут «сами по себе».
А в Битрикс24 чаты (как индивидуальные, так и групповые) – это часть намного более сложной экосистемы, один из основных каналов коммуникации пользователей, полностью интегрированный с другими бизнес-инструментами. И в этом контексте использование чатботов открывает значительно более интересные перспективы для бизнес-пользователей, поскольку Битрикс24 (в браузере, десктоп-приложении и мобильном аппе) уже сейчас – основное рабочее место для большого количества компаний.
Очень просто написать бота, который, например, будет сообщать в чат нужным пользователям срочную информацию о показателях внутренней учетной системы, интегрированной с Битрикс24. Можно написать чатбота, который будет помогать курьерам удобно обрабатывать заказы на основании сделок CRM Битрикс24 на мобильном устройстве прямо в мессенджере – и не придется писать для них отдельное мобильное приложение.
Разработка чатбота в Битрикс24 – это очень перспективный вариант быстрой и удобной автоматизации специфических бизнес-процессов. Удобной, поскольку, как мы уже выяснили, получение информации и управление через мессенджер – это то, что сейчас предпочитает массовый пользователь. А быстрой – потому что разработка чатбота для Битрикс24 это довольно простая штука.
Давайте напишем такого бота прямо сейчас!
Самое главное
Прежде всего, чатбот в терминах Битрикс24 – это не отдельный тип приложений, и принципы разработки, в общем-то, укладываются в общие правила. Будем считать, что вы знакомы с созданием приложений для Битрикс24, чтобы сейчас не останавливаться на базовых вещах. Тем, кто еще такой разработкой не занимался, давно пора посмотреть наш
По отношению к материалам курса было сделано одно небольшое изменение – теперь есть возможность указать отдельный скрипт установки для приложений, которые используют только REST API и не встраиваются в интерфейс Б24. Это сделано для упрощения регистрации ботов в системе, хотя никто не запрещает пользоваться этим механизмом и для установки «обычных внешних приложений».
Вернемся к чатботам. Основное, что нам надо про них понимать – это то, что их логика обычно строится на реагировании на некие действия пользователя и системы. И у нас есть 4-е события, которые полностью покрывают необходимый спектр реакций:
Событие: ONAPPINSTALL
Когда происходит: При установке приложения с чатботом
Что получает обработчик:
[data] => Array( [LANGUAGE_ID] - базовый язык портала [VERSION] = 1 - версия приложения ) [auth] => Array( [access_token] => lh8ze36o8ulgrljbyscr36c7ay5sinva // ключ для отправки запросов к REST-сервису [scope] => imbot // разрешенные уровни доступа [domain] => b24.hazz // домен портала Битрикс24 на который было установлено приложение [application_token] => c917d38f6bdb84e9d9e0bfe9d585be73 // токен приложения, поможет вам "отбивать" лишние запросы на обработчик события, это поле есть во всех событиях [expires_in] => 3600 // время истечения токена, после которого нужно будет запросить новый [member_id] => d41d8cd98f00b204e9800998ecf8427e // уникальный идентификатор портала, потребуется для продления авторизации [refresh_token] => 5f1ih5tsnsb11sc5heg3kp4ywqnjhd09 // ключ для продления авторизации ) |
Событие: ONIMBOTJOINCHAT
Когда происходит: После приглашения бота «к разговору», то есть, либо при вызове бота пользователем в индивидуальном чате, либо при подключении бота к групповому чату
Что получает обработчик:
[BOT] => Array // Массив кодов ботов, которым предназначено событие ( [39] => Array // Параметры для авторизации под ботом, для выполнения действий ( [domain] => b24.hazz [member_id] => d41d8cd98f00b204e9800998ecf8427e [application_token] => a63b44dc03a2158cb140c71d3f632a41 [bot_id] => 39 [bot_code] => newbot ) ) [PARAMS] => Array ( [DIALOG_ID] => 1 // идентифкатор диалога [BOT_ID] => 39 // Идентификатор бота [CHAT_TYPE] => P // Тип сообщения и чата, может быть P (чат один-на-один), C (с ограниченным кол-во участников), O (публичный чат) [USER_ID] => 1 // идентификатор пользователя (для чата один-на-один открываший бота, для групповых чатов пригласивший бота) [LANGUAGE] => RU // идентификатор языка портала по умолчанию ) [USER] => Array // Массив данных пользователя, может быть пустым если ID = 0 ( [ID] => 1 // идентификатор пользователя [NAME] => Евгений Шеленков // Имя и фамилия пользователя [FIRST_NAME] => Евгений // Имя пользователя [LAST_NAME] => Шеленков // Фамилия пользователя [WORK_POSITION] => // Занимаемая должность [GENDER] => M // Пол, может быть либо M (мужской) и F (женский) ) |
Событие: ONIMBOTMESSAGEADD
Когда происходит: После отправки сообщения от пользователя к боту (в групповом чате, при явном упоминании бота)
Что получает обработчик:
[BOT] => Array // Массив кодов ботов, которым предназначено сообщение ( [39] => Array // Параметры для авторизации под ботом, для выполнения действий ( [domain] => b24.hazz [member_id] => d41d8cd98f00b204e9800998ecf8427e [application_token] => a63b44dc03a2158cb140c71d3f632a41 [bot_id] => 39 [bot_code] => newbot ) ) [PARAMS] => Array // Массив данных сообщения ( [DIALOG_ID] => 1 // идентифкатор диалога [CHAT_TYPE] => P // Тип сообщения и чата, может быть P (чат один-на-один), C (с ограниченным кол-во участников), O (публичный чат) [MESSAGE_ID] => 392 // Идентификатор сообщения [MESSAGE] => test3 // Сообщение [MESSAGE_ORIGINAL] => [USER=39]NewBot[/USER] test3 // оригинальное сообщение с BB-кодом бота (параметр доступен только в групповых чатах) [FROM_USER_ID] => 1 // идентификатор пользователя отправившего сообщение [TO_USER_ID] => 1 // идентификатор чат бота (параметр доступн только в чатах один-на-один) [TO_CHAT_ID] => 6 // идентификатор чата (параметр доступен только в групповых чатах) [LANGUAGE] => RU // идентификатор языка портала по умолчанию ) [USER] => Array // Массив данных автора сообщения, может быть пустым если ID = 0 ( [ID] => 1 // идентификатор пользователя [NAME] => Евгений Шеленков // Имя и фамилия пользователя [FIRST_NAME] => Евгений // Имя пользователя [LAST_NAME] => Шеленков // Фамилия пользователя [WORK_POSITION] => // Занимаемая должность [GENDER] => M // Пол, может быть либо M (мужской) и F (женский) ) |
Когда происходит: После удаления приложения. Событие вызывается параллельно с OnAppUninstall
Что получает обработчик:
ONIMBOTDELETE
После удаления приложения. Событие вызывается параллельно с OnAppUninstall
[BOT_ID] => 39 // Идентификатор бота [BOT_CODE] => giphy // Код бота |
Иными словами, мы должны написать обработчики указанных событий, чтобы реализовать простую логику:
- Зарегистрировать чатбота на портале пользователя при установке
- Вывести приветствие-справку от имени бота в момент приглашения бота в чат
- Научиться анализировать текст сообщения от пользователя и что-то отправлять в ответ, причем под анализом мы подразумеваем простой «разбор командной строки», а не лексический разбор естественного языка.
Метод: imbot.register
Что делает: Регистрирует бот на портале
Какие параметры принимает:
Array( 'CODE' => 'newbot', // строковой идентификатор бота, уникальный в рамках вашего приложения (обяз.) 'TYPE' => 'H', // Тип бота, B - бот, ответы поступают сразу, H - человек, ответы поступаю с задержкой от 2х до 10 секунд 'EVENT_MESSAGE_ADD' => 'http://www.hazz/chatApi/event.php', // Ссылка на обработчик события отправки сообщения боту (обяз.) 'EVENT_WELCOME_MESSAGE' => 'http://www.hazz/chatApi/event.php', // Ссылка на обработчик события открытия диалога с ботом или приглашения его в групповой чат (обяз.) 'EVENT_BOT_DELETE' => 'http://www.hazz/chatApi/event.php', // Ссылка на обработчик события удаление бота со стороны клиента (обяз.) 'PROPERTIES' => Array( // Личные данные чат-бота (обяз.) 'NAME' => 'NewBot', // Имя бота (обязательное одно из полей NAME или LAST_NAME) 'LAST_NAME' => '', // Фамилия бота (обязательное одно из полей NAME или LAST_NAME) 'COLOR' => 'GREEN', // Цвет бота для мобильного приложения RED, GREEN, MINT, LIGHT_BLUE, DARK_BLUE, PURPLE, AQUA, PINK, LIME, BROWN, AZURE, KHAKI, SAND, MARENGO, GRAY, GRAPHITE 'EMAIL' => 'test@test.ru', // Емейл для связи 'PERSONAL_BIRTHDAY' => '2016-03-11', // День рождения в формате YYYY-mm-dd 'WORK_POSITION' => 'Мой первый бот', // Занимаемая должность, используется как описание бота 'PERSONAL_WWW' => 'http://test.ru', // Ссылка на сайт 'PERSONAL_GENDER' => 'F', // Пол бота, допустимые значения M - мужской, F - женский, пусто если не требуется указывать 'PERSONAL_PHOTO' => '/* base64 image */', // Аватар бота - base64 ) ) |
Метод: imbot.message.add
Что делает: Добавляет в чат сообщение от имени чатбота
Какие параметры принимает:
Array( 'BOT_ID' => 39, // идентификатор бота от которого идет запрос, можно не указывать если бот всего один 'DIALOG_ID' => 1, // идентификатор диалога, это либо USER_ID пользователя, либо chatXX - где XX идентификатор чата, передается в событии ONIMBOTMESSAGEADD и ONIMJOINCHAT 'MESSAGE' => 'answer text' // тест сообщения 'ATTACH' => '' // Вложение, не обязательное поле 'SYSTEM' => 'N' // отображать сообщения в виде системного сообщения, не обязательное поле, по умолчанию 'N' 'URL_PREVIEW' => 'Y' // преобразовывать ссылки в rich-ссылки, не обязательное поле, по умолчанию 'Y' ) |
Очевидно, что в обработчике события ONAPPINSTALL мы вызовем метод imbot.register для того, чтобы добавить чатбота на текущий портал, затем в событии ONIMBOTJOINCHAT воспользуемся методом imbot.message.add для вывода справки о функционале бота, и в обработчике ONIMBOTMESSAGEADD будем отвечать пользователю при помощи того же imbot.message.add. Ничего сложного, согласитесь?
А на самом деле, вы поймете, что все еще проще, когда я добавлю, что вам не придется реализовывать в приложение полноценный OAuth 2.0, поскольку параметры, необходимые для авторизации приходят в обработчики в массиве $_REQUEST.
Готовый пример
В качестве примера я решил написать чатбота, который будет сообщать пользователю о его просроченных задачах. Наш бот будет знать и обрабатывать только одну команду «Что горит». По аналогии всегда можно расширить его функционал, чтобы получать прямо в чат нужные отчеты на основании любых данных в Битрикс24.
Небольшое замечание, коллеги: всем захочется взять готовый пример (я вот так и сделал - взял у Евгения Шеленкова), добавить парочку команд и поделиться этим прекрасным продуктом со всеми, опубликовав решение сразу в Приложениях24. Я вас очень прошу, давайте ответственно подойдем к разработке тиражных ботов и прежде, чем публиковать, научим их чему-то действительно интересному.
<?php /** * Полезный чат-бот c отчетами для bitrix24 */ $appsConfig = array(); $configFileName = '/config_' . trim(str_replace('.', '_', $_REQUEST['auth']['domain'])) . '.php'; if (file_exists(__DIR__ . $configFileName)) { include_once __DIR__ . $configFileName; } // receive event "new message for bot" if ($_REQUEST['event'] == 'ONIMBOTMESSAGEADD') { // check the event - register this application or not if (!isset($appsConfig[$_REQUEST['auth']['application_token']])) { return false; } // response time $arReport = getAnswer($_REQUEST['data']['PARAMS']['MESSAGE'], $_REQUEST['data']['PARAMS']['FROM_USER_ID']); $arReport['attach'][] = array("MESSAGE" => 'Как разберетесь с этими задачами, просто спросите еще раз [send=что горит]Что горит?[/send] и я дам новую сводку!'); // send answer message $result = restCommand('imbot.message.add', array( "DIALOG_ID" => $_REQUEST['data']['PARAMS']['DIALOG_ID'], "MESSAGE" => $arReport['title'] . "\n" . $arReport['report'] . "\n", "ATTACH" => array_merge( $arReport['attach'] ), ), $_REQUEST["auth"]); } // receive event "open private dialog with bot" or "join bot to group chat" else { if ($_REQUEST['event'] == 'ONIMBOTJOINCHAT') { // check the event - register this application or not if (!isset($appsConfig[$_REQUEST['auth']['application_token']])) { return false; } // send help message how to use chat-bot. For private chat and for group chat need send different instructions. $result = restCommand('imbot.message.add', array( 'DIALOG_ID' => $_REQUEST['data']['PARAMS']['DIALOG_ID'], 'MESSAGE' => 'Привет! Я Докладун, докладываю все как есть.', "ATTACH" => array( array('MESSAGE' => '[send=что горит]Что горит?[/send]'), ), ), $_REQUEST["auth"]); } // receive event "delete chat-bot" else { if ($_REQUEST['event'] == 'ONIMBOTDELETE') { // check the event - register this application or not if (!isset($appsConfig[$_REQUEST['auth']['application_token']])) { return false; } // unset application variables unset($appsConfig[$_REQUEST['auth']['application_token']]); // save params saveParams($appsConfig); } // receive event "Application install" else { if ($_REQUEST['event'] == 'ONAPPINSTALL') { // handler for events $handlerBackUrl = ($_SERVER['SERVER_PORT'] == 443 ? 'https' : 'http') . '://' . $_SERVER['SERVER_NAME'] . (in_array($_SERVER['SERVER_PORT'], array(80, 443)) ? '' : ':' . $_SERVER['SERVER_PORT']) . $_SERVER['SCRIPT_NAME']; // If your application supports different localizations // use $_REQUEST['data']['LANGUAGE_ID'] to load correct localization // register new bot $result = restCommand('imbot.register', array( 'CODE' => 'ReportBot', // строковой идентификатор бота, уникальный в рамках вашего приложения (обяз.) 'TYPE' => 'B', // Тип бота, B - бот, ответы поступают сразу, H - человек, ответы поступаю с задержкой от 2х до 10 секунд 'EVENT_MESSAGE_ADD' => $handlerBackUrl, // Ссылка на обработчик события отправки сообщения боту (обяз.) 'EVENT_WELCOME_MESSAGE' => $handlerBackUrl, // Ссылка на обработчик события открытия диалога с ботом или приглашения его в групповой чат (обяз.) 'EVENT_BOT_DELETE' => $handlerBackUrl, // Ссылка на обработчик события удаление бота со стороны клиента (обяз.) 'PROPERTIES' => array( // Личные данные чат-бота (обяз.) 'NAME' => 'Докладун', // Имя бота (обязательное одно из полей NAME или LAST_NAME) 'LAST_NAME' => '', // Фамилия бота (обязательное одно из полей NAME или LAST_NAME) 'COLOR' => 'AQUA', // Цвет бота для мобильного приложения RED, GREEN, MINT, LIGHT_BLUE, DARK_BLUE, PURPLE, AQUA, PINK, LIME, BROWN, AZURE, KHAKI, SAND, MARENGO, GRAY, GRAPHITE 'EMAIL' => 'no@mail.com', // Емейл для связи 'PERSONAL_BIRTHDAY' => '2016-03-23', // День рождения в формате YYYY-mm-dd 'WORK_POSITION' => 'Докладываю о делах', // Занимаемая должность, используется как описание бота 'PERSONAL_WWW' => '', // Ссылка на сайт 'PERSONAL_GENDER' => 'M', // Пол бота, допустимые значения M - мужской, F - женский, пусто если не требуется указывать 'PERSONAL_PHOTO' => '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', // Аватар бота - base64 ), ), $_REQUEST["auth"]); // save params $appsConfig[$_REQUEST['auth']['application_token']] = array( 'BOT_ID' => $result['result'], 'LANGUAGE_ID' => $_REQUEST['data']['LANGUAGE_ID'], ); saveParams($appsConfig); // write debug log // writeToLog($result, 'ReportBot register'); } } } } /** * Save application configuration. * * @param $params * * @return bool */ function saveParams($params) { $config = "<?php\n"; $config .= "\$appsConfig = " . var_export($params, true) . ";\n"; $config .= "?>"; $configFileName = '/config_' . trim(str_replace('.', '_', $_REQUEST['auth']['domain'])) . '.php'; file_put_contents(__DIR__ . $configFileName, $config); return true; } /** * Send rest query to Bitrix24. * * @param $method - Rest method, ex: methods * @param array $params - Method params, ex: array() * @param array $auth - Authorize data, ex: array('domain' => 'https://test.bitrix24.com', 'access_token' => '7inpwszbuu8vnwr5jmabqa467rqur7u6') * * @return mixed */ function restCommand($method, array $params = array(), array $auth = array()) { $queryUrl = 'https://' . $auth['domain'] . '/rest/' . $method; $queryData = http_build_query(array_merge($params, array('auth' => $auth['access_token']))); // writeToLog(array('URL' => $queryUrl, 'PARAMS' => array_merge($params, array("auth" => $auth["access_token"]))), 'ReportBot send data'); $curl = curl_init(); curl_setopt_array($curl, array( CURLOPT_POST => 1, CURLOPT_HEADER => 0, CURLOPT_RETURNTRANSFER => 1, CURLOPT_URL => $queryUrl, CURLOPT_POSTFIELDS => $queryData, )); $result = curl_exec($curl); curl_close($curl); $result = json_decode($result, 1); return $result; } /** * Write data to log file. * * @param mixed $data * @param string $title * * @return bool */ function writeToLog($data, $title = '') { $log = "\n------------------------\n"; $log .= date("Y.m.d G:i:s") . "\n"; $log .= (strlen($title) > 0 ? $title : 'DEBUG') . "\n"; $log .= print_r($data, 1); $log .= "\n------------------------\n"; file_put_contents(__DIR__ . '/imbot.log', $log, FILE_APPEND); return true; } /** * Формируем отчет по команде * * @param string $text строка, которую отправил юзер * @param int $user идентификатор пользователя, который нам написал * * @return array */ function getAnswer($command = '', $user) { switch (strtolower($command)) { case 'что горит': $arResult = b24BadTasks($user); break; default: $arResult = array( 'title' => 'Туплю-с', 'report' => 'Не соображу, что вы хотите узнать. А может вообще не умею...', ); } return $arResult; } function b24BadTasks ($user) { $tasks = restCommand('task.item.list', array( 'ORDER' => array('DEADLINE' => 'desc'), 'FILTER' => array('RESPONSIBLE_ID' => $user, '<DEADLINE' => '2016-03-23'), 'PARAMS' => array(), 'SELECT' => array() ), $_REQUEST["auth"]); if (count($tasks['result']) > 0) { $arTasks = array(); foreach ($tasks['result'] as $id => $arTask) { $arTasks[] = array( 'LINK' => array( 'NAME' => $arTask['TITLE'], 'LINK' => 'https://'.$_REQUEST['auth']['domain'].'/company/personal/user/'.$arTask['RESPONSIBLE_ID'].'/tasks/task/view/'.$arTask['ID'].'/' ) ); $arTasks[] = array( 'DELIMITER' => array( 'SIZE' => 400, 'COLOR' => '#c6c6c6' ) ); } $arReport = array( 'title' => 'Да, кое-какие задачи уже пролетели, например:', 'report' => '', 'attach' => $arTasks ); } else { $arReport = array( 'title' => 'Шикарно работаете!', 'report' => 'Нечем даже огорчить - ни одной просроченной задачи', ); } return $arReport; } |
Вы уже сейчас можете взять этот код, выложить на своем сервере и запустить бота на своем портале, не публикуя его через Приложения24. Для этого в Битрикс24 есть возможность устанавливать локальные приложения.
Идем в раздел левого меню «Приложения» – «Добавить приложение» и выбираем вариант «Для личного пользования».
Указываем название бота, а называться он у нас будет «Докладун», включаем опцию «Приложение использует только API», и даем приложению права доступа на «Создание и управление чат-ботами» (без этих прав приложение не сможет зарегистрировать бота), а также на «Задачи» и «Задачи (расширенные права)» (без этих прав приложение не сможет сформировать отчет по задачам, чтобы сообщить о них через бота пользователю).
Поскольку наш скрипт написан таким образом, что является обработчиком всех событий, то в форме приложения мы укажем обе ссылки на один и тот же URL.
Собственно, уже все. Чудо должно произойти практически сразу – в общем чате появится сообщение о том, что к порталу присоединился новый пользователь: чатбот по имени Докладун.
Мы можем открыть с ним чат, нажать на ссылку «Что горит?» и получить свой список просроченных задач.
Теперь о некоторых нюансах в коде.
При регистрации чатбота в обработчике ONAPPINSTALL Битрикс24 передает нам новый параметр авторизации application_token. Все последующие вызовы обработчиков событий также будут содержать этот ключ, позволяя нам таким нехитрым способом проверять, а действительно ли получили получаем дальнейшие вызовы обработчиков событий вроде ONIMBOTMESSAGEADD от Битрикс24?
Мы сохраняем этот ключ, вызывая saveParams в строке 106, а в дальнейшем проверяем, в частности, в строках 14-16 и 36-38.
Еще один нюанс, на который хотелось бы обратить внимание – это возможность при регистрации бота указать разные URL для обработки разных событий. Именно эти URL прописаны в примере в строках 74-78. В нашем случае мы отдельные адреса не используем, но возможность такая есть.
Саму логику ответов чатбота мы вынесли в метод getAnswer, который получает всего два параметра – целиком весь текст, который напечатал в чат пользователь, и идентификатор этого самого пользователя.
Метод исключительно простой, реагирует он на одну единственную команду “что горит”, получает просроченные задачи текущего пользователя вызывая метод REST API task.item.list (поэтому, если захотите этого чатбота на своем портале потестировать - не забудьте дать права приложению на задачи!). Отчет формируется в виде списка ссылок с разделителем. Здесь можно использовать все богатство возможностей CHAT API, подробности которого описаны в
Обратите внимание на хитрое форматирование с тэгом [send], при помощи которого мы формируем команду для бота, а пользователю не приходится ничего набирать. Есть два варианта - мы можем сразу отослать команду по клику, и мы можем написать за пользователя команду и предложить ему дописать какие-то параметры.
[send=текст]название кнопки[/send] - мгновенно отправляет «текст» боту
[put=подсказка]название кнопки[/put] - вставляет «подсказка» в поле ввода за пользователя, далее, пользователь просто дописывает, что необходимо и может отправлять сообщение боту.
Очень удобная штука, чтобы сделать общение с ботом еще проще. В нашем примере мы как раз и предлагаем пользователю не набирать нашу единственную команду «Что горит», а просто кликнуть по соответствующей ссылке.
Помимо этих тэгов, вы можете использовать для оформления сообщений известные всем BB-коды B, U, I, S и BR.
Пожалуй, для начала более, чем достаточно. Вы можете попробовать написать своих ботов уже сейчас. Подробная документация выйдет в апреле, а описание базовых вещей вы, не откладывая, можете прочитать в соответствующей группе на портале для разработчиков Маркетплейс.
Это открытое коммьюнити, там можно легко
Между прочим, скоро появится поддержка slash-команд, которые позволят вызывать ботов из групповых чатов без явного приглашения в чат и даже позволят обращаться к ботам из комментариев живой ленты! Но об этом – в следующих материалах!
Ждем всех в группе!
А не подскажите, какие еще команды, аналогичные [send=]...[/send], можно использовать?
put, как раз то, что надо.
Если правильно понимаю, то на коробочной версии этого нет? А будет ли?
Права к imbot дал, пробую:
Техподдержка подтвердила это.
И только тогда со созданным чат-ботом можно будет работать через вебхук.
Сергей говорит что вот-вот выкатят обновление
На соседней вкладке открыт авторизованный B24
В результате CURL запроса на
(
[error] => NO_AUTH_FOUND
[error_description] => Wrong authorization data
)
В REQUEST['auth'] все данные есть:
(
[access_token] => кодтокена
[expires] => 1561731034
[expires_in] => 3600
[scope] => imbot
[domain] =>
[server_endpoint] =>
[status] => L
[client_endpoint] =>
[member_id] => a4d5651af4602acc851b00c517caf18a
[user_id] => 1
[refresh_token] => ca9e3d5d003dd92a0035c66800000001000003915b4915547596fff67156c32f44b61b
[application_token] => b2d91fa5c8dfeae566e4b9efa607d81f
)
У меня пока бесплатный тариф - в этом может быть дело? Если нет, то в чем? Хочу разобраться.
Нет, попробовал на рабочем B24 - та же ошибка
В чем может быть дело?
Бот на сообщение не отвечает. Что делать?
удалось решить проблему, если да, то как?