Как за один Хакатон мы вживили ICQ в Битрикс24

Привет! Меня зовут Ришат Кадыров, я разработчик в Битрикс24.
В июле 2026 года мы с коллегами участвовали в Хакатоне. Для проекта решили вспомнить юность и подключить к ICQ наши рабочие чаты в Битрикс-порталах.
Главное требование звучало так: никаких ботов-посредников, через которых будет происходить общение. Один сотрудник запускает настоящий старый ICQ-клиент. Его коллеги продолжают пользоваться обычным Битрикс24 в браузере или приложении. Для них переписка выглядит как стандартный личный диалог. Наш Хакатон-проект работает за кадром: это самодельная система, которая заменяет для ICQ-клиента его стандартный сервер и соединяет его с Битрикс24.
В проекте со мной участвовали двое моих коллег: Владимир Калмыков и Надежда Фрелих.
Содержание
Почему и решили воскрешать ICQ и как
Что получилось в итоге
Это прям как аська, только ещё с Битриксом?
Как seek_you видит пользователей
Что здесь за архитектура
Как старая ICQ подключается к проекту
Жизненный цикл сообщения
Как мы до всего этого дошли
Почему и решили воскрешать ICQ и как
Идея родилась из увлечения ретро-тематикой и решения создать ностальгический проект.
Главное требование звучало примерно так: никаких ботов-посредников в чатах, никаких пересылок сообщений. Мы хотели, чтобы выглядело красиво: один сотрудник запускает настоящий старый ICQ-клиент, например ICQ Lite. Его коллеги продолжают пользоваться обычным Битрикс24 в браузере или приложении, и для них переписка выглядит как стандартный личный диалог Битрикс24. Наше приложение работает за кадром и подменяет для аськи привычный сервер ICQ, соединяя его с Битрикс24.
Мы долго перебирали среди разных вариантов реализации: хотели сделать интеграцию с Телеграмом или добавить IRC. Но в итоге остановились на аське как наиболее узнаваемом знаковом символе ранних 2000-х.
Получились такие исходные ограничения:
Использовать настоящий старый ICQ-клиент.
Работать через входящий вебхук Битрикс24, без приложения.
Показывать сообщения нативно от имени пользователя.
Что получилось в итоге
Получился проект seek-you. По сути, это частная ICQ-сеть поверх корпоративного портала Битрикс24. Прототип умеет передавать личные сообщения в обе стороны, синхронизировать статус доступности коллег и искать сотрудников по данным из их профиля. Ещё можно использовать ИИ-помощника BitrixGPT в отдельном чате.
Выглядит это так:

Коллеги в приложении при этом видят обычный чат:

Внутри приложения есть небольшая программа-мост между несовместимыми системами:
Мост получает сообщение из ICQ, определяет адресата и отправляет его в Битрикс24.
Ответ коллеги мост переводит обратно в формат ICQ.
С одной стороны этого переходника работает старый сетевой протокол OSCAR (набор правил, по которым работала историческая ICQ), с другой — современный REST API Битрикс24.
То есть у нас есть seek_you — всё приложение целиком, и мост — его главная рабочая часть. Кроме моста, проекту нужен ICQ-сервер, который принимает подключение старого клиента, и скрипт, который загружает коллег из Битрикс24 в локальный список контактов.
Границы прототипа:
Один вебхук обслуживает одного пользователя.
Обычный режим рассчитан на личные диалоги, а BitrixGPT подключён как специальное исключение.
Файлы передаются текстовыми пометками.
Welcome-страница ICQ Lite пока что осталась экспериментом.
Это прям как аська, только ещё с Битриксом?
Не совсем.
У нашего прототипа есть граница: после подключения к seek_you классический ICQ-клиент может общаться с людьми из Битрикс24, которых проект загрузил в свой каталог. Но пользователей старой публичной ICQ-сети он искать и добавлять не может: серверы ICQ были официально отключены 26 июня 2024 года. Компания VK, владевшая мессенджером, полностью закрыла проект после 28 лет его существования.
Скрипт получает список активных сотрудников из конкретного портала Битрикс24 и создаёт их профили в собственной, локальной ICQ-директории. Поэтому на экране — реальные коллеги, но их ICQ-номера синтетические.

