Показать сообщение отдельно
Старый 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$outPREG_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($fd4096); 
    } 
    
// Закрыть открытый файловый дескриптор 
    
fclose ($fd); 
    return 
$text
  } 

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

$icq = new WebIcqLite();  
if(!
$icq->connect(UINPASSWORD))  
{  
    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($data04));
        
$this->type $arr[1];
        
$this->size $arr[2];
        return 
substr($data4$this->size);
    }

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

class 
WebIcqLite_SNAC extends WebIcqLite_TLV {
    
    var 
$request_id 0;
    var 
$uin;
    
    function 
setSNAC0102()
    {
        
$this->request_id++;
        
$out pack('nnnN'120$this->request_id);
        
$out .= pack('n*'13272650);
        
$out .= pack('n*'21272650);
        
$out .= pack('n*'31272650);
        
$out .= pack('n*'211272650);
        
$out .= pack('n*'41272650);
        
$out .= pack('n*'61272650);
        
$out .= pack('n*'91272650);
        
$out .= pack('n*'101272650);
        
        return 
$out;
    }
    
    function 
setSNAC0406($uin$message)
    {
        
$this->request_id++;
        
$cookie microtime();
        
$out pack('nnnNdnca*'460$this->request_id$cookie2strlen($uin), $uin);
        
        
$capabilities pack('H*''094613494C7F11D18222444553540000'); // utf-8 support
        // '97B12751243C4334AD22D6ABF73F1492' rtf support
        
        
$data pack('nd'0$cookie).$capabilities;
        
$data .= pack('nnn'1021);
        
$data .= pack('nn'150);
        
$data .= pack('nnvvddnVn'10001strlen($message)+622780003$this->request_id);
        
$data .= pack('nndnn'14$this->request_id000); //45
        
$data .= pack('ncvnva*'1001, (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*'460$this->request_id$cookie1strlen($uin), $uin);
        
        
$data pack('ccnc'5111);
        
$data .= pack('ccnnna*'11strlen($message)+430$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'] == && $msg['subtype'] == 7
            {
                
$body substr($body21);
                
$from substr($body0$msg['namesize']);
                
$channel $msg['channel'];
                
$body substr($body$msg['namesize']);
                
$msg unpack('nwarnlevel/nTLVnumber'$body);
                
$body substr($body4);
                for (
$i 0$i <= $msg['TLVnumber']; $i++)
                {
                    
$part $this->getTLV($body);
                    
$body substr($body$this->size);
                    if (
$channel == && $this->type == 2
                    {
                        while (
strlen($part)) 
                        {
                            
$frg $this->getTLVFragment($part);
                            if (
$frg['id'] == && $frg['version'] == 1
                            {
                                return array(
'from' => $from'message' => substr($frg['data'], 4));
                            }
                            
$part substr($part4+$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(130000);
    }
    
    function 
getFLAP()
    {
        if(
$this->socet && !socket_last_error($this->socet))
        {
            
$header socket_read($this->socet6);
            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->sequencestrlen($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',             2662);
        
$this->body .= $this->setTLV('CLI_MAJOR_VER',         202);
        
$this->body .= $this->setTLV('CLI_MINOR_VER',         342);
        
$this->body .= $this->setTLV('CLI_LESSER_VER',         02);
        
$this->body .= $this->setTLV('CLI_BUILD_NUMBER',     23212);
        
$this->body .= $this->setTLV('DISTRIB_NUMBER',         10854);
        
$this->body .= $this->setTLV('CLIENT_LNG',             'en');
        
$this->body .= $this->setTLV('CLIENT_COUNTRY',         'us');
        
        
        
$this->channel 1;
        
$pack $this->prepare();
        
socket_write($this->socet$packstrlen($pack));
        
$this->parseCookieFLAP();
        
        
$this->body 0x0000;
        
$pack $this->prepare();
        
socket_write($this->socet$packstrlen($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$packstrlen($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$packstrlen($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$packstrlen($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$packstrlen($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(0xF30x260x810xC40x390x860xDB0x920x710xA30xB90xE60x530x7A0x950x7c);
        
$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_INETSOCK_STREAMSOL_TCP);
        if (
$this->socet || $this->socet === false
        {
            
$this->error "socket_create() failed: reason: " socket_strerror($this->socet);
            return 
false;
        }
        
$result socket_connect($this->socetgethostbyname($url[0]), $url[1]);
        if (
$result || $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.22455 секунды с 10 запросами