Поэтому я пытаюсь обновить следующий код, который отслеживает прослушиватели icecast и shoutcast, потому что когда я обновился до shoutcast 2, он перестал работать, и автор AWOL или, по крайней мере, решил не отвечать.
Теперь я думаю, что решил проблему с кодом регулярного выражения, но он все еще не работает. Что заставляет меня задуматься о том, каким образом код извлекает страницу состояния и новый формат URL, также является проблемой.
В любом случае, я был бы признателен за любую помощь, которую вы можете оказать мне в попытке решить, как это исправить, спасибо!
Исходный код: https://github.com/munin-monitoring/contrib/blob/f444e600c9718ba249d46d3b44d6b6ebaccb0aa3/plugins/network/radio
Старое регулярное выражение из строки 158:
preg_match_all( "/.*?Stream Status: \<\/td\>\<td\>\<b\>\Stream is up at \d*? kbps with (\d*?) of \d*? listeners\<\/b\>\<\/td\>\<\/tr\>/s", $xml, $parser );
Мой первый регулярное выражение:
preg_match_all( "/.*?Stream Status: \<\/font\>\<\/td\>\<td>\<font class\=default\>\<b\>Stream is up at (\d*?) kbps with \<B\>(\d*?) of (\d*?) listeners/s", $xml, $parser );
Код проблемы:
function getShout( $host, $port, $name ) {
$error = false;
$fp = fsockopen( $host, $port, $errno, $errstr, 10 );
if ( !$fp ) {
$error = $errstr ."(". $errno .")";
} else {
fputs( $fp, "GET / HTTP/1.0\r\n" );
fputs($fp, "User-Agent: Mozilla\r\n");
fputs( $fp, "Connection: close\r\n\r\n" );
$xml = "";
while ( !feof( $fp ) ) {
$xml .= fgets($fp, 512);
}
fclose( $fp );
if ( stristr( $xml, "HTTP/1.0 200 OK" ) == true ) {
$xml = trim( substr( $xml, 42 ) );
} else {
$error = "Bad login";
}
if ( !$error ) {
$res = array( "found" => true );
preg_match_all( "/.*?Stream Status: \<\/font\>\<\/td\>\<td>\<font class\=default\>\<b\>Stream is up at (\d*?) kbps with \<B\>(\d*?) of (\d*?) listeners/s", $xml, $parser );
$res["listeners"] = $parser[1][0];
$res["name"] = $name;
} else {
$res = $error;
}
}
return $res;
}
Вывод я получаю от запуска плагина в командной строке …
рок.значение Б
pop.value B
Rap.value B
dnb.value B
psytrance.value B
breaks.value B
dubstep.value B
регги.значение Б
techno.value B
ambient.value B
complete.value 0
Пример страницы статуса shoutcast v1: http://stream.radioamlo.info:8010/
Пример страницы статуса shoutcast v2: http://91.221.151.237:8994/index.html?sid=1
ОБНОВЛЕНИЕ № 1: Мой второй регулярное выражение, которое выглядит лучше:
preg_match_all( "/.*?Stream Status: \<\/font\>\<\/td\>\<td>\<font class\=default\>\<b\>Stream is up at \d*? kbps with \<B\>(\d*?) of \d*?
ОБНОВЛЕНИЕ № 2: Добавление ‘echo $ xml;’ после ‘$ error = «Bad login»;’ возвращает следующую ошибку:
<html><head><title>Redirect</title></head><body>Click <a href="/index.html?sid=1">here</a> for redirect.</body></html>techno.value B
HTTP/1.1 302 Found
Content-Type:text/html;charset=utf-8
Location:index.html?sid=1
Content-Length:118
В соответствии с тем, что вы написали, проблема в том, что место, где вы получаете информацию, изменилось. Сообщение об ошибке, отправленное вами, уже сообщает новое местоположение (перед ним укажите имя хоста).
Я не очень знаком с fsock, бот, я думаю, что он не может справиться с перенаправлениями. Поэтому я бы посоветовал вам использовать вместо cURL: просто придерживайтесь первого примера на руководство cURL. Вывод cURL тогда просто заменяет ваш $xml
, Не забудьте передать GET-информацию ?sid=1
КУРЛ также!
Просто проверьте это, и тогда вы увидите, есть ли еще ошибки в разборе строки. Если да, пожалуйста, напишите «новый $xml
».
Других решений пока нет …