Страница 1 из 2

Отправка уведомления по ICQ что скрипт отработал

Добавлено: 20 фев 2009, 16:34
Karlson
Было дело, хотел запустить скрипт. Только работать он должен был, по моим расчётам, недельку. В ICQ я- постоянно. Чтоб не лазить на сервер, решил сделать уведомление мне по ICQ.
Особо делать ничего ни пришлось. Просто зашёл в Wiki и спросил OSCAR (так называется протокол ICQ). Собственно, результат:

Код: Выделить всё

<?php
/*
BasICQ - базовый класс для работы с сервисом ICQ.

При распространении скрипта - ссылка на icqbot.ru

Функции класса:

sockets($method) - Способ подключения. Значение true - через socket_create, false - через fsockopen.
connect($uin,$pass) - Подключение и логин с заданными $uin и $pass.
connected() - Возвращает true, если подключение есть, false если нет.
send($uin,$message) - Отсылка сообщения $message на номер $uin.
messages() - Получение новых сообщений с сервера. Возвращает массив, ключ "from" - номер отправителя, "text" - текст сообщения. 
disconnect() - Отключение от сервера.

Пример бота:

<?
include('basicq.php');
$icq=new BasICQ();
$icq->sockets(true); //Установка подключения через socket_create, если не работает, попробуйте $icq->sockets(false);
if ($icq->connect("123456789","abcdefgh")) { //Подключение с номером 123456789 и паролем abcdefgh, смените на свои.
$icq->send("111111111","Сообщение от бота"); //Отсылка сообщения на номер 111111111.
while ($icq->connected()) {  //Работа пока есть соединение с сервером
$msg=$icq->messages(); //Получение сообщения с сервера
$icq->send($msg["from"],$msg["text"]); //Пересылка этого же сообщения отправителю
if ($msg["text"]=="!") $icq->disconnect(); //Если пришла команда !, то отключение от сервера.
sleep(1); //Задержка чтобы разгрузить систему.
}
}
?>

(с) 2007, ICQBOT.RU, http://icqbot.ru
*/
class BasICQ {
function BasICQ() {
$this->method=false;
$this->sequence=rand(1,30000);
}
function sockets($method) {
$this->method=$method;
}
function connect($uin,$pass) {
if ($this->method) {
$this->socket=socket_create(AF_INET,SOCK_STREAM,SOL_TCP);
if ($this->socket<0||$this->socket===false) return false;
$result=socket_connect($this->socket,"login.icq.com",80);
if ($result<0||$result===false) return false;
} else {
$this->socket=fsockopen("login.icq.com",80,$errno);
if ($errno!==0) return false;
}
$this->getpacket();
$this->uin=$uin;
$this->body.=$this->setoption('UIN',$uin);
$ar=array(0xF3,0x26,0x81,0xC4,0x39,0x86,0xDB,0x92,0x71,0xA3,0xB9,0xE6,0x53,0x7A,0x95,0x7c);
$hash="";
for ($i=0;$i<strlen($pass);$i++) $hash.=chr($ar[$i]^ord($pass[$i]));
$this->body.=$this->setoption('DATA',$hash);
$this->body.=$this->setoption('CLIENT','HFICQ');
$this->body.=$this->setoption('CLIENT_ID',266,2);
$this->body.=$this->setoption('CLI_MAJOR_VER',20,2);
$this->body.=$this->setoption('CLI_MINOR_VER',34,2);
$this->body.=$this->setoption('CLI_LESSER_VER',0,2);
$this->body.=$this->setoption('CLI_BUILD_NUMBER',2321,2);
$this->body.=$this->setoption('DISTRIB_NUMBER',1085,4);
$this->body.=$this->setoption('CLIENT_LNG','ru');
$this->body.=$this->setoption('CLIENT_COUNTRY','ru');
$this->channel=1;
$pack=$this->prepare();
if ($this->method) socket_write($this->socket,$pack,strlen($pack)); else fwrite($this->socket,$pack);
$this->getpacket();
$this->info=array();
while($this->body!='') {
$arr=unpack('n2',substr($this->body,0,4));
$this->type=$arr[1];
$this->size=$arr[2];
$info=substr($this->body,4,$this->size);
$key=array_search($this->type,$this->types);
if($key) $this->info[$key]=$info;
$this->body=substr($this->body,($this->size+4));
}
$this->body=0x0000;
$pack=$this->prepare();
if ($this->method) socket_write($this->socket,$pack,strlen($pack)); else fwrite($this->socket,$pack);
if ($this->method) socket_close($this->socket); else fclose($this->socket);
$this->socket=false;
if (isset($this->info['RECONECT_HERE'])) {
$url=explode(':',$this->info['RECONECT_HERE']);
if ($this->method) {
$this->socket=socket_create(AF_INET,SOCK_STREAM,SOL_TCP);
if ($this->socket<0||$this->socket===false) $res=false;
$result=socket_connect($this->socket,$url[0],$url[1]);
if ($result<0||$result===false) $res=false; else $res=true;
} else {
$this->socket=fsockopen($url[0],$url[1],$errno);
if ($errno!==0) $res=false; else $res=true;
}
if (!$res) {
$this->error=isset($this->info['DISCONECT_REASON'])?$this->info['DISCONECT_REASON']:'Невозможно сменить север';
return false;
}
} else {
$this->error=isset($this->info['DISCONECT_REASON'])?$this->info['DISCONECT_REASON']:'Превышен лимит подключений';
return false;
}
$this->getpacket();
$this->body.=$this->setoption('COOKIE',$this->info['COOKIE']);
$pack=$this->prepare();
if ($this->method) $wr=socket_write($this->socket,$pack,strlen($pack)); else $wr=fwrite($this->socket,$pack);
if (!$wr) {
$this->error='Соединение закрыто';
return false;
}
$this->getpacket();
$this->request_id++;
$this->body=pack('nnnN',1,2,0,$this->request_id);
$this->body.=pack('n*',1,3,272,650);
$this->body.=pack('n*',2,1,272,650);
$this->body.=pack('n*',3,1,272,650);
$this->body.=pack('n*',21,1,272,650);
$this->body.=pack('n*',4,1,272,650);
$this->body.=pack('n*',6,1,272,650);
$this->body.=pack('n*',9,1,272,650);
$this->body.=pack('n*',10,1,272,650);
$pack=$this->prepare();
if ($this->method) $wr=socket_write($this->socket,$pack,strlen($pack)); else $wr=fwrite($this->socket,$pack);
if (!$wr) {
$this->error='Соединение закрыто';
return false;
}
return true;
}
function connected() {
if ($this->socket) return true; else return false;
}
function send($uin,$message) {
$this->request_id++;
$cookie=microtime();
$this->body=pack('nnnNdnca*',4,6,0,$this->request_id,$cookie,2,strlen($uin),$uin);
$capabilities=pack('H*','094613494C7F11D18222444553540000');
$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);
$data.=pack('ncvnva*',1,0,0,1,(strlen($message)+1),$message);
$data.=pack('H*', '0000000000FFFFFF00');
$this->body.=$this->setoption('RECONECT_HERE',$data);
$this->body.=$this->setoption('CLIENT','');
$pack=$this->prepare();
if ($this->method) $wr=socket_write($this->socket,$pack,strlen($pack)); else $wr=fwrite($this->socket,$pack);
if (!$wr) {
$this->error='Не могу отправить сообщение, сервер закрыл соединение';
return false;
}
if (!$this->makeinfo()) {
$this->request_id++;
$cookie=microtime();
$this->body=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);
$this->body.=$this->setoption('DATA', $data);
$this->body.=$this->setoption('CLIENT','');
$this->body.=$this->setoption('COOKIE','');
$pack=$this->prepare();
if ($this->method) $wr=socket_write($this->socket,$pack,strlen($pack)); else $wr=fwrite($this->socket,$pack);
if (!$wr) {
$this->error='Соединение закрыто';
return false;
}
$this->makeinfo();
return false;
}
return true;
}
function messages() {
while($this->getpacket()) {
$body=$this->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++) {
$arr=unpack('n2',substr($body,0,4));
$this->type=$arr[1];
$this->size=$arr[2];
$part=substr($body,4,$this->size);
$body=substr($body,4+$this->size);
if ($channel==1&&$this->type==2) {
while (strlen($part)) {
$frg=unpack('cid/cversion/nsize',substr($part,0,4));
$frg['data']=substr($part,4,$frg['size']);
if ($frg['id']==1&&$frg['version']==1) {
return array('from'=>$from,'text'=>substr($frg['data'],4));
}
$part=substr($part,4+$frg['size']);
}
$message=false;
}
}
}
} else $message=false;
}
return false;
}
function disconnect() {
if ($this->method) socket_close($this->socket); else fclose($this->socket);
$this->socket=false;
}
var $types=array('UIN'=>1,'DATA'=>2,'CLIENT'=>3,'ERROR_URL'=>4,
'RECONECT_HERE'=>5,'COOKIE'=>6,'SNAC_VERSION'=>7,
'ERROR_SUBCODE'=>8,'DISCONECT_REASON'=>9,
'RECONECT_HOST'=>10,
'URL'=>11,'DEBUG_DATA'=>12,'SERVICE'=>13,
'CLIENT_COUNTRY'=>14,'CLIENT_LNG'=>15,
'SCRIPT'=>16,'USER_EMAIL'=>17,'OLD_PASSWORD'=>18,
'REG_STATUS'=>19,'DISTRIB_NUMBER'=>20,
'PERSONAL_TEXT'=>21,'CLIENT_ID'=>22,'CLI_MAJOR_VER'=>23,
'CLI_MINOR_VER'=>24,'CLI_LESSER_VER'=>25,
'CLI_BUILD_NUMBER'=>26);
var $socet,$channel,$sequence,$body,$uin,$type,$size,$error;
function getpacket() {
if ($this->method) {
if($this->socket&&!socket_last_error($this->socket)) {
$header=socket_read($this->socket, 6);
if ($header) {
$header=unpack('c2channel/n2size',$header);
$this->channel=$header['channel2'];
$this->body=socket_read($this->socket,$header['size2']);
return true;
} else return false;
}
} else {
if($this->socket) {
$header=fread($this->socket,6);
if ($header) {
$header=unpack('c2channel/n2size',$header);
$this->channel=$header['channel2'];
$this->body=fread($this->socket,$header['size2']);
return true;
} else return false;
}
}
}
function makeinfo() {
$this->getpacket();
$array=unpack('n3int/Nint',$this->body);
while ($array['int']!=$this->request_id) {
$this->getpacket();
$array=unpack('n3int/Nint',$this->body);
}
$this->error='Неизвестный ответ сервера';
if ($array['int1']==4) {
switch ($array['int2']) {
case 1:  $this->error='Error to sent message'; return false; break;
case 12: return true; break;
}
}
$this->error='Неизвестный ответ сервера';
return false;
}
function setoption($type,$val,$len=false) {
switch ($len) {
case 1: $format='c'; break;
case 2: $format='n'; break;
case 4: $format='N'; break;
default: $format='a*'; break;
}
if ($len===false) $len=strlen($val);
return pack('nn'.$format,$this->types[$type],$len,$val);
}
function prepare() {
$this->sequence++;
$out=pack('ccnn',0x2A,$this->channel,$this->sequence,strlen($this->body)).$this->body;
return $out;
}
}
?>

