Подборка методов для работы с модулем «Веб-мессенджер» (im) коробочной версии «Битрикс24». Для работы с методами обязательно подключение модуля: CModule::IncludeModule('im');
$pic = $_SERVER['DOCUMENT_ROOT'] . '/test.jpg'; $avatarId = \CFile::SaveFile(\CFile::MakeFileArray($pic), 'im'); $chat = new \CIMChat; $chat->Add(array( 'TITLE' => 'Тестовый чат', 'DESCRIPTION' => 'Описание тестового чата', 'COLOR' => 'RED',//цвет 'TYPE' => IM_MESSAGE_OPEN,//тип чата 'AUTHOR_ID' => '1',//владелец чата 'AVATAR_ID' => $avatarId //иконка чата )); //TYPE = IM_MESSAGE_CHAT – закрытый чат //список доступных цветов: \Bitrix\Im\Color::getSafeColors()
$change = CIMChat::SetOwner($chatID, $userID, $checkPermission);
Подробный мануал представлен в этой статье.
\Bitrix\Im\Model\ChatTable::update($chatID, array('TITLE' => $new_name));
Обратите внимание на возвращаемый методом массив данных, так как он позволяет решить сразу несколько задач:
userInChat)mute_list)avatar)owner)name)extranet)Пример вызова метода:
$ChatData = CIMChat::GetChatData(array('ID'=>$chatID));
Метод CIMChat::AddUser достаточно специфичный, подробности — в документации.
Для добавления пользователя в чат без системного уведомления о добавлении нового пользователя:
$chat = new \CIMChat(0); $chat->AddUser($chatID, $userID, null, true, true);
В данном примере пользователь добавляется без доступа к истории сообщений чата. За это отвечает третий параметр, который задан как null. Для добавления пользователя в чат с доступом к старой переписке — этот параметр нужно убрать.
Для добавления пользователя с системным комментарием вида «Иванов Иван присоединился к чату»:
$chat = new \CIMChat(0); $chat->AddUser($chatID, $userID, null, false, false);
Используем метод CIMChat::DeleteUser. Ссылка на документацию.
$chat = new \CIMChat(); $chat->DeleteUser($chatId, $userID, false, true, true);
Данное решение будет полезно для того, чтобы добавить ссылку на определенный чат в документацию или Базу Знаний вашего портала. Все просто:
<a href="/online/?IM_DIALOG=chat[CHAT_ID]">Открыть чат</a>
где [CHAT_ID] — уникальный идентификатор чата.
/*сообщения, старше 10-ти дней*/
$days = 10;
$dateCreate = new DateTime();
$dateCreate->sub(new DateInterval("P".$days."D"));
$filter = [
/*ID чата из которого получать сообщения*/
"=CHAT_ID" => $chatID;
/*выборка сообщений старше указанного кол-ва дней*/
"<=DATE_CREATE" => \Bitrix\Main\Type\DateTime::createFromUserTime(date("d.m.Y H:i:s", $dateCreate->getTimestamp()));
];
/*сколько сообщений получать*/
$limit = 50;
$params = Array(
'filter' => $filter,
'limit' => $limit,
'order' => Array('ID' => 'ASC'),
);
$message_list = \Bitrix\Im\Model\MessageTable::getList($params);
while($message = $message_list->Fetch()){
//вывод данных
}
Массив $message будет содержать выборку списка сообщений чата.
Рассмотрим несколько методов для работы с сообщениями по их уникальному идентификатору. ID сообщения можно посмотреть через исходный код страницы:

