PHP и ICQ - проблема авторизации на сервере

vorslov

Guest
PHP и ICQ - проблема авторизации на сервере

Пытаюсь написать программу, которая бы соединялась с сервером ICQ и авторизовавалась на нем.
Есть следущий код...
Проблема:
При первом соединении с сервером получаю запрос на авторизацию, создаю пакет, отправляю его и вот тут должен получить хать какой то ответ от сервера, но... но соединение завершается сервером (судя по ошибке PHP). :(
Может кто сталкивался с этим или увидит в чем проблема.
Заранее благодарен.


PHP:
<?
         error_reporting (E_ALL);
         set_time_limit (0);
         ob_implicit_flush ();



         $UIN='224775055';
         $Password='221459';
         echo '<b>ICQ Connect</b><br><br>';

         $handle = fopen("file.txt", "w");


//////////////////////////////////////////////////////////////////
         echo 'connect login.icq.com:5190<br>';
//         $fp = fsockopen('login.icq.com', 5190, $errno, $errstr, 30) or die("$errstr ($errno)");
//         $Replay=fread($fp, 1024);
         $socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP) or die('error create socet');
         socket_connect($socket, 'login.icq.com', 5190) or die('error connect to login.icq.com:5190');
         $Replay=socket_read($socket, 1024, PHP_BINARY_READ) or die ('error readingfrom socket');

         $array = unpack("c*", $Replay);
         $i=0;
         $DataFromReplay=array();
         foreach ($array as $value){
              if ($i==0) $PaketIdent=$value;
              if ($i==1) $ChanelNumber=$value;
              if ($i==2) $TmpVal=$value;
              if ($i==3) $RandomNuber=$TmpVal*256+$value;
              if ($i==4) $TmpVal=$value;
              if ($i==5) $PaketLength=$TmpVal*256+$value;
              if ($i>5) $DataFromReplay[$i-6]=$value;
              $i++;
         }
         echo '<i>Replay:<br>';
         echo 'Номер пакета: '.dechex($PaketIdent).'<br>';
         echo 'Номер канала: '.dechex($ChanelNumber).'<br>';
         echo 'Случайное число: '.dechex($RandomNuber).'<br>';
         echo 'Длина пакета данных: '.dechex($PaketLength).'<br>';
         echo 'Данные:<br>';
         print_r($DataFromReplay);
         echo '</i><br>';

         if (dechex($PaketIdent)=='0') die('Connection login.icq.com:5190 error!');
//////////////////////////////////////////////////////////////////


         $TVL01=makeTVL(0x01, $UIN);
         $TVL02=makeTVL(0x02, Calc_Pass($Password));
         $TVL03=makeTVL(0x03, '3ICQ Inc. - Product of ICQ (TM).2003a.5.47.1.3800.85');
         $TVL16=makeTVL(0x16, chr(0x01).chr(0x0A));
         $TVL17=makeTVL(0x17, chr(0x00).chr(0x05));
         $TVL18=makeTVL(0x18, chr(0x00).chr(0x2F));
         $TVL19=makeTVL(0x19, chr(0x00).chr(0x01));
         $TVL1A=makeTVL(0x1A, chr(0x0E).chr(0xD8));
         $TVL14=makeTVL(0x14, chr(0x00).chr(0x00).chr(0x00).chr(0x55));
         $TVL0F=makeTVL(0x0F, 'en');
         $TVL0E=makeTVL(0x0E, 'us');

         $SNAC=$TVL01.$TVL02.$TVL03.$TVL16.$TVL17.$TVL18.$TVL19.$TVL1A.$TVL14.$TVL0F.$TVL0E;
         $FLAP=makeFLAP(0x2A, 0x01, $SNAC);


         fwrite($handle, $FLAP);
         fclose($handle);



         echo '<br>send pacet to login.icq.com:5190<br>';

         socket_write($socket, $FLAP) or die ('error writ to socket ('.socket_last_error().'), '.socket_strerror(socket_last_error()));
         sleep(10);
         $Replay1=socket_read($socket, 1024, PHP_BINARY_READ) or die ('error writ to socket ('.socket_last_error().'), '.socket_strerror(socket_last_error()));
         socket_close($socket);


         if (empty($Replay1)) die('no data received from login.icq.com:5190');


         $array1 = unpack("c*", $Replay1);
         $i=0;
         $DataFromReplay=array();
         foreach ($array1 as $value){
              if ($i==0) $PaketIdent=$value;
              if ($i==1) $ChanelNumber=$value;
              if ($i==2) $TmpVal=$value;
              if ($i==3) $RandomNuber=$TmpVal*256+$value;
              if ($i==4) $TmpVal=$value;
              if ($i==5) $PaketLength=$TmpVal*256+$value;
              if ($i>5) $DataFromReplay[$i-6]=$value;
              $i++;
         }
         echo '<i>Replay:<br>';
         echo 'Номер пакета: '.dechex($PaketIdent).'<br>';
         echo 'Номер канала: '.dechex($ChanelNumber).'<br>';
         echo 'Случайное число: '.dechex($RandomNuber).'<br>';
         echo 'Длина пакета данных: '.dechex($PaketLength).'<br>';
         echo 'Данные:<br>';
         print_r($DataFromReplay);
         echo '</i><br>';