Re: Отправка уведомления по ICQ что скрипт отработал

Добавлено: 20 окт 2011, 17:27
Kenars
Твой код использует сокеты. Тоесть это стандартный php код для выполнения аппачем причем тут Хуман

Re: Отправка уведомления по ICQ что скрипт отработал

Добавлено: 21 окт 2011, 01:22
satih
он непользуется браузером, значит хуман нипричем, тем не менее зацепил важную иногда тему - как работать с аськой через пхп, которым также пользуется хуман. в итоге есть пример использования аськи которое можно внедрить в готовый скрипт того же хумана если нужен icq отчет.

Re: Отправка уведомления по ICQ что скрипт отработал

Добавлено: 02 мар 2012, 00:02
Karlson
satih писал(а):он непользуется браузером, значит хуман нипричем, тем не менее зацепил важную иногда тему - как работать с аськой через пхп, которым также пользуется хуман. в итоге есть пример использования аськи которое можно внедрить в готовый скрипт того же хумана если нужен icq отчет.
Посмотрел первый пост, стало забавно, второй человек почти понял к чему я...

Так вот, я к тому, что скрипты писаные на php используют не только XHE (кстати для первого умника могу предложить задуматься, как php заставляет XHE что- то делать).

Я просто призываю мыслить шире !!!

