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

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

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

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

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

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

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

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

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

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

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

Останній доданок - колір фону, при отриманні повідомлення вікно чату змінить колір повністю.

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

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

Конференції

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

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

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

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

Надсилання повідомлень до конференції

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

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

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

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

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

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