2016-06-04 3 views
1

mirc 라디오 봇이 노래를 재생하고 청취자가 얼마 남지 않았는지 알 수 없으면 아래 보이는 것처럼 누락 된 html 및 body 태그가 표시됩니다.HTML 및 본문 태그를 표시하는 MSL 소켓 스크립트

#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 

을 다음과 같이

mirc chat screenshot

라디오 봇 코드는 내가 처음 수정 숫자 코드를 HTML로 body 태그 사이를 변경해야한다고 생각하지만, 그것은 단지 숫자 코드를 표시 실제로는 쉼표가 아닙니다. 나는 또한 아마 일치하지 않는 태그/유실 태그가 있는지 확인할 것이다. 나는 아무것도 찾지 못했다. 나는 accouner가 켜져있을 때 나타나는 표식 태그의 원인을 아직 보지 못했습니다. 모든 도움이 크게 appericated 것입니다.

답변

1

검색된 텍스트의 시작과 끝에 <html><body>에서 정보를 추출하려는 줄을 찾으십시오.

몇 가지 기술을 사용하여 %scasttemp을 설정하면이 문제를 해결할 수 있습니다.

  1. $ nohtml 같은 스크립트를 사용하여 Html 태그를 제거하십시오. - 바로 $에서
  2. Staticly 문자열을 시스템 권장 (% 텍스트는, -12)
  3. 동적으로 몸 후 첫 발생 **> **을 찾아 텍스트의 나머지 부분 문자열.
  4. 를 사용하여 정규 표현식
  5. 그리고 더 많은 ..

$ 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.. 

는 것이 좋습니다. 또한 수신 한 모든 정보를 한 후 sockclose를 추가

sockwrite -n $sockname Connection: close 

대신 놀아주고 소켓을시키는의 좋은 규칙이다. (Connection: close을 요청하지 않은 경우)

goto nextread 
sockclose $sockname 
+0

정확하게 스크립트 소켓을 쓰지 않은 것을 추가하는 방법을 잘 모르겠다. – Nalani

+0

원본 작성자가 – Nalani

+0

일 때 더 길다.'if ($ sockbr == 0) return' 대신에 내가 게시 한 긴 코드 조각을 넣으십시오. 또한 스크립트 파일의 끝에'alias nohtml ... '을 붙여 코드를 작성하십시오. –