Что нового

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,602
Репутация
941
Лишних примеров не бывает :smile:
 

ynbIpb

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

Sams

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

lirikmel

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

Bloodrinker

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

Zaramot

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

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