Кстати, забавно, но однопоточную версию можно заставить делать одновременно совершенно разные задачи !

Re: Отправка уведомления по ICQ что скрипт отработал

Добавлено: 02 мар 2012, 02:57
satih
Karlson писал(а):Кстати, забавно, но однопоточную версию можно заставить делать одновременно совершенно разные задачи !
в однопоточной можно несколько табов открыть которые будут работать паралельно, может ошибаюсь, но она не потому однопотоком называется. смысл МТ в том что разные хуманы будут иметь отдельные куки и кеш

Re: Отправка уведомления по ICQ что скрипт отработал

Добавлено: 05 мар 2012, 14:17
xscripts
satih писал(а):
Karlson писал(а):Кстати, забавно, но однопоточную версию можно заставить делать одновременно совершенно разные задачи !
в однопоточной можно несколько табов открыть которые будут работать паралельно, может ошибаюсь, но она не потому однопотоком называется. смысл МТ в том что разные хуманы будут иметь отдельные куки и кеш
если даже несколько табов открыть, то всё равно паралельно работать нельзя с ними. для того что бы в открытом табе выполнялось что либо его нужно сделать активным, используя команду $browser->set_active_browser и тогда команды скрипта будут выполняться только в этом активном табе. То есть одновременно в табах нельзя работать...

