2012-09-29 1 views
0

이 IRC 서버의 채널에 가입하는 PHP 스크립트가 있습니다 : irc.worldnet.net 서버 응답 덕분에 채널에 성공적으로 가입했다고 말할 수 있습니다. 사용자 목록에 있습니다. 그러나이 명령은 다음과 같습니다.IRC 로봇에 개인 메시지 보내기

MSG bot_nickname hello my friend ! 

은 'msg : unknown command'응답을 발행합니다. 봇에서 응답이 없습니다

PRIVMSG bot_nickname : hello my friend ! 

(I 어쨌든 오류 메시지가없는) : 나는이 줄을 보낼 때. 보내시는 명령에 문제가 있습니까?

<?php 

$channel_sent = false; 
$channel_joined = false; 
$msg_sent = false; 
set_time_limit(0); 
ini_set('display_errors', 'on'); 

$config = array(
    'server' => 'irc.worldnet.net', 
    'port' => 6667, 
    'nick' => 'cesame'.rand(), 
    'channel' => '#nc-irc-challs' 
); 

$server = array(); 
$server['SOCKET'] = @fsockopen($config['server'], $config['port'], $errno, $errstr, 2); 

if($server['SOCKET']) 
{ 
    SendCommand("PASS NOPASS\n\r"); 
    SendCommand("NICK " . $config['nick'] . "\n\r"); 
    SendCommand("USER " . $config['nick'] . " USING PHP IRC\n\r");  
    SendCommand("JOIN " . $config['channel'] . "\n\r"); 

    while(!feof($server['SOCKET'])) { 
      ReadServer(); 
      flush(); 
      sleep(1); 
    } 
} 

function ReadServer(){ 
    global $server; 
    global $config; 
    global $channel_joined; 
    global $channel_sent; 
    global $msg_sent; 
    $server['READ_BUFFER'] = fgets($server['SOCKET'], 1024); 
    echo "[RECEIVE] ".$server['READ_BUFFER']."<br>\n\r"; 

    if(substr($server['READ_BUFFER'], 0, 6) == "PING :") { 
     SendCommand("PONG :".substr($server['READ_BUFFER'], 6)."\n\r"); 
    } 
    if(strpos($server['READ_BUFFER'], "#nc-irc-challs :End of /NAMES list")){ 
     $channel_joined = true; 
    } 
    if(trim($server['READ_BUFFER']) == "" && $channel_joined &&!$msg_sent) { 
     SendCommand('PRIVMSG Daneel : .challenge_caesar start' . "\n\r"); 
     $msg_sent = true; 
    } 
} 

function SendCommand ($cmd) 
{ 
    global $server; //Extends our $server array to this function 
    @fwrite($server['SOCKET'], $cmd, strlen($cmd)); //sends the command to the server 
    echo "[SEND] $cmd <br>"; //displays it on the screen 
} 

?> 

그래서 내가 당신에게 조언을 따랐다 : 여기

은 내가 사용하는 PHP 코드입니다. 이것은 내가 얻는 로그입니다 :

[RECEIVE] :[email protected] JOIN :#nc-irc-challs 
[RECEIVE] :Vidar.IRC.Worldnet.Net 332 cesame1582 #nc-irc-challs :NewbieContest -- http://www.newbiecontest.org/ (channel officiel : #newbiecontest) -- Rappel : aucune épreuve ne peut se résoudre en bruteforce. 
[RECEIVE] :Vidar.IRC.Worldnet.Net 333 cesame1582 #nc-irc-challs zours 1195848644 
[RECEIVE] :Vidar.IRC.Worldnet.Net 353 cesame1582 = #nc-irc-challs :cesame1582 \o_ @Eole +Daneel 
[RECEIVE] :Vidar.IRC.Worldnet.Net 366 cesame1582 #nc-irc-challs :End of /NAMES list. 
[SEND] PRIVMSG Daneel : .challenge_caesar start 
[RECEIVE] :[email protected] NOTICE cesame1582 :[Logon News - Apr 07 2004] Use irc.worldnet.net to join our network, thanks | Dorenavant, utilisez irc.worldnet.net pour joindre notre reseau, merci. 
[RECEIVE] :[email protected] NOTICE cesame1582 :[Logon News - Jan 07 2007] If you see a connection on port 23, 1080, 3128 or 8080 from 194.117.194.78 this is NOT an attack! It's our insecure proxy detector. 
[RECEIVE] :[email protected] NOTICE cesame1582 :[Logon News - Feb 07 2007] Vous pouvez utiliser le port 7000 pour une connexion en SSL. You can use port 7000 with a secure SSL connection. 
[RECEIVE] :[email protected] NOTICE cesame1582 :[Logon News - Oct 14 2009] Salons officiels du reseau Worldnet : #worldnet - #help pour de l'aide sur IRC et l'informatique en general. - ##opers pour les problemes réseau spécifiques à Worldnet. 
[RECEIVE] :[email protected] NOTICE cesame1582 :[Random News - Apr 24 2004] Pour avoir de l'aide sur les commandes des services, visitez http://help.irc.worldnet.net 
[RECEIVE] :[email protected] NOTICE cesame1582 :Your nick isn't registered. 
[RECEIVE] 
[RECEIVE] PING :Vidar.IRC.Worldnet.Net 
[SEND] PONG :Vidar.IRC.Worldnet.Net 
[RECEIVE] 
[RECEIVE] PING :Vidar.IRC.Worldnet.Net 
[SEND] PONG :Vidar.IRC.Worldnet.Net 
+0

예상되는 응답은 무엇입니까? 나는 당신의 로봇이 그 메시지에 반응하게 할만한 것을 보지 못했습니다. –

+0

이 줄은 입니다. SendCommand ('PRIVMSG Daneel : .challenge_caesar start'. "\ n \ r"); 봇 "Daneel" ".challenge_caesar start"를 개인 메시지로 보내려고합니다. 맨 아래의 SendCommand 기능을 참조하십시오. 도움을 주셔서 감사합니다 :) – user1079988

+0

그래, 왜 서버가 당신에게 빈 문자열을 보내겠습니까? 때때로 발생하지만 봇이 유휴 상태 인 것은 아닙니다. 대신, 보트가 채널에 가입했다는 것을 알게되면 (NAMES 목록 끝 부분에서) 명령을 보내야합니다. –

답변

2

IRC 서버는 일반적으로 빈 문자열을 보내지 않습니다.

BOT가 채널에있는 명령을 실행하려면 채널에 있음을 알게되는 즉시 (즉, /NAMES 목록 끝 부분) 명령을 보내야합니다. TOPIC.

PRIVMSG <NICKNAME> :<MESSAGE> 

: 후의 공간없이 다음과 같이


또한 PRIVMSG위한 구문이다. 수신 끝이 .command에 응답하도록 설정되었지만  .command이되면 문제 일 수 있습니다.

+0

Ok는 여분의 공백 문자를 제거한 후, 봇으로부터 답을 얻습니다. 여러분 모두에게 고마워요! – user1079988