ktalk-bot — библиотека с реализацией на Rust для работы с KTalk(Jitsi-подобным клиентом конференций).
Проект использует:
PyO3для Python APInapi-rsдля Node.js / TypeScript APImaturinдля сборки и публикации- Rust-код для сетевой логики, парсинга и внутренних engine-объектов
На текущий момент библиотека предоставляет:
- создание внутреннего engine из строки
Cookie - обновление cookies и проверку авторизации
- чтение истории конференций
- подключение к комнате на ограниченное время
- запись замеченных участников во время сессии
- отправку сообщений в чат комнаты
Текущее ограничение:
- полноценная публикация аудио в микрофонный канал пока не реализована
Ниже приведен практический roadmap развития ktalk-bot как headless-клиента для KTalk / Jitsi-подобной платформы.
Цель:
- сделать текущее подключение к комнате, авторизацию и сетевую оркестрацию предсказуемыми и тестируемыми
Задачи:
- довести до высокой точности HTTP + system websocket + XMPP parity
- подтвердить реальный протокол отправки сообщений в чат по захваченным пакетам
- добавить корректный lifecycle:
join,keepalive,leave,disconnect - добавить retry/reconnect стратегию
- улучшить диагностические сообщения и wire-level логирование
- расширить fixture-based тесты по захваченным трафикам
Цель:
- превратить библиотеку в пригодный для автоматизации headless-клиент
Задачи:
- получение входящих сообщений чата
- поток событий из engine:
joined,participant_seen,chat_message,disconnected,error - снимки состояния комнаты
- работа с несколькими комнатами
- CLI-обертка поверх библиотеки
Цель:
- ускорить исследование протокола и поддержку новых инстансов KTalk
Задачи:
- встроенный экспорт нормализованных trace-событий
- diff между браузерным trace и trace из headless engine
- обнаружение capability / совместимости разных
*.ktalk.ru - накопление библиотеки fixture-захватов
Цель:
- расширить возможности headless-клиента beyond simple join
Задачи:
- история чата и входящие сообщения
- аналитика присутствия
- таймлайн участников
- данные о комнате и ресурсах
- дополнительные room-level API, если они доступны на сервере
Цель:
- собирать и анализировать медиа-связанные данные без полной публикации потока
Задачи:
- media/session stats
- Jingle/session metadata
- active speaker / participant activity heuristics
- сетевые метрики качества
Цель:
- превратить
ktalk-botиз headless control client в media-capable client
Задачи:
- полноценный Jingle flow
- ICE/DTLS/SRTP
- публикация Opus audio
- инъекция аудио в микрофонный канал
- возможно, в будущем, video/screen-share
Это самая сложная часть roadmap и должна разрабатываться как отдельный слой поверх уже стабильного headless-клиента.
- Надежность текущего протокольного слоя
- Входящие события и входящий чат
- Состояние комнаты и аналитика участников
- Trace / reverse-engineering tooling
- Media stats
- Полноценный media publishing
Для разработки:
maturin developДля обычной сборки wheel:
maturin build --releaseДля Node.js / TypeScript:
npm install ktalk-botПакет включает prebuilt native binaries для linux-x64, darwin-x64 и win32-x64. На неподдерживаемой платформе установка пытается собрать addon из исходников через локальный Rust toolchain.
Публичный Python API построен вокруг black-box engine:
import ktalk_bot
client = ktalk_bot.create_engine(
"ngtoken=...; kontur_ngtoken=..."
)Можно создать объект и напрямую:
import ktalk_bot
client = ktalk_bot.KTalkClient(
"ngtoken=...; kontur_ngtoken=..."
)import { create_engine, KTalkClient } from 'ktalk-bot'
const client = create_engine('ngtoken=...; kontur_ngtoken=...')
const history = await client.get_history(2, 25)
console.log(history[0]?.room_name)profile = client.renew_cookies()
print(profile["user_id"])
print(profile["first_name"], profile["last_name"])history = client.get_history(max_pages=2, page_size=25)
for item in history:
print(item["title"], item["room_name"])report = client.join_room(
"https://centraluniversity.ktalk.ru/ewwv291ipuud",
duration_seconds=15,
)
print(report["joined"])
print(report["participants"])participants = client.record_participants(
"https://centraluniversity.ktalk.ru/ewwv291ipuud",
duration_seconds=15,
)client.send_chat_message(
"https://centraluniversity.ktalk.ru/ewwv291ipuud",
"Привет из ktalk-bot",
)Возвращает:
{
"user_id": str,
"first_name": str,
"last_name": str,
}Возвращает список словарей:
[
{
"key": str | None,
"room_name": str,
"title": str,
"start_time": str | None,
"end_time": str | None,
"participants_count": int,
"participants": list[str],
"participant_details": list[dict[str, str]],
"has_recording": bool,
"recording_id": str | None,
"recording_url": str | None,
"recording": dict[str, str] | None,
}
]Возвращает:
{
"room_name": str,
"conference_id": str,
"joined": bool,
"participants": [
{
"occupant_id": str,
"display_name": str,
"user_id": str | None,
}
],
}Python-методы снабжены встроенной документацией и сигнатурами. Например:
import ktalk_bot
help(ktalk_bot.create_engine)
help(ktalk_bot.KTalkClient)
help(ktalk_bot.KTalkClient.get_history)Локальная сборка Node addon:
npm run build:nativeУпаковать npm tarball:
npm run pack:npmЗапустить Node smoke test:
npm run test:nodeДля релиза npm должны быть настроены секреты GitHub Actions:
NPM_TOKENGITHUB_TOKEN
Релизный поток:
git tag vX.Y.Z
git push origin vX.Y.ZWorkflow publish-npm.yml:
- собирает
.nodebinaries дляlinux-x64,darwin-x64,win32-x64 - прикладывает их к GitHub Release
- публикует npm package
ktalk-bot
Ожидаемая сигнатура для функции создания клиента:
create_engine(cookie_header: str, base_url: str = "https://centraluniversity.ktalk.ru", room_link: str | None = None, session_token: str | None = None) -> KTalkClientПолезные команды:
cargo test
maturin develop
.venv/bin/python -m pytest pytestsВ репозитории есть CI для сборки wheel/sdist и публикации на PyPI.
Также доступен локальный сценарий:
scripts/release.sh build
scripts/release.sh publish
scripts/release.sh releaseПодробные правила и текущие цели разработки описаны в CONTRIBUTING.md.