Можно конечно Single запускать в несколько копий, но куки и прокси будут одни и теже для всех этих запущенных копий.

Re: Отправка уведомления по ICQ что скрипт отработал

Добавлено: 05 мар 2012, 20:41
satih
xscripts писал(а):Можно конечно Single запускать в несколько копий, но куки и прокси будут одни и теже для всех этих запущенных копий.
в этом и заключается разница между версиями, разные куки и кеш (и прокси)

Re: Отправка уведомления по ICQ что скрипт отработал

Добавлено: 14 мар 2012, 13:19
Karlson
satih писал(а):
xscripts писал(а):Можно конечно Single запускать в несколько копий, но куки и прокси будут одни и теже для всех этих запущенных копий.
в этом и заключается разница между версиями, разные куки и кеш (и прокси)
Всё правильно, просто товарищ xscripts забыл, что больше всего времени занимает загрузка страницы, а загрузка страниц- ассинхронна.
Итого имеем:
1) делаем море табов.
2) поочереди делаем в каждом navigate
3) крутимся по табам и проверяем busy ли он
4) если не busy, то делаем своё дело.

Таким образом можно получить регистрацию на 20 форумах одновременно. Куки и кэш мешать не будут (форумы- то разные).
Итого: на single можно получить скорость в 5-20 раз быстрее, нежели чем при использовании одного таба для целого класса задач под XHE. Забавно ?

Нормально !!! Учимся мыслить шире !!! 8)

P.S. Реально убыстряется регистрация, парсинг под пользователем- вообще сказка (залогинился только под одним табом, а работают все, ведь куки одни и те же). Причём для второй задачи получаем решение, которое быстрей будет работать, нежели несколько MT запустить !

Re: Отправка уведомления по ICQ что скрипт отработал

