所以我试图更新以下代码,该代码监视iccast和shoutcast侦听器,因为当我升级到shoutcast 2时,它停止工作,作者擅离正题或至少选择不回答。
现在我认为我已经解决了正则表达式代码的问题,但它仍然不工作。这使我认为代码检索状态页和新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;
}
我在命令行运行插件得到的输出…
岩石。值B
流行。值B
说唱。值B
dnb。值B
psytrance。值B
优惠。值B
dubstep。值B
雷鬼。值B
电子。值B
环境。值B
完成。值0
v1状态页面示例:http://stream.radioamlo.info:8010/
示例showcast v2状态页面:http://91.221.151.237:8994/index.html?sid=1
UPDATE #1:我的第二个regex看起来更好:
preg_match_all( "/.*?Stream Status: '<'/font'>'<'/td'>'<td>'<font class'=default'>'<b'>Stream is up at 'd*? kbps with '<B'>('d*?) of 'd*?
UPDATE #2:在'$error = "错误登录" '之后添加'echo $xml;'将返回以下错误:
<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-Information ?sid=1
也传递给cURL !
就测试一下,然后你会看到是否有更多关于字符串解析的错误。如果是,请张贴"新$xml
"