Как seek_you видит пользователей
UIN (уникальный числовой идентификатор пользователя ICQ) здесь вычисляется из ID сотрудника Битрикс24. Так мост всегда понимает, какой ICQ-контакт соответствует какому человеку. Примерно так:
# упрощённый фрагмент sync_directory.py
UIN_OFFSET = 10_000_000
def uin_of(bitrix_id) -> str:
return str(UIN_OFFSET + int(bitrix_id))Разберём, что здесь есть и как работает. UIN_OFFSET хранит число 10 000 000. Функция uin_of получает ID сотрудника из Битрикс24, прибавляет к нему это число и возвращает результат как текст. Например, сотрудник с ID 123 получит локальный UIN 10000123.
Такой сдвиг нужен из-за правил ICQ: маленькие числа вроде 4 или 123 нельзя использовать как корректный UIN. Формула обратима: мост отнимает 10 000 000 и снова получает ID сотрудника Битрикс24.
Отдельный демонстрационный контакт назвали BitrIQ. Это бот-контакт: в ICQ он выглядит как собеседник, но на самом деле за ним стоит корпоративный помощник BitrixGPT. Его добавили, чтобы показать ещё один сценарий моста: из ICQ можно спросить помощника о задачах и получить рабочий ответ. Для атмосферы демо он использует ретро-стиль и добавляет к сообщениям BitrIQ инструкцию отвечать языком раннего рунета, поэтому BitrixGPT пишет «превед» и «аффтар жжот».

Что здесь за архитектура
Наше решение — адаптер между двумя системами.
Внутри есть три самостоятельные части:
Open-oscar-server, открытый готовый проект, написанный на GO. Его мы взяли за основу ICQ-сервера.
Python-мост переводит сообщения и статусы.
Битрикс24 остаётся внешней облачной системой. Эти части можно запускать отдельно, но они образуют одно решение и созданы специально для этой интеграции.