Добавлено: 16 мар 2012, 01:26
xscripts
Karlson писал(а):
satih писал(а):
xscripts писал(а):Можно конечно Single запускать в несколько копий, но куки и прокси будут одни и теже для всех этих запущенных копий.
в этом и заключается разница между версиями, разные куки и кеш (и прокси)
Всё правильно, просто товарищ xscripts забыл, что больше всего времени занимает загрузка страницы, а загрузка страниц- ассинхронна.
Итого имеем:
1) делаем море табов.
2) поочереди делаем в каждом navigate
3) крутимся по табам и проверяем busy ли он
4) если не busy, то делаем своё дело.

Таким образом можно получить регистрацию на 20 форумах одновременно. Куки и кэш мешать не будут (форумы- то разные).
Итого: на single можно получить скорость в 5-20 раз быстрее, нежели чем при использовании одного таба для целого класса задач под XHE. Забавно ?

Нормально !!! Учимся мыслить шире !!! 8)

P.S. Реально убыстряется регистрация, парсинг под пользователем- вообще сказка (залогинился только под одним табом, а работают все, ведь куки одни и те же). Причём для второй задачи получаем решение, которое быстрей будет работать, нежели несколько MT запустить !
Всё равно получается, что выполняется в данный момент один поток. Единственная разница, что мы используем время загрузки страницы для выполнения параллельной задачи. Но в последних версиях загрузка страниц в хумане идёт значительно быстрее, та и организовывать прогулку по табам в поисках загрузившегося, для того что бы выполнять для него дальше действие, тоже дело не простое. Это просто если задачи у скриптов одинаковые, а сайты разные. Куда проще тогда уж запускать несколько версий single и выполнять в них разные задачи :)

Re: Отправка уведомления по ICQ что скрипт отработал

Добавлено: 18 мар 2012, 20:32
Karlson

Всё равно получается, что выполняется в данный момент один поток. Единственная разница, что мы используем время загрузки страницы для выполнения параллельной задачи. Но в последних версиях загрузка страниц в хумане идёт значительно быстрее, та и организовывать прогулку по табам в поисках загрузившегося, для того что бы выполнять для него дальше действие, тоже дело не простое. Это просто если задачи у скриптов одинаковые, а сайты разные. Куда проще тогда уж запускать несколько версий single и выполнять в них разные задачи :)
Не правда !!!
Потоков выполняется ровно столько, сколько загружается страниц плюс один!!! Если откровенно, то гораздо больше.

Приведу пример, весьма абстрактный:
Есть 10 печек от Емелюшки, в каждой печке по пирожку жариться, либо печка пустует.
Задача: как загрузить все печки так, чтобы изжарить максимум пирожков ? Наводка: у каждой печки есть лампочка, которая мигает, когда она всё сделала.

Если у Вас в мозгах "тормоза" и Вы не можете решить простейшую задачу, туда Вам и дорога !!!

P.S. Из- за такого подхода, какой демонстрирует xscripts получается, что лучше денег на MT потратить, нежели научиться думать. Что ж, товарища мама не научила блинчики делать сразу на двух разных сковородках. Мне его жаль. В школе (техникуме/институте/университете, хотя должны были в школе объяснить) ему про оптимизацию работы никто тоже не рассказывал.
Что ж, готовьте бабулесы для xscripts !!!

Re: Отправка уведомления по ICQ что скрипт отработал

Добавлено: 18 мар 2012, 21:47
satih
лол, не кипятись, кому как удобней. для многих серьезно проще купить МТ и не ебать себе мозг, не буду лгать, я один из них :) хотя МТ покупал когда вкладок еще не было и с запуском от разных пользователей не хотел трахатся.

Re: Отправка уведомления по ICQ что скрипт отработал

