В связи с темой Помогите сделать ICQ клиент решил реализовать на Autoit работу с ICQ протоколом.
Написал за сегодня. Это первая и "сырая" версия. Если действительно будет актуальной темой, добавлю новых функций.
В качестве библиотеки для работы с ICQ была использована ДЛЛ slesha (домашняя страница).
Хочу сразу отметить один нюанс. Простоты ради, UDF была рассчитана на работу одновременно лишь с одним соединением. Не пытайтесь сделать в одном скрипте коннект к серверу двумя разными аккаунтами. При попытке коннекта второго аккаунта будет потеряно соединение с первым.
И так...UDF:
Пока реализовано четыре основные функции. Вскоре добавлю запрос авторизации, а так же работу с прокси сервером.
В качестве примера написал ICQ бота. Графический интерфейс отсутствует. Целью является показать основной принцип работы с данной UDF.
Список команд бота:
!STATUS - текущий статус онлайн бота
!ABOUT - вывести сообщение о боте
!CLOSE - отключить бота от ICQ сервера
Для тех, кто не понял суть примера - это ICQ бот, работающий в фоновом режиме. После запуска отсылаем на номер бота команду и получаем соответствующий результат.
P.S. Не запускайте бота слишком часто и много раз. Делайте интервал около одной минуты. Если не будете соблюдать данного правила, не сможете зайти некоторое время на аккаунт, о чем свидетельствует сообщение "Превышен интервал подключений" (ну или как-то так ).
В архиве содержится UDF, DLL и пример.
Пожелания, а так же замечания по оптимизации кода приветствуются.
Написал за сегодня. Это первая и "сырая" версия. Если действительно будет актуальной темой, добавлю новых функций.
В качестве библиотеки для работы с ICQ была использована ДЛЛ slesha (домашняя страница).
Хочу сразу отметить один нюанс. Простоты ради, UDF была рассчитана на работу одновременно лишь с одним соединением. Не пытайтесь сделать в одном скрипте коннект к серверу двумя разными аккаунтами. При попытке коннекта второго аккаунта будет потеряно соединение с первым.
И так...UDF:
ICQ_Connect
ICQ_Read_Msg
ICQ_Send_Msg
ICQ_Close
Коннект к ICQ серверу
ICQ_Connect($host, $port, $login, $pass):
str $host - хост (login.icq.com)
int $port - порт (5190)
str $login - логин
str $pass - пароль
Возвращаемое значение:
В случае успешного коннекта $ICQ_CONNECT_STATUS_OK, иначе ноль.
Также статус коннекта записывается в перменную status структуры $ICQ_CLIENT:
$ICQ_CLIENT_STATUS_CONNECTED - клиент подключен успешно.
$ICQ_CLIENT_STATUS_DISCONNECTED - клиент не подключен к серверу.
Чтение входящих сообщений (используется в цикле)
ICQ_Read_Msg()
Возвращаемое значение:
Если пришло сообщение - "1".
Вся информация, а так же само сообщение хранится в структуре $RecvInfo:
UIN - номер отправителя
msg - входящее сообщение
len - длина сообщения
Отправка сообщения
ICQ_Send_Msg($uin, $msg)
str $uin - номер получателя
str $msg - сообщение
Возвращаемое значение:
В случаее ошибки $ICQ_CONNECT_STATUS_SEND_ERROR
Закрыть текущее соединение с ICQ сервером
ICQ_Close()
Пока реализовано четыре основные функции. Вскоре добавлю запрос авторизации, а так же работу с прокси сервером.
В качестве примера написал ICQ бота. Графический интерфейс отсутствует. Целью является показать основной принцип работы с данной UDF.
Список команд бота:
!STATUS - текущий статус онлайн бота
!ABOUT - вывести сообщение о боте
!CLOSE - отключить бота от ICQ сервера
Код:
#include <IcqMod.au3> ;Подключаем UDF
Global Const $icqlogin = "123456789" ;логин (номер icq)
Global Const $icqpass = "password" ;пароль
;Пытаемся подключится. Если удачно, ICQ_Connect() возвращает ICQ_CONNECT_STATUS_OK
if ICQ_Connect("login.icq.com", 5190, $icqlogin, $icqpass) = $ICQ_CONNECT_STATUS_OK Then
MsgBox(0, "Ok", "Bot was successfully launched")
;Зацикливаем функцию ICQ_Read_Msg() до тех пор, пока мы подключены к серверу
While DllStructGetData($ICQ_CLIENT, "status") = $ICQ_CLIENT_STATUS_CONNECTED
;Как только получаем входящее собщение, ICQ_Read_Msg возвращает "1"
If ICQ_Read_Msg() = 1 Then
;Входящее собщение хранится в структуре $RecvInfo
$RecvMsg = DllStructGetData($RecvInfo, "msg")
Select
;Если входящее сообщение "!STATUS", тогда отправим в ответ "Ready to work".
;Номер отправившего сообщение хранится в структуре $RecvInfo
Case $RecvMsg == "!STATUS"
ICQ_Send_Msg(DllStructGetData($RecvInfo,"UIN"), "Ready to work")
;"!ABOUT" - отправим в ответ информацию о боте.
Case $RecvMsg == "!ABOUT"
ICQ_Send_Msg(DllStructGetData($RecvInfo,"UIN"), "ICQ Test Bot by Sams. First and last version 1.0 :D")
;"!CLOSE" - закрываем соединение с сервером при помощи ICQ_Close()
Case $RecvMsg == "!CLOSE"
ICQ_Send_Msg(DllStructGetData($RecvInfo,"UIN"), "Good bye")
ICQ_Close()
EndSelect
EndIf
WEnd
Else
;В случаее неудачного подключения выводим сообщени об ошибке
MsgBox(0, "Error", "Connection error")
EndIf
Для тех, кто не понял суть примера - это ICQ бот, работающий в фоновом режиме. После запуска отсылаем на номер бота команду и получаем соответствующий результат.
P.S. Не запускайте бота слишком часто и много раз. Делайте интервал около одной минуты. Если не будете соблюдать данного правила, не сможете зайти некоторое время на аккаунт, о чем свидетельствует сообщение "Превышен интервал подключений" (ну или как-то так ).
В архиве содержится UDF, DLL и пример.
Пожелания, а так же замечания по оптимизации кода приветствуются.