Версия
2 протокола ICQ
Об этом документе
Если Вы хотите
прочесть оригинальный документ по
второй версии протокола ICQ или
подписаться на рассылку, то воспользуйтесь
следующим линком: http://www.student.nada.kth.se/~d95-mih/icq/
Этот документ -
неофициальная спецификация, основанная
исключительно на исследовании TCP/UDP-пакетов,
и на данных, полученных из списка
рассылки. Это означает, что информация,
представленная здесь возможно частично
неверная (или будет неверной):-)).
Это означает, что если некоторые
части спецификации правильны, то
они могут быть изменены в любой
момент по повелению Божественной
Силы Мирабилис :-))
ICQ-клоны
Со времени опубликования
этого документа было созданно по
крайней мере 2 различных ICQ-клона.
Они еще не дописаны, но по крайней
мере частично функционируют :-)
Для получения подробной информации
по этому вопросу воспользуйтесь
вышеприведенным линком на страничку
Magnus Ihses.
Что было сделано
Самым большим недостатком
этого документа является малое количество
информации по 3-му и 4-му протоколам
ICQ. Эти версии используются ICQ98
(старая бета-версия ICQ98 кажется
использует только 3-й протокол,
более поздняя версия использует
оба этих протокола). Данный документ
описывает только версию 2 протокола
ICQ, которая в последний раз использовалась
в версии ICQ 1.113. Заметьте, что
номера версий ICQ привязаны к Win
NT/95, т.е. я думаю, что Mac и Java
версии ICQ до сих пор используют
вторую версию протокола (поправьте
меня, если я ошибаюсь) Так какие
различия между версией 2 и 3/4 версиями
протокола ICQ? Насколько я знаю,
наибольшее различие состоит в том,
что пакеты в 3/4 версии содержат
некий присоединенный уникальный
код. Я думаю, что это часть схемы
анти-spoof. Мне не удалось выяснить,
как этот код сгенерирован, и нуждаюсь
в помощи по этому вопросу. Имеются
также незначительные изменения в
формате пакета. Основная структура
осталась неизменной. То, что этот
документ не описывает 3 и 4 версии
протокола, совсем не означает, что
его нельзя использовать при написании
ICQ-клона. Серверы Мирабилис все
еще поддерживают вторую версию (или
по крайней мере поддерживали, когда
я проверял это). Можно предположить,
что рано или поздно поддержка исчезнет,
как например теперь не используется
первая версия протокола ICQ. Кроме
того, есть некоторые поля в пакетах,
назначения которых я выяснить не
смог. И, в заключение в этом документе
не описаны такие элементы ICQ, как
передача файлов и чат.
Введение
Интерактивная связь
между клиентами выполняется через
прямое TCP-соединение. Все другие
связи осуществляются при помощи
UDP-пакетов, посланных на ICQ-сервер.
Получение UDP-пакета должно быть
подтверждено (квитировано) получателем.
Если подтверждение не получено,
то в течении 10 секунд будет выполнена
повторная ретрансляция. После 6
неудачных попыток будет послано
B_MESSAGE_ASK сообщение. Вся процедура
повторяется 2 раза. И если оба раза
не будет ответа, то принимается
что пользователь в офф-лайне.
Прежде чем устанавливать
любой вид связи, клиент должен залогиниться
на сервер. Во время процесса логина
клиент засылает на сервер информацию
о себе, включающую IP-адрес, TCP-порт,
выделенный под ICQ, пароль и свой
контакт лист. С этого момента принимается,
что клиент присоединен к серверу
и он теперь будет посылать на него
сообщения-подтверждения того, что
он в он-лайне ("keep alive" сообщения).
По умолчанию, клиент подсоединен
к серверу через UDP-порт 4000.
Такие функции,
как отправка сообщения пользователю,
находящемуся в офф-лайне, получение
информации о пользователе, поиск
пользователя в ICQ Global Directory
и изменение пароля, осуществляются
путем отправки UDP-пакетов на сервер.
Структура этих пакетов проста, они
содержат UIN-адрес отправителя,
специальный код, указывающий серверу,
какую операцию он должен выполнить,
и некоторые параметры.
Когда пользователь
отправляет сообщение, URL или что-либо
иное пользователю, находящемуся
в он-лайне, между этими пользователями
устанавливается TCP-соединение,
формат отправляемых сообщений будет
схожий (но не идентичный) с форматом,
использующимся при UDP-передаче.
После того, как сообщение отправлено,
TCP-соединение не закрывается, а
остается открытым для передачи будущих
сообщений. TCP-соединение будет
закрыто, когда один из пользователей
уйдет в офф-лайн.
Обратите внимание
на то, что все числа в этом документе
представлены в шестнадцатеричной
системе счисления - сначала идет
младший байт, затем старший. Все
строки заканчиваются NULL.
Связь между сервером
и клиентом с использованием UDP
UDP-пакет, посланый
клиентом на сервер имеет следующий
формат:
Длина
|
Содержание
(если установлено)
|
Сигнатура
|
Описание
|
2
байта
|
02
00
|
VERSION
|
Версия
протокола
|
2
байта
|
xx
xx
|
COMMAND
|
Код операции, которую
должен выполнить сервер
|
2
байта
|
xx
xx
|
SEQ_NUM
|
Последовательный
номер
|
4
байта
|
xx
xx xx xx
|
UIN
|
UIN
отправителя
|
переменная
|
|
PARAMETERS
|
Параметры
посылаемой команды
|
UDP-пакет, посланый
сервером клиенту имеет следующий
формат:
Длина
|
Содержание
(если установлено)
|
Сигнатура
|
Описание
|
2
байта
|
02
00
|
VERSION
|
Версия
протокола
|
2
байта
|
xx
xx
|
COMMAND
|
Код операции, которую
выполнил сервер
|
2
байта
|
xx
xx
|
SEQ_NUM
|
Последовательный
номер
|
переменная
|
|
PARAMETERS
|
Параметры
посылаемой команды
|
Поле Version присуствует
во всех ICQ-пакетах, оно идентифицирует
пакет как ICQ-сообщение. SEQ_NUM
содержит уникальный последовательный
номер пакета. Это необходимо, чтобы
избежать неприятностей, если пакет
будет потерян или продублирован
(такое случается). Обычно номер
текущего пакета на 1 больше номера
предыдущего. Отметьте, что сервер
и клиент имеют раздельные системы
нумерования - пакет с SEQ_NUM=3,
посланный с сервера, отличен от
пакета с SEQ_NUM=3, отосланного
клиентом. Сервер начинает счет с
00 00, клиент с 01 00.
Клиент может послать
на сервер следующие команды:
Код |
Название |
Описание |
0A
00 |
ACK |
Подтверждение |
0E
01 |
SEND_MESSAGE |
Послать
сообщение пользователю в
офф-лайн |
E8
03 |
LOGIN |
Залогиниться
на сервер |
06
04 |
CONTACT_LIST |
Проинформировать сервер
о своем контакт листе |
1A
04 |
SEARCH_UIN |
Искать
пользоватея по его UIN |
24
04 |
SEARCH_USER |
Искать
пользователя по его имени
или эл.адресу |
2E
04
|
KEEP_ALIVE
|
Послать
сообщение-индикатор, что
отправитель в он-лайне
|
38
04 |
SEND_TEXT_CODE |
Послать
специальное сообщение на
сервер как текст |
4C
04 |
LOGIN_1 |
Посылается
во время логина |
60
04 |
INFO_REQ |
Запросить
основную информацию о пользователе |
6A
04 |
EXT_INFO_REQ |
Запросить
расширенную информацию о
пользователе |
9C
04 |
CHANGE_PASSWORD |
Сменить
пароль пользователя |
D8
04 |
STATUS_CHANGE |
Сменить
он-лайн статус (Away и др.) |
28
05 |
LOGIN_2 |
Посылается
во время логина |
Еще
детально не описаны (в версии 0.1
этого документа):
0A
05 |
UPDATE_INFO |
Обновить
основную информацию о пользователе |
B0
04 |
UPDATE_EXT_INFO |
Обновить
расширенную информацию о
пользователе |
3C
05 |
|
Добавить
пользователя в контакт лист |
56
04 |
REQ_ADD_TO_LIST |
Запросить
авторизацию на добавление |
BA
04 |
QUERY_SERVERS |
Спросить
сервер об адресах других
серверов |
C4
04 |
QUERY_ADDONS |
Спросить
сервер об глобально определенных
серверах |
EC
04
|
NEW_USER_1
|
Запросить
разрешение на добавление
нового пользователя
|
FC
03 |
NEW_USER_REG |
Зарегистрировать
нового пользователя |
A6
04 |
NEW_USER_INFO |
Послать
основную информацию о новом
пользователе |
42
04 |
CMD_X1 |
неизвестно |
56
04 |
MSG_TO_NEW_USER |
Послать
сообщение пользователю не
из своего контакт листа |
Следующие команды
посылаются сервером клиенту в ответ
на команду клиента или для оповещения
клиента о каком-либо событии:
Код |
Название |
Описание |
0A
00 |
ACK |
Ответ
на подсоединение к серверу |
5A
00 |
LOGIN_REPLY |
Послать
сообщение пользователю в
офф-лайн |
6E
00 |
USER_ONLINE |
Пользователь
из контакт листа в он-лайне
или сменил свой он-лайн-статус |
78
00 |
USER_OFFLINE |
Потльзователь
из контакт листа ушел в
офф-лайн |
8C
00 |
USER_FOUND |
Искомый
пользователь найден |
DC
00 |
RECEIVE_MESSAGE |
Пока
вы были в офф-лайне вам
было послано сообщение |
A0
00
|
END_OF_SEARCH
|
Окончание
поиска, больше не придет
ни одного пакета USER_FOUND
|
18
01 |
INFO_REPLY |
Возвращает
основную информацию о пользователе |
22
01 |
EXT_INFO_REPLY |
Возвращает
расширенную информацию о
пользователе |
A4
01 |
STATUS_UPDATE |
Пользователь
из контакт листа сменил
свой он-лайн-статус (Away
и т.п) |
Еще
детально не описаны (в версии 0.1
этого документа):
1С
02 |
REPLY_X1 |
неизвестно |
E6
00 |
REPLY_X2 |
неизвестно |
E0
01 |
UPDATE_REPLY |
Подтверждение
об обновлении основной информации
о пользователе |
C8
00 |
UPDATE_EXT_REPLY |
Подтверждение
об обновлении расширенной
информации о пользователе |
46
00 |
NEW_USER_UIN |
Подтверждение
о регистрации нового пользователя |
B4
00 |
NEW_USER_REPLY |
Подтверждение
основной информации о новом
пользователе |
82
00
|
QUERY_REPLY
|
Ответ
на QUERY_SERVERS и QUERY_ADDONS
|
C2
01 |
SYSTEM_MESSAGE |
Системное
сообщение с кнопкой, содержащей
URL |
Рассмотрим UDP-сообщения
более подробно.
Сообщения, посланные
клиентом
ACK
0A 00
Подтверждение.
Параметры отсутствуют.
Примечание!
Порядковый номер в
заголовке пакета содержит порядковый
номер полученного с сервера
пакета (квитанции) |
SEND_MESSAGE
0E 01
Эта команда используется,
чтоб послать сообщение пользователям,
находящимся в off-line.
Параметры
Длина
|
Содержание
|
Сигнатура
|
Описание
|
4
байта
|
xx
xx xx xx
|
RECIEVER_UIN
|
номер
аси пользователя, которому
отсылается сообщение
|
2
байта
|
см.
ниже
|
MESSAGE_TYPE
|
тип
сообщения
|
2
байта
|
xx
xx
|
MESSAGE_LENGTH
|
длина
сообщения, включающего
заключительный NULL-байт
|
переменная
|
xx...00
|
MESSAGE_TEXT
|
текст
сообщения, включающий
заключительный NULL-байт
|
MESSAGE_TYPE может
быть одним из следующих:
Сигнатура |
Значение |
Описание |
MSG_TXT |
01
00 |
Обычное
текстовое сообщение |
MSG_URL |
04
00 |
URL-сообщение,
состоит из 2-х частей, разделенных
0xFE. Первая - описание
URL, вторая - непосредственно
сам URL |
LOGIN
E8 03
Этот пакет используется
для подключения (log) к серверу.
Параметры
Длина
|
Содержание
|
Сигнатура
|
Описание
|
4
байта
|
xx
xx xx xx
|
PORT
|
порт
для TCP-соединения
|
2
байта
|
xx
xx
|
PASS_LENGTH
|
длина
пароля, включающая NULL
|
переменная
|
xx...00
|
PASSWORD
|
строка,
содержащая пароль и заканчивающаяся
NULL
|
4
байта
|
78
00 00 00
|
X1
|
неизвестно
|
4
байта
|
xx
xx xx xx
|
USER_IP
|
IP
|
1
байта
|
04
|
X2
|
неизвестно
|
4
байта
|
xx
xx xx xx
|
STATUS
|
Статус
пользователя, обычно 00
00 00 00
|
4
байта
|
02
00 00 00
|
X3
|
неизвестно
|
2
байта
|
xx
xx
|
LOGIN_SEQ_NUM
|
Последовательный
номер логина
|
4
байта
|
00
00 00 00
|
X4
|
неизвестно
|
4
байта
|
08
00 78 00
|
X5
|
неизвестно
|
CONTACT_LIST
06 04
Эта команда используется
для информирования сервера о своем
контакт листе
Параметры
Длина
|
Содержание
|
Сигнатура
|
Описание
|
2
байта
|
xx
xx
|
NUM_CONTACTS
|
количество
UIN в этом пакете
|
4
байта
|
xx
xx xx xx
|
UIN_1
|
1-й
UIN в вашем контакт листе
|
...
|
...
|
size=1>...
|
...
|
4
байта
|
xx
xx xx xx
|
UIN_n
|
последний
UIN в вашем контакт листе
|
SEARCH_UIN
1A 04
Поиск пользователя
с заданным UIN
Параметры
Длина
|
Содержание
|
Сигнатура
|
Описание
|
2
байта
|
xx
xx
|
SEARCH_SEQ_NUM
|
последовательный
номер (уникальный)
|
4
байта
|
xx
xx xx xx
|
SEARCH_UIN
|
искомый
UIN
|
Ответ с сервера
будет содержать соответствующее
запросу значение SEARCH_SEQ_NUM.
SEARCH_USER
24 04
Поиск пользователя
по его имени или эл. адресу.
Параметры
Длина
|
Содержание
|
Сигнатура
|
Описание
|
2
байта |
xx
xx |
SEARCH_SEQ_NUM |
последовательный
номер |
2
байта
|
xx
xx
|
LENGTH
|
длина
ника (включая NULL)
|
переменная
|
|
NICK_NAME
|
Ник,
заканчивающийся NULL
|
2
байта
|
xx
xx
|
LENGTH
|
длина
имени (включая NULL) |
переменная
|
|
FIRST_NAME
|
Имя,
заканчивающееся NULL
|
2
байта
|
xx
xx
|
LENGTH
|
длина
фамилии (включая NULL)
|
переменная
|
|
LAST_NAME
|
Фамилия,
заканчивающаяся NULL
|
2
байта |
xx
xx
|
LENGTH |
длина
эл.адреса (включая NULL)
|
переменная
|
|
EMAIL |
Эл.
адрес, заканчивающийся
NULL
|
Заметьте, что поля
поиска (NICK_NAME, FIRST_NAME, LAST_NAME,
E_MAIL) могут быть пустыми, но не
все одновременно, хотя бы одно должно
содержать данные. Также отметьте,
что вы можете начинать поиск, когда
заполнено только одно поле EMAIL
(все остальные поля пусты) или поле
Name (но тогда хотя бы одно из остальных
полей должно быть заполнено).
KEEP_ALIVE
2E 04
Эта команда должна
посылаться серверу каждые 2 минуты.
Если она не будет послана, то сервер
примет, что вы находитесь off-line.
Параметров нет.
SEND_TEXT_CODE
38 04
Этот пакет используется
для отправки серверу специальных
команд как текста.
Параметры
Длина
|
Содержание
|
Сигнатура
|
Описание
|
2
байта
|
xx
xx
|
LENGTH
|
длина
текстовой команды, включая
NULL-байт
|
переменная
|
xx..
|
TEXT_CODE
|
текст
кода, заканчивающаяся
NULL
|
2
байта |
xx
xx |
X1 |
неизвестно,
обычно 04 00 или 05 00 |
Возможные значения
TEXT_CODE:
TEXT_CODE |
Описание |
B_USER_DISCONNECTED |
Отсоединиться
от сервера (в этом случае
Х1 должно содержать 05 00) |
B_MESSAGE_ACK |
Сказать
серверу ответить немедленно,
используется, если у вас
проблемы с подключением
|
LOGIN_1
4C 04
Во время логина
посылается неизвестный пакет.
INFO_REQ
60 04
Запрашивает основную
информацию о пользователе.
Длина
|
Содержание
|
Сигнатура
|
Описание
|
2
байта |
xx
xx |
INFO_SEQ_NUM |
Информационный
последовательный номер |
4
байта
|
xx
xx xx xx
|
UIN
|
UIN
пользователя, чье инфо
вы запрашиваете
|
Сервер ответит
INFO_REPLY с тем же INFO_SEQ_NUM
EXT_INFO_REQ
6A 04
Запрашивает расширенную
информацию о пользователе.
Длина
|
Содержание
|
Сигнатура
|
Описание
|
2
байта |
xx
xx |
INFO_SEQ_NUM |
Информационный
последовательный номер |
4
байта
|
xx
xx xx xx
|
UIN
|
UIN
пользователя, чье инфо
вы запрашиваете
|
Сервер ответит
EXT_INFO_REPLY с тем же INFO_SEQ_NUM
CHANGE_PASSWORD
9C 04
Сменить пароль
входа.
Длина
|
Содержание
|
Сигнатура
|
Описание
|
2
байта |
xx
xx |
PASSWORD_SEQ_NUM |
последовательный
номер для смены пароля |
2
байта
|
xx
xx
|
LENGTH
|
длина
нового пароля, включая
NULL
|
переменная |
|
NEW_PASSWORD |
новый
пароль, заканчивающийся
NULL (максимум 8 символов) |
STATUS_CHANGE
D8 04
Изменяет online
статус пользователя (Away, Invisible
и др.)
Параметры
Длина
|
Содержание
|
Сигнатура
|
Описание
|
4
байта
|
xx
xx xx xx
|
STATUS
|
Новый
статус - см.ниже
|
Статусы
Сигнатура
|
Значение |
Описание |
STATUS_ONLINE |
00
00 00 00 |
User
is online |
STATUS_AWAY |
01
00 00 00 |
User
is away |
STATUS_DND |
11
00 00 00 |
Do
Not Disturb |
STATUS_INVISIBLE |
00
01 00 00 |
User
is invisible |
LOGIN_2
28 05
Используется во
время логина
Длина
|
Содержание
|
Сигнатура
|
Описание
|
1
байт
|
00
|
X1
|
неизвестно
|
Сообщения, посланные
сервером
ACK
0A 00
Квитанция на команду,
посланную серверу.
Параметров нет.
Порядковые номера
в заголовке содержат порядковые
номера клиентский подтвержденных
пакетов.
LOGIN_REPLY
5A 00
Этот пакет отсылается
сервером в случае, если он корректно
получил команду LOGIN.
Параметры
Длина
|
Содержание
|
Сигнатура
|
Описание
|
4
байта |
xx
xx xx xx |
USER_UIN
|
UIN
пользователя |
4
байта |
xx
xx xx xx |
USER_IP
|
IP-адрес
пользователя |
2
байта |
xx |
LOGIN_SEQ_NUM
|
последовательный
номер логина |
4
байта
|
01
00 01 00
|
X1
|
неизвестно
|
4
байта
|
xx
00 16 00
|
X2
|
неизвестно
(xx=19 или 18)
|
4
байта
|
8C
00 00 00
|
X3
|
неизвестно
|
4
байта
|
78
00 05 00
|
X4
|
неизвестно
|
6
байт
|
0A
00 05 00 01 00
|
X5
|
неизвестно
|
LOGIN_SEQ_NUM такой
же как и в соответствующем поле
команды LOGIN
USER_ONLINE
6E 00
Пользователь из
вашего контакт листа он-лайн или
изменил свой он-лайн статус
Параметры
Длина
|
Содержание
|
Сигнатура
|
Описание
|
4
байта
|
xx
xx xx xx
|
REMOTE_UIN
|
UIN
пользователя, сменившего
статус
|
4
байта
|
xx
xx xx xx
|
REMOTE_IP
|
IP-адрес
пользователя
|
4
байта
|
xx
xx xx xx
|
REMOTE_PORT
|
TCP-порт,
используемый пользователем
для соединения
|
4
байта
|
xx
xx xx xx
|
REMOTE_REAL_IP
|
реальный
IP-адрес пользователя
|
1
байт
|
04
|
X1
|
неизвестно
|
4
байта
|
xx
xx xx xx
|
STATUS
|
Новый
статус пользователя
|
4
байта
|
02
00 00 00
|
X2
|
неизвестно
|
REMOTE_IP - "внешний"
IP-адрес отдаленного пользователя,
REMOTE_REAL_IP - "внутренний" IP-адрес.
Эти два адреса будут идентичны,
если отдаленный пользователь не
находится за firewall. REMOTE_IP
- "официальный" IP-адрес, который
отображен например в Инфо клиента.
REMOTE_PORT - номер TCP- порта,
используемый, когда клиент хочет
открыть прямое соединение с отдаленным
пользователем.
USER_OFFLINE
78 00
Пользователь из
вашего контакт листа ушел в офф-лайн
Длина
|
Содержание
|
Сигнатура
|
Описание
|
4
байта
|
xx
xx xx xx
|
REMOTE_UIN
|
UIN
пользователя, ушедшего
в офф-лайн
|
USER_FOUND
8C 00
Пользователь, соответствующий
критериям выбора найден. Если было
найдено несколько пользователей,
вы получите пакет для каждого из
них.
Параметры
Длина
|
Содержание
|
Сигнатура
|
Описание
|
2
байта |
xx
xx |
SEARCH_SEQ_NUM |
последовательный
номер поиска |
4
байта |
xx
xx xx xx |
FOUND_UIN |
UIN
найденного пользователя |
2
байта
|
xx
xx
|
LENGTH
|
длина
ника (включая NULL)
|
переменная
|
|
NICK_NAME
|
Ник,
заканчивающийся NULL
|
2
байта
|
xx
xx
|
LENGTH
|
длина
имени (включая NULL) |
переменная
|
|
FIRST_NAME
|
Имя,
заканчивающееся NULL
|
2
байта
|
xx
xx
|
LENGTH
|
длина
фамилии (включая NULL)
|
переменная
|
|
LAST_NAME
|
Фамилия,
заканчивающаяся NULL
|
2
байта |
xx
xx
|
LENGTH |
длина
эл.адреса (включая NULL)
|
переменная
|
|
EMAIL |
Эл.
адрес, заканчивающийся
NULL
|
1
байт |
xx |
AUTHORIZE |
Статус
автороизации пользователя,
см. ниже |
AUTHORIZE может
содержать только 00 или 01. 00 значит,
что клиенту нужно послать запрос
об авторизации, перед тем, как добавить
пользователя в контакт лист, 01
- посылать запрос не надо. Если
не найдено ни одного пользователя,
удовлетворяющего критериям поиска,
будет послано END_OF_SEARCH и пакеты
USER_FOUND больше приходить не будут.
RECEIVE_MESSAGE
DC 00
Этот пакет шлется
вам во время вашего логина на сервер,
если на сервере есть для вас какие-либо
пакеты (так называемые "оффлайн-сообщения")
Длина
|
Содержание
|
Сигнатура
|
Описание
|
4
байта
|
xx
xx xx xx
|
REMOTE_UIN
|
UIN
отправителя
|
2
байта
|
xx
xx
|
YEAR
|
год,
когда было послано сообщение
|
1
байт
|
xx
|
MONTH
|
месяц,
когда было послано сообщение |
1
байт
|
xx
|
DAY
|
день
месяца
|
1
байт
|
xx
|
HOUR
|
час,
когда было послано сообщение
|
1
байт
|
xx
|
MINUTE
|
минута
|
2
байта |
xx
xx |
TYPE |
тип
сообщения, см. ниже |
2
байта |
xx
xx |
LENGTH |
длина
сообщения (включая NULL) |
переменная |
|
MESSAGE |
текст
сообщения |
MESSAGE_TYPE может
иметь одно из следующих значений:
Сигнатура |
Значение |
Описание |
MSG_TXT |
01
00 |
Обычное
текстовое сообщение |
MSG_URL |
04
00 |
URL-сообщение,
состоит из 2-х частей, разделенных
0xFE. Первая - описание
URL |
MSG_USER_ADDED |
0C
00 |
Сообщение
о том, что пользователь
был добавлен в контакт лист.
Состоит из 4 частей, разделенных
0xFE - ник, имя, фамилия,
эл.адрес |
END_OF_SEARCH
A0 00
Пакеты USER_FOUND
больше приходить не будут.
Длина
|
Содержание
|
Сигнатура
|
Описание
|
2
байта
|
xx
xx
|
SEARCH_SEQ_NUM
|
последовательный
номер поиска
|
1
байт |
xx |
MORE_FOUND |
найдено
пользователей больше, чем
выводится на экран |
Если MORE_FOUND
равно 00, то вы получите всех подходящих
пользователей из базы данных. Если
01, то в базе данных очень много
пользователей, удовлетворяющих критериям
поиска, но все они выводится на
экран не будут. Предел - 40 пользователей.
INFO_REPLY
18 01
Возвращает основную
информацию о пользователе.
Параметры
Длина
|
Содержание
|
Сигнатура
|
Описание
|
2
байта |
xx
xx |
INFO_SEQ_NUM |
последовательный
номер |
4
байта |
xx
xx xx xx |
REMOTE_UIN |
UIN
отдаленного пользователя |
2
байта
|
xx
xx
|
LENGTH
|
длина
ника (включая NULL)
|
переменная
|
|
NICK_NAME
|
Ник,
заканчивающийся NULL
|
2
байта
|
xx
xx
|
LENGTH
|
длина
имени (включая NULL) |
переменная
|
|
FIRST_NAME
|
Имя,
заканчивающееся NULL
|
2
байта
|
xx
xx
|
LENGTH
|
длина
фамилии (включая NULL)
|
переменная
|
|
LAST_NAME
|
Фамилия,
заканчивающаяся NULL
|
2
байта |
xx
xx
|
LENGTH |
длина
эл.адреса (включая NULL)
|
переменная
|
|
EMAIL |
Эл.
адрес, заканчивающийся
NULL
|
1
байт |
xx |
AUTHORIZE |
Статус
автороизации пользователя,
см. ниже |
AUTHORIZE может
содержать только 00 или 01. 00 значит,
что клиенту нужно послать запрос
об авторизации, перед тем, как добавить
пользователя в контакт лист, 01
- посылать запрос не надо.
EXT_INFO_REPLY
22 01
Возвращает расширенную
информацию о пользователе.
Параметры
Длина
|
Содержание
|
Сигнатура
|
Описание
|
2
байта |
xx
xx |
INFO_SEQ_NUM |
последовательный
номер |
4
байта |
xx
xx xx xx |
REMOTE_UIN |
UIN
отдаленного пользователя |
2
байта
|
xx
xx
|
LENGTH
|
длина
названия города (включая
NULL)
|
переменная
|
|
CITY
|
Город,
заканчивающийся NULL
|
2
байта
|
xx
xx
|
COUNTRY_CODE
|
код
страны (включая NULL) |
1
байт
|
xx
|
COUNTRY_STATUS
|
Определяет,
установлен ли COUNTRY_CODE
|
2
байта
|
xx
xx
|
LENGTH
|
длина
названия штата(включая
NULL)
|
переменная
|
|
STATE
|
штат
(только для США), заканчивающаяся
NULL
|
2
байта |
xx
xx
|
AGE |
возраст
отдаленного пользователя
|
1
байт
|
xx
|
SEX |
пол
|
2
байта |
xx
xx |
LENGTH |
длина
номера телефона |
переменная |
|
PHONE |
телефон |
2
байта |
xx
xx |
LENGTH |
длина
адреса домашней странички
пользователя (включая NULL) |
переменная |
|
HOME_PAGE |
домашняя
страничка пользователя |
2
байта |
xx
xx |
LENGTH |
длина
About (включая NULL) |
переменная |
|
ABOUT |
Информация,
которую пользователь хочет
сообщить о себе |
Код, используемый
в COUNTRY_CODE - это международный
телефонный префикс, т.е. 01 00 (1)
для США, 2С 00 (44) для Великобритании,
2Е 00 (46) для Швеции и т.д. COUNTRY_STATUS
обычно содержит FE, но если пользователь
не ввел код страны (COUNTRY_CODE
содержит FF FF), то тогда CONTRY_STATUS
будет содержать 9С. Аналогично,
если пользователь не ввел свой возраст,
то поле AGE будет содержать FF FF.
Поле SEX может содержать 3 различных
значения: 00 - не определен, 01-
женский, 02- мужской.
STATUS_UPDATE
A4 01
Пользователь из
контакт листа сменил свой он-лайн-статус
(Away и т.п)
Параметры
Длина
|
Содержание
|
Сигнатура
|
Описание
|
4
байта
|
xx
xx xx xx
|
REMOTE_UIN
|
UIN
пользователя, сменившего
статус
|
4
байта
|
xx
xx xx xx
|
STATUS
|
Новый
статус пользователя
|
Статусы
Сигнатура
|
Значение |
Описание |
STATUS_ONLINE |
00
00 00 00 |
User
is online |
STATUS_AWAY |
01
00 00 00 |
User
is away |
STATUS_DND |
11
00 00 00 |
Do
Not Disturb |
STATUS_INVISIBLE |
00
01 00 00 |
User
is invisible |