Добавлено: 19 мар 2012, 13:07
Karlson
satih писал(а):лол, не кипятись, кому как удобней. для многих серьезно проще купить МТ и не ебать себе мозг, не буду лгать, я один из них :) хотя МТ покупал когда вкладок еще не было и с запуском от разных пользователей не хотел трахатся.
Да это я для профилактики ! :D
Просто люди обленились. Когда вкладок не было, то понятно, что выбора не было.
А сейчас получается, что нужно новое покупать, только потому что "модно".
А старое, хотя относительно старое (год и три месяца тому старому)- выкидываем в хлам только потому, что лень подумать.
На самом деле просто хотел заставить людей немного мозгами пошевелить.
Если прикинуть одно к другому (ну к носу другую часть тела), то получается, что за 10 минут размышлений можно использовать на все 100% то, что есть.
Ведь даже MT можно использовать гораздо эффективней, опять же.
Просто чуть- чуть напрячь извилины... :)
Ведь то, что я написал для Single- ПОЛНОСТЬЮ подходит и для MT ! :lol:

Re: Отправка уведомления по ICQ что скрипт отработал

Добавлено: 19 мар 2012, 17:47
bigfozzy
По поводу МТ и Single сейчас все правильно подмечено. Хотя уже как год они называются Advanced и Standart )) Смысл переименования был в том что многие новые фичи будут добавлены тока в Advanced (например отладчик, профалер, генератор exe из скрипта и т.п). Скоро я эти фичи сделаю, тогда отличий будет больше )) А по поводу работы в мультизакладочном режиме - если есть какие предложения могу этот режим развить (команду мож добавить или еще какое излишество :-) ) ?

Re: Отправка уведомления по ICQ что скрипт отработал

Добавлено: 19 мар 2012, 21:13
Karlson
bigfozzy писал(а):По поводу МТ и Single сейчас все правильно подмечено. Хотя уже как год они называются Advanced и Standart )) Смысл переименования был в том что многие новые фичи будут добавлены тока в Advanced (например отладчик, профалер, генератор exe из скрипта и т.п). Скоро я эти фичи сделаю, тогда отличий будет больше )) А по поводу работы в мультизакладочном режиме - если есть какие предложения могу этот режим развить (команду мож добавить или еще какое излишество :-) ) ?
Да в Standart всё есть. Просто никто внимания не обращал на is_busy, да и не заглядовал в исходник wait_for :-)
Просто объектную модель скриптов держите 1:1. Тогда и интерес будет переходить на Advanced, когда всё исчерпалось от Standart, но при переходе не переписывать скрипты.

А так...
Из пожеланий: механизм событий (callback) для таких вещей. Было бы круто !!! Оценили бы единицы, но оценили бы по достоинству !!!

P.S. Вот за три с половиной года никто спасибо и не сказал... :cry:

Re: Отправка уведомления по ICQ что скрипт отработал

Добавлено: 19 мар 2012, 22:38
bigfozzy

Код: Выделить всё

Из пожеланий: механизм событий (callback) для таких вещей. Было бы круто !!! Оценили бы единицы, но оценили бы по достоинству !!!
в 5 есть хуки в полный рост на все события хтмл (как в $raw и $debug), можно будет вмешиваться в модель вызова скриптов и т.п .

Спасибо :-)
Просто объектную модель скриптов держите 1:1
объектная модель будет расширяться и будет везде одинаковая . В адвансед только будет отладчик и больше всякой полезной кухни для удобств работы с дом моделью. Также уже есть прямой выход на работу с интерфейсами DOM. Как закончу 4 думаю к лету успею сделать и 5 в полном объеме что запланировано :-). По объектной модели все таки в 4 еще ее расширю слегка, введу еще пару классов элементов, флш в полный рост и т.п.

Пока первоочередная задача думаю до конца марта баг фикс и стандратизация дом модели, которая ща уже полностью проведена на текущем наборе функций, теперь осталось ее только расширить. Возможно с 4 еще повожусь подольше - будет 4.5 с платой за обновление у кого истек срок обновлений (сейчас присмотрел много хороших компонентов, которые правда стоят нормально денег, но это сильно ускорит разработку)...

PS: И кто активно помогал в поиске и исправлении багов, во первых Большое Спасибо, во вторых обновления получат бесплатно (пока есть 5 кандидатов )) )