MSL Socket脚本显示html和body标签

时间:2016-06-04 21:55:34

标签: mirc

当mirc收音机机器人宣布播放歌曲和听众的数量时,会出现如下所示的迷路html和身体标签。

mirc chat screenshot

无线电机器人的代码如下

#announcer on

ctcp *:*:*:{
  if ($1 == 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

我认为第一个修复应该是改变身体标签之间的html数字代码但是只显示数字代码而不是实际的逗号。我也许有不匹配的标签/流浪标签,所以我检查。我找不到任何东西。当accouner打开时,我还没有看到出现杂散标签的原因。任何帮助都会非常有用。

1 个答案:

答案 0 :(得分:1)

您尝试从检索到的文本的开头和结尾处<html><body>提取信息的行。

您可以使用多种技巧设置%scasttemp来解决此问题。

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

    alias nohtml { var %x,%y = $regsub($1-,/(<[^>]+>)/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 $1- 
    
    ;;; Identify the data we wish to extract the information, else return.
    if ($numtok($1-, 44) < 7) {
        return
    }
    
    ;;; Rest of the code here..
    

    发送到服务器标头请求,建议在收到信息后关闭连接是一种很好的做法。

    sockwrite -n $sockname Connection: close
    

    在收到所有信息后添加sockclose是一个很好的约定,而不是让套接字挂起。 (如果未请求Connection: close

    goto nextread
    sockclose $sockname