open-oscar-server говорит с ICQ-клиентом на OSCAR и хранит локальные данные в SQLite.
WIM — внутренний HTTP-интерфейс ICQ-сервера для программ. Через него Python-мост может открыть техническую сессию, отправить сообщение от имени контакта, узнать о новом сообщении, изменить статус «онлайн».
К облачному Битрикс24 проект подключается через входящий вебхук — персональный секретный URL, который создаётся в самом Битрикс24 и действует с правами определённого пользователя. Python-мост отправляет на этот URL обычные HTTPS-запросы: например, «добавь сообщение в личный диалог» или «дай последние сообщения». Вебхук даёт мосту доступ к API, но сам не присылает новые сообщения. Поэтому мост каждые три секунды спрашивает Битрикс24, не появилось ли что-то новое.
Для каждого контакта мост поднимает отдельную прокси-сессию. Благодаря этому переписка получается нативной, и Иван в ICQ выглядит Иваном, а не общим ботом-мессенджером.
Как старая ICQ подключается к проекту
Сначала на отдельном компьютере или сервере запускают сам проект: ICQ-сервер и Python-мост. После запуска ICQ-сервер открывает сетевой порт 5190 — «входную дверь», через которую старые ICQ-клиенты обычно связывались со своими серверами.
Затем в настройках старого клиента меняют адрес сервера. Вместо адреса официальной ICQ-сети ему указывают адрес компьютера, на котором работает seek_you. В ICQ Lite мы делали через подмену IP хоста в /etc/hosts — в Win98 это C:\WINDOWS\HOSTS.
После этого ICQ Lite запускается как обычно, но подключается уже к собственному серверу команды. Для человека это выглядит так: он открыл знакомую аську, вошёл под локальным UIN и увидел список коллег, который проект заранее получил из Битрикс24. Сам клиент остаётся настоящей старой ICQ. Меняется только сервер на другом конце соединения.
Жизненный цикл сообщения
Представим, что пользователь пишет Наде из ICQ Lite.
1. ICQ Lite отправляет текст на собственный OSCAR-сервер. Кириллица при этом приходит в старой кодировке CP1251 (правиле, по которому русские буквы превращаются в набор чисел для передачи).
2. Сервер переводит текст из CP1251 в Unicode (современный общий формат символов) и сообщает о новом сообщении Python-мосту через WIM.
3. Мост убирает техническое форматирование RTF (старый формат оформления текста), переводит UIN Нади в её ID Битрикс24 и вызывает im.message.add в Битрикс24.
4. Битрикс24 показывает сообщение в личном диалоге как отправленное владельцем вебхука.
Обратный путь устроен зеркально. Мост каждые три секунды спрашивает Битрикс24 о новых сообщениях методом im.recent.get. Когда Надя отвечает, мост находит её локальный UIN, отправляет текст через её прокси-сессию в ICQ и помечает диалог прочитанным в Битрикс24.
# сокращённый фрагмент bridge.py
# сообщение из ICQ приходит как событие WIM
resp = wim.fetch_events(aimsid, seq, FETCH_TIMEOUT_MS)
text = strip_rtf(message)
b24_call("im.message.add", {"DIALOG_ID": b24_id, "MESSAGE": text})
# сообщение из Битрикс24 мост забирает опросом
items = b24_call("im.recent.get", {}).get("result", [])
deliver(proxy_session, dialog_id, message_id, text)
b24_call("im.dialog.read", {"DIALOG_ID": dialog_id})Код работает как диспетчер: fetch_events ждёт новое событие ICQ, im.message.add создаёт сообщение в Битрикс24, im.recent.get получает последние сообщения Битрикс24, а deliver отправляет текст обратно в ICQ. Полный код добавляет защиту от дублей, повторное подключение после обрыва сессии и проверку, что сообщение пришло именно от собеседника.
Как мы до всего этого дошли
Работа началась с самого короткого вертикального среза: Python-скрипт отправил сообщение в Битрикс24 через вебхук и смог прочитать ответ. После этого у нас появился доказанный маршрут данных.
Затем начались поиски клиента. Мы выбрали ICQ Lite в Windows 98 внутри виртуальной машины.
Следующей проблемой стала кириллица. Старые российские клиенты ICQ передают и ожидают CP1251 (однобайтная кодировка кириллицы), хотя формально могут указывать другой формат текста. Из-за этого «привет» превращался в бессмысленные символы. Исправление оказалось частью Go-сервера: он кодирует исходящий русский текст в CP1251 и умеет распознавать несколько вариантов входящего текста.
// Go: фрагмент wire/snacs.go
charset := uint16(ICBMMessageEncodingASCII)
payload := []byte(text)
if !isASCIIString(text) {
payload = encodeCP1251(text)
}Код проверяет, есть ли в сообщении символы за пределами обычного английского ASCII. Если есть, например русские буквы, функция encodeCP1251 переводит текст в формат, который корректно прочитает ICQ Lite.
Последняя заметная проблема вошла в наши дневники событий как «белая ромашка». Сообщения уже могли ходить, но клиент рисовал контакты офлайн. Причина оказалась в capabilities (служебных признаках возможностей клиента). Обычный ICQ-клиент отправляет их при входе, а техническая прокси-сессия — нет. Мы добавили стандартный набор признаков на стороне сервера, чтобы старый клиент видел контакт как живой.
BitrIQ появился уже после того, как заработал базовый мост. В Битрикс24 можно отдельно открыть обычный чат BitrixGPT и написать туда напрямую, но ретро-инструкция подмешивается только к сообщениям, которые пришли из ICQ через мост.
Что мы извлекли из этого опыта
Кроме того, что это был интересный экспериментальный проекта, хочу сделать небольшое предупреждение. Ни в коем случае не используйте это на проде, так как сообщения не шифруются. Всё устарело: везде костыли и велосипеды. Раньше было хуже :)
KioskNews shows a cleaned-up reading view extracted from the publisher’s page — the original always lives on their site, not ours.