Показать сообщение отдельно
Старый 20.04.2008, 02:03 Вверх   #8
Опытный пользователь
 
Аватар для MrSam
MrSam вне форума
Доп. информация
По умолчанию

Представляю вам icq-бота 100% рабочего.
Для начала нам необходимо выбрать место где его ставить. Есть два варианта, первый это завести себе на платном хостинге имя, и спокойно выложить бота там, нельзя делать на бесплатном хотинге, потому что большенство из них не поддерживают сокеты (extension php_sockets), да и платные не все поддерживают. Второй вариант не очень выгоден так как ваш бот будет нахотся в сети только тогда когда вы его запуститеи будете подкючены к Интернет, все заключается в том что вы запускаете бота у себя на компе при помощи сервера приложений (например: TopServer #http://www.topserver.ru/#).
Наш бот будет выполнять 5 простых функций(которые вы потом сможе дополнять, незнаете как пишите):
1. выводит список команд. необходимо ввести команду "помощь"
2. выводит информацию о боте. необходимо ввести команду "info"
3. выводит курс валют ЦБ РФ. необходимо ввести команду "курс"
4. выключает бота. необходимо ввести команду "quit"
5. если вы введете неверную команду бот вам ответит.

Вот содеражание файлов которые необходимо закачать закачать на сервер.

index.php
PHP код:
<?php  
//
//Редакция от MrSam
//специально для [url]http://www.bormotuhi.net[/url], работает на webicqlite.class
//Функция вывода валют в комплекте
//Вместо ********** вписываем uin
//вместо #### его пароль

error_reporting (E_ALL);  
set_time_limit(0);  
ini_set ('max_execution_time', "0");  
require_once(
'WebIcqLite.class.php');  
define('UIN', '**********'); 
define('PASSWORD', '####'); 

//начало курс валют



  
$content = get_content(); 
  
$pattern = "#<Valute ID=\"([^\"]+)[^>]+>[^>]+>([^<]+)[^>]+>[^>]+>[^>]+>[^>]+>[^>]+>[^>]+>([^<]+)[^>]+>[^>]+>([^<]+)#i"; 
  
preg_match_all($pattern, $content, $out, PREG_SET_ORDER); 
  
$dollar = ""; 
  
$euro = ""; 
  foreach(
$out as $cur) 
  { 
    if(
$cur[2] == 840) $dollar = str_replace(",",".",$cur[4]); 
    if(
$cur[2] == 978) $euro   = str_replace(",",".",$cur[4]); 
  } 
  
 function 
get_content() 
  { 
    
// Формируем сегодняшнюю дату 
    
$date = date("d/m/Y"); 
    
// Формируем ссылку 
    
$link = "http://www.cbr.ru/scripts/XML_daily.asp?date_req=$date"; 
    
// Загружаем HTML-страницу 
    
$fd = fopen($link, "r"); 
    
$text=""; 
    if (!
$fd) echo "Запрашиваемая страница не найдена"; 
    else 
    { 
      
// Чтение содержимого файла в переменную $text 
      
while (!feof ($fd)) $text .= fgets($fd, 4096); 
    } 
    
// Закрыть открытый файловый дескриптор 
    
fclose ($fd); 
    return 
$text; 
  } 

// конец курс валют

$icq = new WebIcqLite();  
if(!
$icq->connect(UIN, PASSWORD))  
{  
    echo 
$icq->error;  
    exit();  
}  

while(
$icq->is_connected()){  
    
$msg = $icq->read_message();  
    switch (
strtolower($msg['message'])) {                           
         case
'курс':  
         
$icq->send_message($msg['from'], 'Центральный банк Российской Федерации ([url]http://www.cbr.ru/[/url])
         Доллар -  '
.$dollar.' 
         Евро - '
.$euro);  
        break;   

        case
'помощь':  
         
$icq->send_message($msg['from'], 'Доступные команды:
курс - выводит курс валют #Доллар и Евро#
info - информаци о БОТе
'
);  
        break;   

        case
'info':  
        
$icq->send_message($msg['from'], ' исходник БОТа для [url]http://www.bormotuhi.net[/url] с функцией вывода вылют');  
        break; 
          
        case
'quit': //сообщение для бота 
        
$icq->disconnect(); //действие бота (выход) 
        
exit;  
        break;  
       
        default: 
//если сообщение не содержит команду 
        
$icq->send_message($msg['from'], 'Введена неверная команда для отображения списка команд введите: помощь'); //ответ бота 
    
}  
    
flush();  
    
sleep(1);  
}  
?>
webicqlite.class.php
PHP код:
<?php
class WebIcqLite_TLV {
    var 
$type;
    var 
$size;
    var 
$error;
    
    var 
$types = array
    (
        
'UIN'                 =>  1, // 0x01
        
'DATA'                =>  2, // 0x02
        
'CLIENT'            =>  3, // 0x03
        
'ERROR_URL'            =>  4, // 0x04
        
'RECONECT_HERE'        =>  5, // 0x05
        
'COOKIE'            =>  6, // 0x06
        
'SNAC_VERSION'        =>  7, // 0x07
        
'ERROR_SUBCODE'        =>  8, // 0x08
        
'DISCONECT_REASON'    =>  9, // 0x09
        
'RECONECT_HOST'        => 10, // 0x0A
        
'URL'                => 11, // 0x0B
        
'DEBUG_DATA'        => 12, // 0x0C
        
'SERVICE'            => 13, // 0x0D
        
'CLIENT_COUNTRY'    => 14, // 0x0E
        
'CLIENT_LNG'        => 15, // 0x0F
        
'SCRIPT'            => 16, // 0x10
        
'USER_EMAIL'        => 17, // 0x11
        
'OLD_PASSWORD'        => 18, // 0x12
        
'REG_STATUS'        => 19, // 0x13
        
'DISTRIB_NUMBER'    => 20, // 0x14
        
'PERSONAL_TEXT'        => 21, // 0x15
        
'CLIENT_ID'            => 22, // 0x16
        
'CLI_MAJOR_VER'     => 23, // 0x17
        
'CLI_MINOR_VER'     => 24, // 0x18
        
'CLI_LESSER_VER'     => 25, // 0x19
        
'CLI_BUILD_NUMBER'    => 26, // 0x1A
//        'PASSWORD'            => 37
    
);
    
    function 
setTLV($type, $value, $length = false)
    {
        switch (
$length) 
        {
            case 
1:
                
$format = 'c';
                break;
            case 
2:
                
$format = 'n';
                break;
            case 
4:
                
$format = 'N';
                break;
            default:
                
$format = 'a*';
                break;
        }
        if (
$length === false) 
        {
            
$length = strlen($value);
        }
        return 
pack('nn'.$format, $this->types[$type], $length, $value);
    }
    
    function 
getTLV($data)
    {
        
$arr = unpack('n2', substr($data, 0, 4));
        
$this->type = $arr[1];
        
$this->size = $arr[2];
        return 
substr($data, 4, $this->size);
    }

    function 
getTLVFragment($data)
    {
        
$frg = unpack('cid/cversion/nsize', substr($data, 0, 4));
        
$frg['data'] = substr($data, 4, $frg['size']);
        return 
$frg;
    }
}

class 
WebIcqLite_SNAC extends WebIcqLite_TLV {
    
    var 
$request_id = 0;
    var 
$uin;
    
    function 
setSNAC0102()
    {
        
$this->request_id++;
        
$out = pack('nnnN', 1, 2, 0, $this->request_id);
        
$out .= pack('n*', 1, 3, 272, 650);
        
$out .= pack('n*', 2, 1, 272, 650);
        
$out .= pack('n*', 3, 1, 272, 650);
        
$out .= pack('n*', 21, 1, 272, 650);
        
$out .= pack('n*', 4, 1, 272, 650);
        
$out .= pack('n*', 6, 1, 272, 650);
        
$out .= pack('n*', 9, 1, 272, 650);
        
$out .= pack('n*', 10, 1, 272, 650);
        
        return 
$out;
    }
    
    function 
setSNAC0406($uin, $message)
    {
        
$this->request_id++;
        
$cookie = microtime();
        
$out = pack('nnnNdnca*', 4, 6, 0, $this->request_id, $cookie, 2, strlen($uin), $uin);
        
        
$capabilities = pack('H*', '094613494C7F11D18222444553540000'); // utf-8 support
        // '97B12751243C4334AD22D6ABF73F1492' rtf support
        
        
$data = pack('nd', 0, $cookie).$capabilities;
        
$data .= pack('nnn', 10, 2, 1);
        
$data .= pack('nn', 15, 0);
        
$data .= pack('nnvvddnVn', 10001, strlen($message)+62, 27, 8, 0, 0, 0, 3, $this->request_id);
        
$data .= pack('nndnn', 14, $this->request_id, 0, 0, 0); //45
        
$data .= pack('ncvnva*', 1, 0, 0, 1, (strlen($message)+1), $message);
        
$data .= pack('H*', '0000000000FFFFFF00');
        
$out .= $this->setTLV('RECONECT_HERE', $data);
        
$out .= $this->setTLV('CLIENT', '');
        return 
$out;
    }
    
    function 
setSNAC0406offline($uin, $message)
    {
        
$this->request_id++;
        
$cookie = microtime();
        
$out = pack('nnnNdnca*', 4, 6, 0, $this->request_id, $cookie, 1, strlen($uin), $uin);
        
        
$data = pack('ccnc', 5, 1, 1, 1);
        
$data .= pack('ccnnna*', 1, 1, strlen($message)+4, 3, 0, $message);
        
$out .= $this->setTLV('DATA', $data);
        
$out .= $this->setTLV('CLIENT', '');
        
$out .= $this->setTLV('COOKIE', '');
        return 
$out;
    }
    
    function 
getSNAC0407($body)
    {
        if (
strlen($body)) 
        {
            
$msg = unpack('nfamily/nsubtype/nflags/Nrequestid/N2msgid/nchannel/cnamesize', $body);
            if (
$msg['family'] == 4 && $msg['subtype'] == 7) 
            {
                
$body = substr($body, 21);
                
$from = substr($body, 0, $msg['namesize']);
                
$channel = $msg['channel'];
                
$body = substr($body, $msg['namesize']);
                
$msg = unpack('nwarnlevel/nTLVnumber', $body);
                
$body = substr($body, 4);
                for (
$i = 0; $i <= $msg['TLVnumber']; $i++)
                {
                    
$part = $this->getTLV($body);
                    
$body = substr($body, 4 + $this->size);
                    if (
$channel == 1 && $this->type == 2) 
                    {
                        while (
strlen($part)) 
                        {
                            
$frg = $this->getTLVFragment($part);
                            if (
$frg['id'] == 1 && $frg['version'] == 1) 
                            {
                                return array(
'from' => $from, 'message' => substr($frg['data'], 4));
                            }
                            
$part = substr($part, 4+$frg['size']);
                        }
                        return 
false;
                    }
                }
            }
        }
        return 
false;
    }
    function 
dump($str)
    {
        
$f = fopen('dump', 'a');
        
fwrite($f, $str);
        
fclose($f);
    }
    
}

class 
WebIcqLite_FLAP extends WebIcqLite_SNAC{
    
    var 
$socet;
    var 
$command = 0x2A;
    var 
$channel;
    var 
$sequence;
    var 
$body;
    var 
$info = array();

    function 
WebIcqLite_FLAP() {
        
$this->sequence = rand(1, 30000);
    }
    
    function 
getFLAP()
    {
        if(
$this->socet && !socket_last_error($this->socet))
        {
            
$header = socket_read($this->socet, 6);
            if (
$header) 
            {
                
$header = unpack('c2channel/n2size', $header);
                
$this->channel = $header['channel2'];
                
$this->body = socket_read($this->socet, $header['size2']);
                return 
true;
            }
            else 
            {
                return 
false;
            }
        }
    }
    
    function 
parseCookieFLAP()
    {
        
$this->getFLAP();
        
$this->info = array();
        while(
$this->body != '')
        {
            
$info = $this->getTLV($this->body);
            
$key = array_search($this->type, $this->types);
            if(
$key)
            {
                
$this->info[$key] = $info;
            }
            
$this->body = substr($this->body, ($this->size+4));
        }
    }
    
    function 
parseAnswerFLAP()
    {
        
$this->getFLAP();
        
$array = unpack('n3int/Nint', $this->body);
        while (
$array['int'] != $this->request_id) 
        {
            
$this->getFLAP();
            
$array = unpack('n3int/Nint', $this->body);
        }

        
$this->error = 'Unknown serwer answer';
        if (
$array['int1'] == 4) 
        {
            switch (
$array['int2']) 
            {
                case 
1:
                        
$this->error = 'Error to sent message';
                        return 
false;
                    break;
                case 
0x0c:
                        return 
true;
                    break;
            }
        }

        
$this->error = 'Unknown serwer answer';
        return 
false;
    }
    
    function 
prepare()
    {
        
$this->sequence++;
        
$out = pack('ccnn', $this->command, $this->channel, $this->sequence, strlen($this->body)).$this->body;
        return 
$out;
    }
    
    function 
login($uin, $password)
    {
        
$this->getFLAP();
        
$this->uin = $uin;
        
$this->body .= $this->setTLV('UIN',                 "$uin");
        
$this->body .= $this->setTLV('DATA',                 $this->xorpass($password));
        
$this->body .= $this->setTLV('CLIENT',                 'ICQBasic');
        
$this->body .= $this->setTLV('CLIENT_ID',             266, 2);
        
$this->body .= $this->setTLV('CLI_MAJOR_VER',         20, 2);
        
$this->body .= $this->setTLV('CLI_MINOR_VER',         34, 2);
        
$this->body .= $this->setTLV('CLI_LESSER_VER',         0, 2);
        
$this->body .= $this->setTLV('CLI_BUILD_NUMBER',     2321, 2);
        
$this->body .= $this->setTLV('DISTRIB_NUMBER',         1085, 4);
        
$this->body .= $this->setTLV('CLIENT_LNG',             'en');
        
$this->body .= $this->setTLV('CLIENT_COUNTRY',         'us');
        
        
        
$this->channel = 1;
        
$pack = $this->prepare();
        
socket_write($this->socet, $pack, strlen($pack));
        
$this->parseCookieFLAP();
        
        
$this->body = 0x0000;
        
$pack = $this->prepare();
        
socket_write($this->socet, $pack, strlen($pack));
        
$this->close();
        
        if(isset(
$this->info['RECONECT_HERE']))
        {
            
$url = explode(':', $this->info['RECONECT_HERE']);
            if(!
$this->open($url))
            {
                
$this->error = isset($this->info['DISCONECT_REASON']) ? $this->info['DISCONECT_REASON'] : 'Unable to reconnect';
                return 
false;
            }
        }
        else
        {
            
$this->error = isset($this->info['DISCONECT_REASON']) ? $this->info['DISCONECT_REASON'] : 'UIN blocked, please try again 20 min later.';
            return 
false;
        }

        
$this->getFLAP();
        
$this->body .= $this->setTLV('COOKIE', $this->info['COOKIE']);
        
$pack = $this->prepare();
        if (!
socket_write($this->socet, $pack, strlen($pack)))
        {
            
$this->error = 'Can`t send cookie, server close connection';
            return 
false;
        }
        
$this->getFLAP();
        
$this->body = $this->setSNAC0102();
        
$pack = $this->prepare();
        if (!
socket_write($this->socet, $pack, strlen($pack)))
        {
            
$this->error = 'Can`t send ready signal, server close connection';
            return 
false;
        }
        return 
true;
    }
    
    function 
write_message($uin, $message)
    {
        
$this->body = $this->setSNAC0406($uin, $message);
        
$pack = $this->prepare();
        if (!
socket_write($this->socet, $pack, strlen($pack)))
        {
            
$this->error = 'Can`t send message, server close connection';
            return 
false;
        }
        if (! 
$this->parseAnswerFLAP()) {
            
// try to send offline message
            
            
$this->body = $this->setSNAC0406offline($uin, $message);
            
$pack = $this->prepare();
            if (!
socket_write($this->socet, $pack, strlen($pack)))
            {
                
$this->error = 'Can`t send offline message, server close connection';
                return 
false;
            }
            if (! 
$this->parseAnswerFLAP()) 
            {
                return 
false;
            }
            else
            {
                
$this->error = 'Client is offline. Message sent to server.';
                return 
false;
            }
        }
        
        return 
true;
    }
    
    function 
read_message()
    {
        while(
$this->getFLAP())
        {
            
$message = $this->getSNAC0407($this->body);
            if(
$message){
                return 
$message;
            }
        }
        return 
false;
    }

    function 
xorpass($pass)
    {
        
$roast = array(0xF3, 0x26, 0x81, 0xC4, 0x39, 0x86, 0xDB, 0x92, 0x71, 0xA3, 0xB9, 0xE6, 0x53, 0x7A, 0x95, 0x7c);
        
$roasting_pass = '';
        for (
$i=0; $i<strlen($pass); $i++) 
        {
            
$roasting_pass .= chr($roast[$i] ^ ord($pass{$i}));
        }
        return(
$roasting_pass);
    }
    
    function 
open($url = array('login.icq.com', 5190))
    {
        
$this->socet = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
        if (
$this->socet < 0 || $this->socet === false) 
        {
            
$this->error = "socket_create() failed: reason: " . socket_strerror($this->socet);
            return 
false;
        }
        
$result = socket_connect($this->socet, gethostbyname($url[0]), $url[1]);
        if (
$result < 0 || $result === false) 
        {
            
$this->error = "socket_connect() failed.\nReason: ($result) " . socket_strerror(socket_last_error($socket));
            return 
false;
        }
        
        
       
        
        return 
true;
    }

    function 
close()
    {
        return 
socket_close($this->socet);
    }
}

class 
WebIcqLite extends WebIcqLite_FLAP {

    function 
WebIcqLite ()
    {
        
$this->WebIcqLite_FLAP();
    }
    
    function 
is_connected()
    {
        if(!
$this->socet || socket_last_error($this->socet))
        {
            
$this->error = socket_strerror(socket_last_error($socket));
            return 
false;
        }
        return 
true;
    }
    
    function 
connect($uin, $pass)
    {
        if (!
$this->open()) 
        {
            return 
false;
        }
        
        return 
$this->login($uin, $pass);
    }

    function 
disconnect()
    {
        return 
$this->close();
    }

    function 
get_message()
    {
        return 
$this->read_message();
    }
    
    function 
send_message($uin, $message)
    {
        return 
$this->write_message($uin, $message);
    }
    function 
GetUin() {
    global 
$uin;
    return 
$uin;
}
}
?>
Вводите свой uin и пароль в файле index.php. Затем добовляете этот uin себе в контакты в вашем icq клиенте, предварительно отредактировав uin bot'a. Далее файлы вы закачиваете в отдельную папку например "bot". После чего запускаете "http://www.domain.ru/bot/" или "http://www.localhos/bot/" в зависимости от способа который вы выбрали. и ждете пока бот не появится в сети. (это окола 5 сек в зависимости от скорости интернета).
ну а после чего тестите его, вводя различные команды, которые представлены выше.

PS: Извените за мою грамотность

Последний раз редактировалось MrSam; 20.04.2008 в 02:35..
  Ответить с цитированием
Cказали cпасибо:
 
Время генерации страницы 0.22214 секунды с 9 запросами