显示 html 和正文标记的 MSL 套接字脚本
MSL Socket Script displaying html and body tag
每当 mirc 广播机器人宣布正在播放的歌曲和听众数量时,就会出现一个迷路 html 和 body 标签,如下所示。
广播机器人的代码如下
#announcer on
ctcp *:*:*:{
if ( == SRstats) {
set %sctat.chan $chan
sockclose scstat
sockopen scstat 149.202.90.221 8132
}
}
on *:SOCKOPEN:scstat:{
sockwrite -n $sockname GET /7.html HTTP/1.0
sockwrite -n $sockname User-Agent: Mozilla
sockwrite -n $sockname $crlf
}
on *:sockread:scstat:{
if ($sockerr > 0) return
:nextread
sockread -f %scasttemp
if ($sockbr == 0) return
if (%scasttemp == $null) %scasttemp = empty
set %scasttemp $remove(%scasttemp,<html><head><meta http-equiv="Pragma" content="no-cache"></head><body>,</body></html>)
if ((HTTP/1.* !iswm %scasttemp) && (content-type* !iswm %scasttemp) && (%scasttemp != empty)) {
set %scstat.song.temp $gettok(%scasttemp,7-,44)
set %scstat.bitrate $gettok(%scasttemp,6,44)
set %scstat.listeners $gettok(%scasttemp,1,44)
set %scstat.maxlist $gettok(%scasttemp,4,44)
set %scstat.peak $gettok(%scasttemp,3,44)
if ($gettok(%scasttemp,2,44) == 1) set %scstat.livedj connected
else set %scstat.livedj not connected
; changing some of the html codes back to regular characters
set %scast.song $replace(%scast.song,&,$chr(38),',$chr(39))
}
goto nextread
}
on *:sockclose:scstat:{
if (( %scstat.song.temp == %scstat.song ) || ( %scstat.song.temp == Line Recording )) { goto scstat.end }
else {
set %scstat.song %scstat.song.temp
set %song.msg 6,0 $+ %dj_nick is playing 6 : 12 %scstat.song $+ . 0,1 Tune into Radio-Airwaves, type !radiohelp/4 %scstat.listeners $+ --listeners are tuned in.
; set %chans $chan(0)
; while %chans {
/scid -a msg #Radio-Airwaves-Lounge %song.msg
; dec %chans
; }
:scstat.end
}
}
on *:TEXT:!playing:#: msg $chan %song.msg
#announcer end
我认为第一个修复应该是将 body 标签之间的 , 更改为 html 数字代码,但它只显示数字代码而不是实际的逗号。我也可能有不匹配的 tags/stray 标签,所以我检查一下。我没找到。我还没有看到计费器打开时出现杂散标签的原因。任何帮助将不胜感激。
您尝试从中提取信息的行,<html><body>
在检索到的文本的开头和结尾。
您可以通过使用多种技术设置 %scasttemp
来解决此问题。
- 使用类似脚本的 $nohtml 删除 Html 标签。 - 推荐
- 来自 $right(%text, -12) 的静态子字符串
- 动态查找 body**>** 之后的第一个匹配项,然后对文本的其余部分进行子串处理。
- 使用正则表达式
- 还有更多..
$nohtml
alias nohtml { var %x,%y = $regsub(-,/(<[^>]+>)/g,$null,%x) | return %x }
此外,在处理 sockread
时,我会使用 Tokenize
来处理 $1.. 标识符而不是令牌。
if (!$sockbr || !%scasttemp) {
return
}
tokenize 32 $nohtml(%scasttemp)
;;; Comment out the below line if you still want to use the old variable, otherwise you should change the rest of the code.
;;;set %scasttemp -
;;; Identify the data we wish to extract the information, else return.
if ($numtok(-, 44) < 7) {
return
}
;;; Rest of the code here..
向服务器发送 header 请求,建议在收到信息后关闭连接是一个很好的做法。
sockwrite -n $sockname Connection: close
在收到所有信息后添加 sockclose
是一个很好的约定,而不是让套接字闲逛。 (如果未请求 Connection: close
)
goto nextread
sockclose $sockname
每当 mirc 广播机器人宣布正在播放的歌曲和听众数量时,就会出现一个迷路 html 和 body 标签,如下所示。
广播机器人的代码如下
#announcer on
ctcp *:*:*:{
if ( == SRstats) {
set %sctat.chan $chan
sockclose scstat
sockopen scstat 149.202.90.221 8132
}
}
on *:SOCKOPEN:scstat:{
sockwrite -n $sockname GET /7.html HTTP/1.0
sockwrite -n $sockname User-Agent: Mozilla
sockwrite -n $sockname $crlf
}
on *:sockread:scstat:{
if ($sockerr > 0) return
:nextread
sockread -f %scasttemp
if ($sockbr == 0) return
if (%scasttemp == $null) %scasttemp = empty
set %scasttemp $remove(%scasttemp,<html><head><meta http-equiv="Pragma" content="no-cache"></head><body>,</body></html>)
if ((HTTP/1.* !iswm %scasttemp) && (content-type* !iswm %scasttemp) && (%scasttemp != empty)) {
set %scstat.song.temp $gettok(%scasttemp,7-,44)
set %scstat.bitrate $gettok(%scasttemp,6,44)
set %scstat.listeners $gettok(%scasttemp,1,44)
set %scstat.maxlist $gettok(%scasttemp,4,44)
set %scstat.peak $gettok(%scasttemp,3,44)
if ($gettok(%scasttemp,2,44) == 1) set %scstat.livedj connected
else set %scstat.livedj not connected
; changing some of the html codes back to regular characters
set %scast.song $replace(%scast.song,&,$chr(38),',$chr(39))
}
goto nextread
}
on *:sockclose:scstat:{
if (( %scstat.song.temp == %scstat.song ) || ( %scstat.song.temp == Line Recording )) { goto scstat.end }
else {
set %scstat.song %scstat.song.temp
set %song.msg 6,0 $+ %dj_nick is playing 6 : 12 %scstat.song $+ . 0,1 Tune into Radio-Airwaves, type !radiohelp/4 %scstat.listeners $+ --listeners are tuned in.
; set %chans $chan(0)
; while %chans {
/scid -a msg #Radio-Airwaves-Lounge %song.msg
; dec %chans
; }
:scstat.end
}
}
on *:TEXT:!playing:#: msg $chan %song.msg
#announcer end
我认为第一个修复应该是将 body 标签之间的 , 更改为 html 数字代码,但它只显示数字代码而不是实际的逗号。我也可能有不匹配的 tags/stray 标签,所以我检查一下。我没找到。我还没有看到计费器打开时出现杂散标签的原因。任何帮助将不胜感激。
您尝试从中提取信息的行,<html><body>
在检索到的文本的开头和结尾。
您可以通过使用多种技术设置 %scasttemp
来解决此问题。
- 使用类似脚本的 $nohtml 删除 Html 标签。 - 推荐
- 来自 $right(%text, -12) 的静态子字符串
- 动态查找 body**>** 之后的第一个匹配项,然后对文本的其余部分进行子串处理。
- 使用正则表达式
- 还有更多..
$nohtml
alias nohtml { var %x,%y = $regsub(-,/(<[^>]+>)/g,$null,%x) | return %x }
此外,在处理 sockread
时,我会使用 Tokenize
来处理 $1.. 标识符而不是令牌。
if (!$sockbr || !%scasttemp) {
return
}
tokenize 32 $nohtml(%scasttemp)
;;; Comment out the below line if you still want to use the old variable, otherwise you should change the rest of the code.
;;;set %scasttemp -
;;; Identify the data we wish to extract the information, else return.
if ($numtok(-, 44) < 7) {
return
}
;;; Rest of the code here..
向服务器发送 header 请求,建议在收到信息后关闭连接是一个很好的做法。
sockwrite -n $sockname Connection: close
在收到所有信息后添加 sockclose
是一个很好的约定,而不是让套接字闲逛。 (如果未请求 Connection: close
)
goto nextread
sockclose $sockname