1. Вы находитесь в архивной версии форума xaker.name. Здесь собраны темы с 2007 по 2012 год, большинство инструкций и мануалов уже неактуальны.
    Скрыть объявление

IcqMod

Тема в разделе "Программирование", создана пользователем lytgeygen, 18 фев 2010.

  1. lytgeygen

    lytgeygen pacifiste maniaque ..::V.I.P::..

    Регистрация:
    13 окт 2008
    Сообщения:
    431
    Симпатии:
    244
    Баллы:
    0
    Что это?
    Это небольшая DLL для работы с аськой ) которая реализует основные функции для работы с протоколом.
    Основные - это коннект, дисконнект, отправка и получение сообщений, запрос авторизации и отказ авторизовать.

    Зачем оно нужно?
    1) Очень удобный модуль для ICQ спама
    2) Очень удобный модуль для ICQ флуда
    3) Возможность быстрого создания простых ICQ ботов
    4) Использование в любом другом софте который использует ICQ протокол

    В чем особенность?
    1) чистый размер DLL - 6 килобайт
    2) возможность использования в любом компилируемом языке
    3) простота использования
    4) поддержка socks4 и socks5
    5) нет нужно юзать VCL и тому подобные вещи.
    6) собственный двиг (не используется TICQClient)/ собственно по размеру это видно
    7) в онлайн можно выводить сколько угодно номеров (в особенности если юзать прокси) при этом тормозить ничего не будет в отличии от использования VCL компонента TICQClient

    Какие функции имеются?
    ICQClose - закрытие соединение
    ICQConnect - коннект к серверу
    ICQSendMsg - посылка сообщения
    ICQSendAuth - посылка запроса на авторизацию с передачей текста
    ICQAuth - авторизовать UIN или отказать в авторизации
    ICQReadMsg - проверка на наличие сообщения в очереди

    Технические особенность
    1) максимальное кол-во параллельно работающих коннектов - неограничено, на сколько система позволит
    2) максимальный размер входящего сообщения - 240 байт. Просто большие сообщения отправляются другим способом, который не поддерживается в dll
    3) поддержка приема русских сообщений
    4) оправка сообщений на русском языке требует предварительного конверта текста в UTF8. Английский и так прокатывает.
    5) используется только WinSock2
    6) написан на Си.
    7) Скомпилирован в VS 2008 Pro

    Пример использования в Delphi
    Пример реализации в Delphi простого бота который будет выводить в консоль сообщение которые посылает юзеры и их UIN's
    на запрос !TIME будет отослано текущее время.

    Пример лежит в архиве
    TimeBot.dpr - сам бот
    IcqMod.pas - вспомогательный модуль описывающий константы и прототипы
    IcqMod.dll - сама dll

    Пример использования в C/C++
    Примера не будет, просто в файле IcqMod.h описаны константы и прототипы функций. Кому нужно разберутся.

    Подробное описание функций, констант и структур

    Код:
     	  PROXY_INFO = packed record
        ProxyType : dword; // тип прокси
        ProxyIp : dword; //  адрес прокси
        ProxyPort : word; // порт прокси
      end;
      PPROXY_INFO = ^PROXY_INFO; 
    Данная структура описывает инфо о прокси.
    Типы прокси:
     PROXY_TYPE_SOCKS_4 = 1; 
     PROXY_TYPE_SOCKS_5 = 2;
    заполняется так примерно:
    Код:
    proxy.ProxyType = PROXY_TYPE_SOCKS_5;
    proxy.ProxyPort = 1222;
    proxy.ProxyIp = inet_addr("127.0.0.1");
    --------------------------------

    Код:
     	  ICQ_CLIENT = packed record
        status : byte;
        sequence : word;
        sock : dword;
      end; 
    основная структура описывающая состояние работы. Заполняется функцией ICQConnect
    В ней не стоит ничего менять, просто используете для работы. Единственная переменная за состоянием которой нужно следить - status она может принимать значение:
    Код:
      ICQ_CLIENT_STATUS_CONNECTED = 1; - связь установлена
      ICQ_CLIENT_STATUS_DISCONNECTED = 2; - нет связи с сервером
    --------------------------------
    function ICQConnect(var client : ICQ_CLIENT; host : PAnsichar; port : word; login : PAnsichar; pass : PAnsichar; pproxy : PPROXY_INFO) : dword; stdcall; external ICQMOD_DLL;

    подключение к серверу, где
    client - переменная для хранения состояния
    host - имя сервака типа login.icq.com
    port - порт сервера (5190)
    login - UIN
    pass - пароль для UINа
    pproxy - указатель на структуру описывающую прокси.
    Если 0 значит не юзать прокси, если указана структура прокси, то берет из неё данные для коннекта

    Функция возвращает код состояния:
    Код:
     ICQ_CONNECT_STATUS_OK	= $FFFFFFFF; // подключился удачно
     ICQ_CONNECT_STATUS_RECV_ERROR	= $FFFFFFFE; // ошибка чтения данных
     ICQ_CONNECT_STATUS_SEND_ERROR = $FFFFFFFD;// ошибка отправки данных
     ICQ_CONNECT_STATUS_CONNECT_ERROR = $FFFFFFFC;// ошибка коннекта к серваку
     ICQ_CONNECT_STATUS_AUTH_ERROR = $FFFFFFFB; // не смог 
    авторизоваться. Или пас не подходит или превышен лимит
    -----------------
    function ICQReadMsg(var client : ICQ_CLIENT; UIN : PAnsichar; msg : PAnsichar; var msglen : integer) : dword; stdcall; external ICQMOD_DLL;

    Проверка на сообщение.
    client - описание состояния
    UIN - адрес буфера куда будет помещен UIN человека от которого пришло сообщение. желательно чтобы был 10 байт.
    msg - адрес буфера куда будет записано сообщение.
    msglen - переменная в которую будет записана длинна сообщения.

    Функция возвращает:
    0 - сообщения нет
    1 - сообщение получено.

    Данная функция извлекает данные из сокета если они есть. И если это сообщение, то парсит его.
    ----------------
    function ICQAuth(var client : ICQ_CLIENT; UIN : PAnsichar; AuthOk : dword) : dword; stdcall; external ICQMOD_DLL;


    Авторизация номера.
    client - описание состояния
    UIN - номер человека которого нужно авторизовать
    AuthOk - флаг авторизации:
    0 - послать команду - в авторизации отказано
    1 - авторизовать человека.
    ---------------------
    procedure ICQClose(var client : ICQ_CLIENT); stdcall; external ICQMOD_DLL;

    закрывает соединение
    --------------------

    function ICQSendAuth(var client : ICQ_CLIENT; UIN : PAnsichar; msg : PAnsichar) : dword; stdcall; external ICQMOD_DLL;

    Отсылка запроса на авторизацию.
    UIN - кому отсылается
    msg - текст который будет присутствовать в запросе
    ---------------------
    function ICQSendMsg(var client : ICQ_CLIENT; UIN : PAnsichar; msg : PAnsichar) : dword; stdcall; external ICQMOD_DLL;

    Посылка сообщения
    UIN - кому
    msg - текст сообщения

    Вот пример на Си как работать через прокси

    Код:
    		WSADATA ws;
    	ICQ_CLIENT cl;
    	char UIN[10];
    	char msg[4096];
    	int msglen;
    	PROXY_INFO proxy;
    
    	WSAStartup(0x202, &ws);	
    
    	proxy.ProxyType = PROXY_TYPE_SOCKS_5;
    	proxy.ProxyPort = 1222;
    	proxy.ProxyIp = inet_addr("127.0.0.1");
    
    	ICQConnect(&cl, "login.icq.com", 5190, "UIN", "PASS", &proxy);
    	ICQSendMsg(&cl, "454042", "hello slesh");
    	
    	printf("Conn ok\n");
    	ICQAuth(&cl, "454042", 1);
    // матаем цикл пока есть коннект
    	while (cl.status == ICQ_CLIENT_STATUS_CONNECTED)
    	{
    		if (ICQReadMsg(&cl, UIN, msg, &msglen)) // если есть сообщение
    		{
    			printf("UIN=%s\nMSG=%s\n", UIN, msg); // выведем сообщение
    			ICQSendMsg(&cl, UIN, "Yes"); //  пошлем слово YES
    		}
    		Sleep(1); // маленькая пауза чтобы не вешать систему
    	}
    	
    	printf("finish");
    	getch(); 
    (С) SLESH
     

Поделиться этой страницей