Что нового

ICQ протокол получение списка друзей.

Arei

Скриптер
Сообщения
938
Репутация
115
Скажите как получить список контактов ICQ заранее спасибо.
 
Автор
A

Arei

Скриптер
Сообщения
938
Репутация
115
нашёл dll
там есть нужная функция ICQ_GetUINContact(ICQ_Socket,DWORD UIN);
теперь вопрос как её вызвать?



Добавлено:
Сообщение автоматически объединено:

правильно?
Код:
Func ICQ_GetUINContact($UIN)
	DllCall($ICQMOD_DLL, "dword", "ICQ_GetUINContact", "ptr", DllStructGetPtr($stICQ_CLIENT),  "str", $UIN)
EndFunc
 

Garrett

Модератор
Локальный модератор
Сообщения
3,999
Репутация
967
Вроде так
Код:
Func _ICQ_GetUINContact($i_ICQ_Socket, $d_UIN)
	$a_Call = DllCall($_Dll, 'cdecl:ptr', 'ICQ_GetUINContact', 'int', $i_ICQ_Socket, 'dword', $d_UIN)
	If @error Then _
		Return SetError(1, 0, 0)
		Return SetError(0, 0, $a_Call[0])
EndFunc
 
Автор
A

Arei

Скриптер
Сообщения
938
Репутация
115
но появляется вопрос что за $i_ICQ_Socket,и где его взять?
 

Garrett

Модератор
Локальный модератор
Сообщения
3,999
Репутация
967
Arei [?]
что за $i_ICQ_Socket,и где его взять?
Код:
$iICQ_Socket = _ICQ_NewSocket()
ConsoleWrite($iICQ_Socket)

Func _ICQ_NewSocket()
	$a_Call = DllCall($_Dll, 'cdecl:int', 'ICQ_NewSocket')
	If @error Then _
		Return SetError(1, 0, 0)
		Return SetError(0, 0, $a_Call[0])
EndFunc

А вообще есть в архиве заголовочные файлы (icq_type.h и icq_socket.h), вот их и нужно изучить, там много интересного.
 
Автор
A

Arei

Скриптер
Сообщения
938
Репутация
115
сделаю UDF если никто не опередит.Да почитаю.


Добавлено:
Сообщение автоматически объединено:

ВАш код только выводит 0 и всё.
 

kaster

Мой Аватар, он лучший самый
Команда форума
Глобальный модератор
Сообщения
4,020
Репутация
626
изучайте
http://autoit-script.ru/index.php/topic,788.0.html
 
Автор
A

Arei

Скриптер
Сообщения
938
Репутация
115
Там нет получения контактов.
 

Ganibal95

GreenBytes
Сообщения
877
Репутация
240
там нет многих функций :(
Нужны функции:
1. Получение списка контактов, а также узнавать их ники...
2. Смотреть информацию о контакте
3. Удалять/Добавлять
4. Менять статусы
И другие основные функции Аси, мы хотим сделать не мини асю, а сделать полный аналог Аси!
 

kaster

Мой Аватар, он лучший самый
Команда форума
Глобальный модератор
Сообщения
4,020
Репутация
626
зато там очень подробно расписано как работать с dll :smile:
 

Viktor1703

AutoIT Гуру
Сообщения
1,535
Репутация
413
Запоздал маленько ;D, но нашёл описание ICQ протокола, то есть можно написать UDF и не нужны будут ни какие Dll, задача стоит в правильном оформлении пакета, я пытался авторизироватся, но не получилось.

Код:
TCPStartup()
$iSocket = TCPConnect(TCPNameToIP('login.icq.com'), 5190)

While 1
	$iRecv = TCPRecv($iSocket, 2048)
	If $iRecv Then
		If (StringInStr($iRecv, '2A01') And StringInStr($iRecv, '000400000001')) Then
			MsgBox(0, '', $iRecv)
			ExitLoop
		EndIf
    EndIf		
Wend

TCPCloseSocket($iSocket)
TCPShutdown()


Здесь мы получаем приветствие от сервера при подключении, где:

2a - Ключ пакета
01 - Номер канала
3cb2 - Счетчик пакета (значение: 15538) постоянно меняется, его мы не учитываем при сравнении
0004 - Длина данных (значение: 4 байта)
00000001 - Данные передаваемые в пакете длиной 4 байта

Не могу понять как формировать ответный пакет на запрос.

Источник: ICQ Protocol
 

Viktor1703

AutoIT Гуру
Сообщения
1,535
Репутация
413
Говорится что значение счётчика при каждой новой отправке пакета должно увеличиваться на 1, пробую, пока что не получается... :scratch:

Пытаюсь сделать так:

Код:
#include <String.au3>

Global $sCounter = 0

TCPStartup()
$iSocket = TCPConnect(TCPNameToIP('login.icq.com'), 5190)

While 1
	$iRecv = TCPRecv($iSocket, 2048)
	If $iRecv Then
		ConsoleWrite($iRecv & @CRLF)
		$sCounter = __pak_Hello($iRecv)
		If $sCounter Then
			ConsoleWrite(Hex($sCounter, 4) & @CRLF) ;~ Счётчик до изменений
			TCPSend($iSocket, '0x2A01' & __pak_Counter($sCounter) & '000C000000018003000400100000')
			ConsoleWrite(Hex($sCounter, 4) & @CRLF) ;~ Счётчик после отпраки 1го пакета
			TCPSend($iSocket, '0x2A02' & __pak_Counter($sCounter) & '00140017000600000000000000010009' & _StringToHex('Иой UIN'))
			ConsoleWrite(Hex($sCounter, 4) & @CRLF) ;~ Счётчик после отпраки 2го пакета
		EndIf
    EndIf		
Wend

TCPCloseSocket($iSocket)
TCPShutdown()

Func __pak_Hello($sData)
	Local $sCount = StringRegExpReplace($sData, '2A01(.*)000400000001', '$1')
	If $sCount Then
		Return Number($sCount)
	Else 
        Return 0		
	EndIf
EndFunc	

Func __pak_Counter(ByRef $sCount)
	$sCount = $sCount + 1
	Return Hex($sCount, 4)
EndFunc


Не могут же пакеты отправляться в таком чистом виде, ни чего придумать не могу, а описание непонятное :stars:
 

Garrett

Модератор
Локальный модератор
Сообщения
3,999
Репутация
967
Viktor1703
Посмотрите здесь, может, найдёте что-нибудь полезное. Там есть пример на Delphi.
 

Viktor1703

AutoIT Гуру
Сообщения
1,535
Репутация
413
Спасибо, посмотрю, но для меня пример на Delphi - что он есть, что его нету, я его не понимаю :smile:
 
Верх