$message = CIMMessenger::GetById($id);
Результат выполнения:
Array
(
[ID] => 26066083
[CHAT_ID] => 12345
[AUTHOR_ID] => 1
[MESSAGE] => Текст тестового сообщения.
[MESSAGE_OUT] =>
[DATE_CREATE] => 1620737943
[EMAIL_TEMPLATE] =>
[NOTIFY_TYPE] => 0
[NOTIFY_MODULE] => im
[NOTIFY_EVENT] => private
[NOTIFY_TAG] =>
[NOTIFY_SUB_TAG] =>
[NOTIFY_TITLE] =>
[NOTIFY_BUTTONS] =>
[NOTIFY_READ] => N
[IMPORT_ID] =>
[MESSAGE_TYPE] => P
[CHAT_AUTHOR_ID] => 1
[CHAT_ENTITY_TYPE] =>
[CHAT_ENTITY_ID] =>
[CHAT_PARENT_ID] => 0
[CHAT_PARENT_MID] => 0
[CHAT_ENTITY_DATA_1] =>
[CHAT_ENTITY_DATA_2] =>
[CHAT_ENTITY_DATA_3] =>
[PARAMS] => Array
(
)
)
Стоит обратить внимание на параметры функции:
$id — идентификатор редактируемого сообщения$text — новый текст сообщения$urlPreview — показывать превью ссылок$editFlag — показывать что сообщение было отредактировано$userId — идентификатор пользователя (автора)Если в качестве $text передать пустое значение, то это будет равносильно удалению сообщения. Однако, это не совсем полноценное удаление, так как в чате останутся следы в виде фразы «Это сообщение было удалено».
Для редактирования сообщения других пользователей обязательно передавать ID автора сообщения в параметре$userId .
Пример вызова метода:
$edit_message = CIMMessenger::Update($id, "Текст сообщения", false, false, $userId);
Разберем параметры:
$id — идентификатор удаляемого сообщения$userId — идентификатор пользователя (автора)$completeDelete — полное удаление / замена на сообщение-заглушкуЗдесь все по аналогии с редактированием сообщения, если сообщение нужно удалить полностью, то третьим параметром передаем значение true. Если передать false, то будет выполнена замена текста сообщения на «Это сообщение было удалено». Исходный код метода.
Пример вызова:
$delete_message = CIMMessenger::Delete($id, $userID, true);
Есть и альтернативный вариант, в котором требуется указать только идентификатор сообщения:
$delete_message = \Bitrix\Im\Model\MessageTable::delete($id);
Сообщение в чат от имени пользователя:
$ar = Array( "TO_CHAT_ID" => 21441, // ID чата "FROM_USER_ID" => 1, // ID пользователя состоящего в чате "MESSAGE" => "Сообщение от пользователя", // Произвольный текст ); CIMChat::AddMessage($ar);
Отправка системного уведомления в чат:
$ar = Array( "TO_CHAT_ID" => 21441, // ID чата "FROM_USER_ID" => 0, "SYSTEM" => Y, "MESSAGE" => "Системное сообщение", // Произвольный текст ); CIMChat::AddMessage($ar);
Ошибка вылазить при добавлении пользователя:
Class 'Bitrix\Im\chatTable' not found (0)
Убедитесь, что в начале скрипта выполнено подключение модуля IM:
\Bitrix\Main\Loader::includeModule('im');Добрый день.
Подскажите пожалуйста, как удалить сообщение методом $delete_message = CIMMessenger::Delete ($id, $userID, true);
Как метод понимает из какого чата удалять?
Добрый день. Методу не нужно этого понимать. Нумерация комментариев «сквозная». У каждого сообщения уникальный идентификатор. Потому нет необходимости указывать ID чата.
Подскажите как прикрепить чат к сущности CRM?
Здравствуйте.
Не сталкивался с такой задачей, нужно разбираться.
Добрый день, а как это сделать в облаке? Возможно ли такое?
Добрый день. По идее в облаке это все тоже реализуемо, но через REST API. Документация тут. Готовых примеров у меня нет, т.к. не сталкивался.
У вас есть метод в статье $chat->Add а есть возможность получить ID только что созданного чата?
Метод возвращает ID созданного чата.
Для этого сохраните значение в виде переменной. А после выведите его.
$res = $chat->Add(....); print_r($res);спасибо, а есть способ вставить ссылку в message? при попытке вставить тег a он выводится как текст
Нужно использовать не html-теги, а BB-коды.
[URL=https://www.site.ru/]Ссылка[/URL]спасибо, я наверно вас уже замучил но возник ещё один вопрос. Я написал функционал который работает, но работает он только если его вызывает авторизованный пользователь, если исполняемый файл вызван сторонним сервисом то создание чата не происходит, причём сам запрос проходит и данные тоже, можно ли это как-то обойти?
Скорее всего при вызове вашего скрипта он не выполняется т.к. его блокирует страница авторизации. Проверить это можно обратившись к скрипту через браузер, в котором нет авторизации на портале.
Если так, то самый просто вариант решения:
1. Обратите внимание, что в корне портала есть директория /pub/ (это стандартная папке, она уже должна быть). Внутри нее можно создать свою папку, например, /pub/script/ и разместить там свой скрипт.
2. Не используете в таких скриптах подключение стандартного header/footer.php. Вместо этого используете prolog_before.php.
require($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/main/include/prolog_before.php");Есть и более правильные пути решения, которые позволяют размещать подобные скрипты в других директория, но объяснять это я буду долго.
Да при написании одного скрипта я сталкивался с такой проблемой, но проблема в том что при запросе авторизации он скорее всего прервал бы выполнение моего скрипта, у меня прописаны такие заголовки
define («NO_KEEP_STATISTIC», true);
define («NOT_CHECK_PERMISSIONS», true);
define ('BX_NO_ACCELERATOR_RESET', true);
define ('CHK_EVENT', true);
define ('BX_WITH_ON_AFTER_EPILOG', true);
require ($_SERVER["DOCUMENT_ROOT"] . «/bitrix/modules/main/include/prolog_before.php»);
параметр define («NOT_CHECK_PERMISSIONS», true)
как раз должен отрубать проверку авторизации,
в этом у меня и загвоздка, такое ощущение что создание чата требует авторизацию
Тогда идей нет. Видимо есть нюансы с которыми я не сталкивался. Надо разбираться.
Подскажите, а возможно ли создать тег для чата? И затем найти чаты по этому тегу?
Не сталкивался с подобными задачами.