//////////////////////////////////////////////////////////////////

function makeFLAP($num, $channel, $data){
         $TmpDat=pack('c', $num);
         $TmpDat.=pack('c', $channel);
         $TmpDat.=pack('S', round(rand(1, 65525)));
         $TmpDat.=pack('c', 0);
         $TmpDat.=pack('c', (strlen($data)*1+3));
         $TmpDat.=chr(0x00).chr(0x00).chr(0x00).chr(0x01);
         $TmpDat.=$data;

//         $array = unpack("c*", $TmpDat);
//         foreach ($array as $value){
//                  echo dechex($value).'<br>';
//         }


         return $TmpDat;
}

function makeTVL($num, $data){
         $TmpDat=pack('c', 0);
         $TmpDat.=pack('c', $num);
         $TmpDat.=pack('c', 0);
         $TmpDat.=pack('c', strlen($data));
         $TmpDat.=$data;

//         $array = unpack("c*", $TmpDat);
//         foreach ($array as $value){
//                  echo dechex($value).'<br>';
//         }

         return $TmpDat;
}

function Calc_Pass($PassIN){
         $pass_tab = array(0xF3,0x26,0x81,0xC4,0x39,0x86,0xDB,0x92,0x71,0xA3,0xB9,0xE6,0x53,0x7A,0x95,0x7C);
         $Result='';
         $i=0;
         $PassINArr = unpack("c*", $PassIN);
         foreach($PassINArr as $value){
             $Result.=pack('c', $value^$pass_tab[$i]);

             $i++;
         }

         return $Result;
}
?>
Работал по инструкции:
http://icq2000cc.hobi.ru/page5.html
http://vic20.blipp.com/pipermail/icq-devel/2003-July/005839.html
http://www.aolhackers.ru/articles/art0001ru.htm
 

Fiva

Держу ZMH
на той стороне модем вешает трубку :)
имхо сервер после того кок первый раз возвращает данные закрывает соединение, а может я и не прав....
 

vorslov

Guest
Если открывать повторно соединение перед посылом информации, то сервер не реагирует на мой информационный блок, а опять присылает запрос на авторизацию, из чего я сделал заключение, что обмен информацией должен продолжаться по первому соединению. Плюс к тому, если взять ГиперТерминал и законнектится через него, то после запроса на авторизацию сервер не отключается еще 30 секунд и только после этого разрывает соединение.
 

fixxxer

К.О.
Партнер клуба
а попробуй посмотреть исходники миранды/sim/gaim/пр...
 
Сверху