Что нового

UDF. Работа с протоколом ICQ. Версия 1.0

Sams

Знающий
Сообщения
4
Репутация
7
В связи с темой Помогите сделать ICQ клиент решил реализовать на Autoit работу с ICQ протоколом.
Написал за сегодня. Это первая и "сырая" версия. Если действительно будет актуальной темой, добавлю новых функций.

В качестве библиотеки для работы с 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. Не запускайте бота слишком часто и много раз. Делайте интервал около одной минуты. Если не будете соблюдать данного правила, не сможете зайти некоторое время на аккаунт, о чем свидетельствует сообщение "Превышен интервал подключений" (ну или как-то так :smile: ).

В архиве содержится UDF, DLL и пример.

Пожелания, а так же замечания по оптимизации кода приветствуются.
 
Автор
S

Sams

Знающий
Сообщения
4
Репутация
7
Хм, недоглядел. Ну в принципе время, потрачено на код, не бывает напрасным ;)
Если это является лишним, ну тогда не знаю, модераторы, стирайте.
 

Belfigor

Модератор
Локальный модератор
Сообщения
3 573
Репутация
933
Лишних примеров не бывает :smile:
 

ynbIpb

Скриптер
Сообщения
398
Репутация
109
если не слизано, альтернативный взгляд не бывает лишним.
 

Sergey2210

Осваивающий
Сообщения
263
Репутация
31
Эти функции давно уже есть,хотелось бы реализовать новые функции например как вывод списка контактов,анкеты и т.д. в этом был смысл темы Помогите сделать ICQ клиент
 
Автор
S

Sams

Знающий
Сообщения
4
Репутация
7
если не слизано, альтернативный взгляд не бывает лишним.
Не слизано. Я и не знал, что уже есть это дело, так бы не писал. А уж тем более слизывать, это слишком стыдно.
Эти функции давно уже есть,хотелось бы реализовать новые функции например как вывод списка контактов,анкеты и т.д. в этом был смысл темы Помогите сделать ICQ клиент
Попробуем ;)
 

lirikmel

Продвинутый
Сообщения
225
Репутация
83
Все стабильно отлично работает...Большое спасибо за удф очень помогло...ждем развития столь полезного проекта -)
 

Bloodrinker

<Блуждающий...>
Сообщения
228
Репутация
19
я год мечтал о таком пока сам для себя не написал)
OffTopic:
нужно было чтобы мой бот от одной MMORPG присылал мне в ICQ (на телефоне включена постоянно) сообщения, что мол все гуд или негуд ;)
 

Zaramot

I ♥ AutoIt
Сообщения
1 160
Репутация
657
Почему-то я отправляю это:
[box]http://desjatka.narod.ru/images/cosmos/Planety.jpg[/box]
A получаю:
[box]desjat?a.?arod.r?/images/cosmos/Planety.jpg[/box]

Проблема в передаче ссылок... :scratch:
 
Верх