Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: PHP + ICQ

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (1): [1]   

> Описание: Проблема с подключением
ASHOOT-x86
Отправлено: 06 Сентября, 2008 - 00:13:48
Post Id



Новичок


Покинул форум
Сообщений всего: 53
Дата рег-ции: Июль 2008  
Откуда: Россия, Краснодар


Помог: 0 раз(а)




Всем привет! Скачал я клас для работы с icq и решил написать простого бота, который бы сам пробывал еще и еще раз подключаться к icq. Вот код
PHP:
скопировать код в буфер обмена
  1. <?PHP
  2. include 'icq.php';
  3. $icq = new BasICQ();
  4. $uin = "9871923";
  5. $pass = "--ПАРОЛЬ--";
  6. if (@$icq->connect($uin, $pass))
  7. {
  8.         sleep(5);
  9. }
  10. while(TRUE)
  11. {
  12.         if (!$icq->is_connected())
  13.         {
  14.                 if (@$icq->connect($uin, $pass))
  15.                 {
  16.                         sleep(5);
  17.                 }
  18.         }
  19.         flush();
  20. }
  21. ?>
Все бы ничего, бот пашет если запустить скрипт при наличии или отсутствии подключения к интернету. Бот висит,тоесть работает как мне хотелось бы. Но если не закрывать программу и выполнить переподключение к инету, то бот заново не пробует подключиться, так как метод is_connected() продолжает возващать true (даже при отсутствии подключения к интернету). Что делать? Может в классе какая-то ошибка или я что-то не понимаю? // Заранее благодарен за помощь!
(Добавление)
PHP:
скопировать код в буфер обмена
  1. <?PHP
  2. class BasICQ {
  3. function BasICQ() {
  4. $this->method=false;
  5. $this->sequence=rand(1,30000);
  6. }
  7. function sockets($method) {
  8. $this->method=$method;
  9. }
  10. function connect($uin,$pass) {
  11. if ($this->method) {
  12. $this->socket=socket_create(AF_INET,SOCK_STREAM,SOL_TCP);
  13. if ($this->socket<0||$this->socket===false) return false;
  14. $result=socket_connect($this->socket,"login.icq.com",80);
  15. if ($result<0||$result===false) return false;
  16. } else {
  17. $this->socket=fsockopen("login.icq.com",80,$errno);
  18. if ($errno!==0) return false;
  19. }
  20. $this->getpacket();
  21. $this->uin=$uin;
  22. $this->body.=$this->setoption('UIN',$uin);
  23. $ar=array(0xF3,0x26,0x81,0xC4,0x39,0x86,0xDB,0x92,0x71,0xA3,0xB9,0xE6,0x53,0x7A,0x95,0x7c);
  24. $hash="";
  25. for ($i=0;$i<strlen($pass);$i++) $hash.=chr($ar[$i]^ord($pass[$i]));
  26. $this->body.=$this->setoption('DATA',$hash);
  27. $this->body.=$this->setoption('CLIENT','HFICQ');
  28. $this->body.=$this->setoption('CLIENT_ID',266,2);
  29. $this->body.=$this->setoption('CLI_MAJOR_VER',20,2);
  30. $this->body.=$this->setoption('CLI_MINOR_VER',34,2);
  31. $this->body.=$this->setoption('CLI_LESSER_VER',0,2);
  32. $this->body.=$this->setoption('CLI_BUILD_NUMBER',2321,2);
  33. $this->body.=$this->setoption('DISTRIB_NUMBER',1085,4);
  34. $this->body.=$this->setoption('CLIENT_LNG','ru');
  35. $this->body.=$this->setoption('CLIENT_COUNTRY','ru');
  36. $this->channel=1;
  37. $pack=$this->prepare();
  38. if ($this->method) socket_write($this->socket,$pack,strlen($pack)); else fwrite($this->socket,$pack);
  39. $this->getpacket();
  40. $this->info=array();
  41. while($this->body!='') {
  42. $arr=unpack('n2',substr($this->body,0,4));
  43. $this->type=$arr[1];
  44. $this->size=$arr[2];
  45. $info=substr($this->body,4,$this->size);
  46. $key=array_search($this->type,$this->types);
  47. if($key) $this->info[$key]=$info;
  48. $this->body=substr($this->body,($this->size+4));
  49. }
  50. $this->body=0x0000;
  51. $pack=$this->prepare();
  52. if ($this->method) socket_write($this->socket,$pack,strlen($pack)); else fwrite($this->socket,$pack);
  53. if ($this->method) socket_close($this->socket); else fclose($this->socket);
  54. $this->socket=false;
  55. if (isset($this->info['RECONECT_HERE'])) {
  56. $url=explode(':',$this->info['RECONECT_HERE']);
  57. if ($this->method) {
  58. $this->socket=socket_create(AF_INET,SOCK_STREAM,SOL_TCP);
  59. if ($this->socket<0||$this->socket===false) $res=false;
  60. $result=socket_connect($this->socket,$url[0],$url[1]);
  61. if ($result<0||$result===false) $res=false; else $res=true;
  62. } else {
  63. $this->socket=fsockopen($url[0],$url[1],$errno);
  64. if ($errno!==0) $res=false; else $res=true;
  65. }
  66. if (!$res) {
  67. $this->error=isset($this->info['DISCONECT_REASON'])?$this->info['DISCONECT_REASON']:'Невозможно сменить север';
  68. return false;
  69. }
  70. } else {
  71. $this->error=isset($this->info['DISCONECT_REASON'])?$this->info['DISCONECT_REASON']:'Превышен лимит подключений';
  72. return false;
  73. }
  74. $this->getpacket();
  75. $this->body.=$this->setoption('COOKIE',$this->info['COOKIE']);
  76. $pack=$this->prepare();
  77. if ($this->method) $wr=socket_write($this->socket,$pack,strlen($pack)); else $wr=fwrite($this->socket,$pack);
  78. if (!$wr) {
  79. $this->error='Соединение закрыто';
  80. return false;
  81. }
  82. $this->getpacket();
  83. $this->request_id++;
  84. $this->body=pack('nnnN',1,2,0,$this->request_id);
  85. $this->body.=pack('n*',1,3,272,650);
  86. $this->body.=pack('n*',2,1,272,650);
  87. $this->body.=pack('n*',3,1,272,650);
  88. $this->body.=pack('n*',21,1,272,650);
  89. $this->body.=pack('n*',4,1,272,650);
  90. $this->body.=pack('n*',6,1,272,650);
  91. $this->body.=pack('n*',9,1,272,650);
  92. $this->body.=pack('n*',10,1,272,650);
  93. $pack=$this->prepare();
  94. if ($this->method) $wr=socket_write($this->socket,$pack,strlen($pack)); else $wr=fwrite($this->socket,$pack);
  95. if (!$wr) {
  96. $this->error='Соединение закрыто';
  97. return false;
  98. }
  99. return true;
  100. }
  101. function is_connected() {
  102. if ($this->socket) return true; else return false;
  103. }
  104. function send_message($uin,$message) {
  105. $this->request_id++;
  106. $cookie=microtime();
  107. $this->body=pack('nnnNdnca*',4,6,0,$this->request_id,$cookie,2,strlen($uin),$uin);
  108. $capabilities=pack('H*','094613494C7F11D18222444553540000');
  109. $data=pack('nd',0,$cookie).$capabilities;
  110. $data.=pack('nnn',10,2,1);
  111. $data.=pack('nn', 15, 0);
  112. $data.=pack('nnvvddnVn',10001,strlen($message)+62,27,8,0,0,0,3,$this->request_id);
  113. $data.=pack('nndnn',14,$this->request_id,0,0,0);
  114. $data.=pack('ncvnva*',1,0,0,1,(strlen($message)+1),$message);
  115. $data.=pack('H*', '0000000000FFFFFF00');
  116. $this->body.=$this->setoption('RECONECT_HERE',$data);
  117. $this->body.=$this->setoption('CLIENT','');
  118. $pack=$this->prepare();
  119. if ($this->method) $wr=socket_write($this->socket,$pack,strlen($pack)); else $wr=fwrite($this->socket,$pack);
  120. if (!$wr) {
  121. $this->error='Не могу отправить сообщение, сервер закрыл соединение';
  122. return false;
  123. }
  124. if (!$this->makeinfo()) {
  125. $this->request_id++;
  126. $cookie=microtime();
  127. $this->body=pack('nnnNdnca*',4,6,0,$this->request_id,$cookie,1,strlen($uin),$uin);
  128. $data=pack('ccnc',5,1,1,1);
  129. $data.=pack('ccnnna*',1,1,strlen($message)+4,3,0,$message);
  130. $this->body.=$this->setoption('DATA', $data);
  131. $this->body.=$this->setoption('CLIENT','');
  132. $this->body.=$this->setoption('COOKIE','');
  133. $pack=$this->prepare();
  134. if ($this->method) $wr=socket_write($this->socket,$pack,strlen($pack)); else $wr=fwrite($this->socket,$pack);
  135. if (!$wr) {
  136. $this->error='Соединение закрыто';
  137. return false;
  138. }
  139. $this->makeinfo();
  140. return false;
  141. }
  142. return true;
  143. }
  144. function read_message() {
  145. while($this->getpacket()) {
  146. $body=$this->body;
  147. if (strlen($body)) {
  148. $msg=unpack('nfamily/nsubtype/nflags/Nrequestid/N2msgid/nchannel/cnamesize',$body);
  149. if ($msg['family']==4&&$msg['subtype']==7) {
  150. $body=substr($body,21);
  151. $from=substr($body,0,$msg['namesize']);
  152. $channel=$msg['channel'];
  153. $body=substr($body,$msg['namesize']);
  154. $msg=unpack('nwarnlevel/nTLVnumber',$body);
  155. $body=substr($body,4);
  156. for ($i=0;$i<=$msg['TLVnumber'];$i++) {
  157. $arr=unpack('n2',substr($body,0,4));
  158. $this->type=$arr[1];
  159. $this->size=$arr[2];
  160. $part=substr($body,4,$this->size);
  161. $body=substr($body,4+$this->size);
  162. if ($channel==1&&$this->type==2) {
  163. while (strlen($part)) {
  164. $frg=unpack('cid/cversion/nsize',substr($part,0,4));
  165. $frg['data']=substr($part,4,$frg['size']);
  166. if ($frg['id']==1&&$frg['version']==1) {
  167. return array('from'=>$from,'text'=>substr($frg['data'],4));
  168. }
  169. $part=substr($part,4+$frg['size']);
  170. }
  171. $message=false;
  172. }
  173. }
  174. }
  175. } else $message=false;
  176. }
  177. return false;
  178. }
  179. function disconnect() {
  180. if ($this->method) socket_close($this->socket); else fclose($this->socket);
  181. $this->socket=false;
  182. }
  183. 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);
  184. var $socet,$channel,$sequence,$body,$uin,$type,$size,$error;
  185. function getpacket() {
  186. if ($this->method) {
  187. if($this->socket&&!socket_last_error($this->socket)) {
  188. $header=socket_read($this->socket, 6);
  189. if ($header) {
  190. $header=unpack('c2channel/n2size',$header);
  191. $this->channel=$header['channel2'];
  192. $this->body=socket_read($this->socket,$header['size2']);
  193. return true;
  194. } else return false;
  195. }
  196. } else {
  197. if($this->socket) {
  198. $header=fread($this->socket,6);
  199. if ($header) {
  200. $header=unpack('c2channel/n2size',$header);
  201. $this->channel=$header['channel2'];
  202. $this->body=fread($this->socket,$header['size2']);
  203. return true;
  204. } else return false;
  205. }
  206. }
  207. }
  208. function makeinfo() {
  209. $this->getpacket();
  210. $array=unpack('n3int/Nint',$this->body);
  211. while ($array['int']!=$this->request_id) {
  212. $this->getpacket();
  213. $array=unpack('n3int/Nint',$this->body);
  214. }
  215. $this->error='Неизвестный ответ сервера';
  216. if ($array['int1']==4) {
  217. switch ($array['int2']) {
  218. case 1:  $this->error='Error to sent message'; return false; break;
  219. case 12: return true; break;
  220. }
  221. }
  222. $this->error='Неизвестный ответ сервера';
  223. return false;
  224. }
  225. function setoption($type,$val,$len=false) {
  226. switch ($len) {
  227. case 1: $format='c'; break;
  228. case 2: $format='n'; break;
  229. case 4: $format='N'; break;
  230. default: $format='a*'; break;
  231. }
  232. if ($len===false) $len=strlen($val);
  233. return pack('nn'.$format,$this->types[$type],$len,$val);
  234. }
  235. function prepare() {
  236. $this->sequence++;
  237. $out=pack('ccnn',0x2A,$this->channel,$this->sequence,strlen($this->body)).$this->body;
  238. return $out;
  239. }
  240. }
  241. ?>


