PHP . SU
Программирование на PHP, MySQL и другие веб-технологии
Описание: Проблема с подключением
Поиск в теме | Версия для печати
ASHOOT-x86
Отправлено: 06 Сентября, 2008 - 00:13:48
Новичок
Покинул форум
Сообщений всего: 53
Дата рег-ции: Июль 2008
Откуда: Россия, Краснодар
Помог: 0 раз(а)
Всем привет! Скачал я клас для работы с icq и решил написать простого бота, который бы сам пробывал еще и еще раз подключаться к icq. Вот код
PHP:
скопировать код в буфер обмена
<?PHP
include 'icq.php' ;
$icq = new BasICQ( ) ;
$uin = "9871923" ;
$pass = "--ПАРОЛЬ--" ;
if ( @ $icq -> connect ( $uin , $pass ) )
{
}
while ( TRUE )
{
if ( ! $icq -> is_connected ( ) )
{
if ( @ $icq -> connect ( $uin , $pass ) )
{
}
}
}
?>
Все бы ничего, бот пашет если запустить скрипт при наличии или отсутствии подключения к интернету. Бот висит,тоесть работает как мне хотелось бы. Но если не закрывать программу и выполнить переподключение к инету, то бот заново не пробует подключиться, так как метод is_connected() продолжает возващать true (даже при отсутствии подключения к интернету). Что делать? Может в классе какая-то ошибка или я что-то не понимаю? // Заранее благодарен за помощь!
(Добавление)
PHP:
скопировать код в буфер обмена
<?PHP
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 ) {
if ( $this -> socket < 0 || $this -> socket === false ) return false ;
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 ( ) ;
$this -> getpacket ( ) ;
while ( $this -> body != '' ) {
$this -> type = $arr [ 1] ;
$this -> size = $arr [ 2] ;
$info = substr ( $this -> body , 4
, $this -> size ) ; if ( $key ) $this -> info [ $key ] = $info ;
$this -> body = substr ( $this -> body , ( $this -> size + 4
) ) ; }
$this -> body = 0x0000 ;
$pack = $this -> prepare ( ) ;
$this -> socket = false ;
if ( isset ( $this -> info [ 'RECONECT_HERE' ] ) ) { $url = explode ( ':' , $this -> info [ 'RECONECT_HERE' ] ) ; if ( $this -> method ) {
if ( $this -> socket < 0 || $this -> socket === false ) $res = false ;
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 ( ! $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 ( ! $wr ) {
$this -> error = 'Соединение закрыто' ;
return false ;
}
return true ;
}
function is_connected( ) {
if ( $this -> socket ) return true ; else return false ;
}
function send_message( $uin , $message ) {
$this -> request_id ++;
$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 ( ! $wr ) {
$this -> error = 'Не могу отправить сообщение, сервер закрыл соединение' ;
return false ;
}
if ( ! $this -> makeinfo ( ) ) {
$this -> request_id ++;
$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 ( ! $wr ) {
$this -> error = 'Соединение закрыто' ;
return false ;
}
$this -> makeinfo ( ) ;
return false ;
}
return true ;
}
function read_message( ) {
while ( $this -> getpacket ( ) ) {
$body = $this -> body ;
$msg = unpack ( 'nfamily/nsubtype/nflags/Nrequestid/N2msgid/nchannel/cnamesize' , $body ) ; if ( $msg [ 'family' ] == 4&& $msg [ 'subtype' ] == 7) {
$from = substr ( $body , 0
, $msg [ 'namesize' ] ) ; $channel = $msg [ 'channel' ] ;
$body = substr ( $body , $msg [ 'namesize' ] ) ; $msg = unpack ( 'nwarnlevel/nTLVnumber' , $body ) ; for ( $i = 0 ; $i <= $msg [ 'TLVnumber' ] ; $i ++ ) {
$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) {
$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( ) {
$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 ( $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 ;
}
}
?>
-----PHP - рулез
Гость
Отправлено: 06 Сентября, 2008 - 15:31:30
УДАЛЁН
Этот класс Вы сами писали? А откуда брали спецификацию протокола аськи?
А проверить соединения с инетом надо пинговкой или telneтом определенный сайтов, типа Мейла и Гугла. И не забывать про всякие кеши
Champion
Отправлено: 06 Сентября, 2008 - 16:09:03
Активный участник
Покинул форум
Сообщений всего: 4350
Дата рег-ции: Авг. 2008
Откуда: Москва
Помог: 57 раз(а)
JustUserR , Вы не читаете, что пишет
ASHOOT-x86 . Извините за замечание.
По-моему дело вот в этом:
После того, как Dы один раз приконнектились, значние socket вроде никогда больше не изменяется. А isconnected его и проверяет. Получается, что Вам перед каждой проверкой заново приконнектится надо, и проверять после этого. Хотя странновато как-то. Может, я чего недоувидел
Гость
Отправлено: 09 Сентября, 2008 - 09:48:24
УДАЛЁН
Цитата: Но если не закрывать программу и выполнить переподключение к инету, то бот заново не пробует подключиться, так как метод is_connected() продолжает возващать true (даже при отсутствии подключения к интернету). Что делать?
Может я торможу и правда не понимаю, тогда извините. Но как я понимаю человеку надо проверить соединение с интернетом, я сказал как сделать это самфм простым способом. Ведь сервер аськи может висеть (Особенно если IP серый - т.е. один внешний IP на полпу человек, то аська пожет и отвергнуть соедниения)
Поиск в теме | Версия для печати
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Программирование на PHP »
Все гости форума могут просматривать этот раздел. Только зарегистрированные пользователи могут создавать новые темы в этом разделе. Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
Powered by ExBB FM 1.0 RC1. InvisionExBB