Детальніше про протокол агент

На Хабре вже писали про те, як влаштований Mail.Ru Агент. На даний момент офіційної документації до протоколу у відкритому доступі немає, тому доводиться досліджувати пристрій досвідченим шляхом. У цій статті я розгляну відправлення форматованих текстових повідомлень і створення і відправлення повідомлень в конференцію.

Пара слів про протокол

Повідомлення передаються пакетами певного формату. Перші 44 байта - це заголовок, який виглядає так:

Числа тут передаються в форматі UL, який виглядає як 16 байт, записаних справа наліво. Таким чином, число 10 буде виглядати 00 00 00 0A. Так ми будемо запаковувати в UL:

Текст передається в форматі LPS - рядки із заданою довжиною (довжина задається в вигляді UL). Ми будемо запаковувати в нього таким чином:

Також нам знадобиться упаковувати рядки в LPS в інших кодуваннях:

Текстові повідомлення з форматуванням

Подивимося, як виглядають повідомлення. Поле msg в заголовку не може залишатися порожнім константою 0x1008, в іншому пакет повідомлення такої:

Остання складова пакету - частина повідомлення, пов'язана з форматуванням тексту. Якщо нам не потрібно форматування, rtf_part повинна складатися з пробілу. В такому випадку Mail.Ru Агент, на який прийде це повідомлення, буде використовувати шрифти, встановлені за замовчуванням в агента одержувача.

Якщо ми хочемо послати отформатироване повідомлення, то остання частина пакета повинна бути LPSZ (rtf_part), де:

Останній доданок - колір фону, при отриманні повідомлення вікно чату змінить колір цілком.
rtf для написання «qwerty» виглядає так:

Можна помітити, що перша буква написана одним шрифтом, а решта іншим. Пояснити таку поведінку я не можу, але rtf, згенеровані Mail.Ru Агент, які мені вдалося отримати, виглядали так. rtf, що не володіють такою властивістю, залишаються валідними. Інші параметри (мову, таблиця шрифтів, російська мова) впливають на валідність rtf.

Залишається відзначити, що якщо rtf-частина повідомлення не порожня, вона прийде в повідомленні. Якщо при цьому вказана текстова частина повідомлення (body), то цей текст ми побачимо у спливаючому вікні Mail.Ru Агент.

конференції

Якщо для того, щоб почати чат з іншим контактом, потрібно просто відправити повідомлення, то для того, щоб почати спілкуватися в конференції, потрібно зробити кілька присідань.

створення конференції

Кожна конференція має своє унікальне ім'я, яке виглядає як [email protected], яке ми отримуємо від сервера у відповідь на таке повідомлення:

У відповідь на це повідомлення приходить повідомлення від сервера з тим же номером в хедері і айдішніком. Після отримання відповіді від сервера можна посилати повідомлення в конференцію.

Відправлення повідомлень в конференцію

Щоб відправити повідомлення в конференцію, потрібно відправити два пакети. Перший пакет не несе смислового навантаження, він підготовчий:

А тепер, безпосередньо, повідомлення:

Воно виглядає як звичайне повідомлення з одержувачем-айдішніком конференції.

Вихід з конференції

Чи не вдалося з'ясувати, як отримати абсолютний номер конференції, але експериментально з'ясовано, що ідентифікація чату відбувається не по ньому. Тому можна вказати будь-яке розумне число, наприклад, 42.

Моє дослідження далеко від того, щоб бути повним, тому буду рада будь-яким виправлень і доповнень.

Схожі статті