-----
PHP - рулезУлыбка
 
My status
 Top
Гость
Отправлено: 06 Сентября, 2008 - 15:31:30
Post Id


УДАЛЁН










Этот класс Вы сами писали? А откуда брали спецификацию протокола аськи? Улыбка

А проверить соединения с инетом надо пинговкой или telneтом определенный сайтов, типа Мейла и Гугла. И не забывать про всякие кеши
 
 Top
Champion Супермодератор
Отправлено: 06 Сентября, 2008 - 16:09:03
Post Id



Активный участник


Покинул форум
Сообщений всего: 4350
Дата рег-ции: Авг. 2008  
Откуда: Москва


Помог: 57 раз(а)




JustUserR, Вы не читаете, что пишетASHOOT-x86. Извините за замечание.

По-моему дело вот в этом:
PHP:
скопировать код в буфер обмена
  1. function connect($uin,$pass) {
  2. if ($this->method) {
  3. $this->socket=socket_create(AF_INET,SOCK_STREAM,SOL_TCP);

PHP:
скопировать код в буфер обмена
  1. function is_connected() {
  2. if ($this->socket) return true; else return false;
  3. }


После того, как Dы один раз приконнектились, значние socket вроде никогда больше не изменяется. А isconnected его и проверяет. Получается, что Вам перед каждой проверкой заново приконнектится надо, и проверять после этого. Хотя странновато как-то. Может, я чего недоувидел
 
 Top
Гость
Отправлено: 09 Сентября, 2008 - 09:48:24
Post Id


УДАЛЁН










Цитата:
Но если не закрывать программу и выполнить переподключение к инету, то бот заново не пробует подключиться, так как метод is_connected() продолжает возващать true (даже при отсутствии подключения к интернету). Что делать?
Может я торможу и правда не понимаю, тогда извините. Но как я понимаю человеку надо проверить соединение с интернетом, я сказал как сделать это самфм простым способом. Ведь сервер аськи может висеть (Особенно если IP серый - т.е. один внешний IP на полпу человек, то аська пожет и отвергнуть соедниения)
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Программирование на PHP »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB