Опытный пользователь
Доп. информация
|
Регистрация: 19.04.2008
Адрес: Орел
Сообщений: 27
Поблагодарил(а): 0
Поблагодарили: 8 / 7
|
|
Представляю вам 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: Извените за мою грамотность
|