显示 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 来解决此问题。

  1. 使用类似脚本的 $nohtml 删除 Html 标签。 - 推荐
  2. 来自 $right(%text, -12) 的静态子字符串
  3. 动态查找 body**>** 之后的第一个匹配项,然后对文本的其余部分进行子串处理。
  4. 使用正则表达式
  5. 还有更多..

$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