【问题标题】:Send a private message to an IRC bot向 IRC 机器人发送私人消息
【发布时间】:2012-09-21 01:49:18
【问题描述】:

我有一个 php 脚本可以加入这个 IRC 服务器上的频道:irc.worldnet.net 感谢服务器的响应,我可以说我成功加入了频道,并且机器人在用户列表中。但是,这个命令:

MSG bot_nickname hello my friend !

发出“消息:未知命令”响应。 当我发送此行时:

PRIVMSG bot_nickname : hello my friend !

机器人没有响应(反正我没有任何错误消息)。 我发送的命令有问题吗?

这是我使用的 php 代码:

<?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
} 

?>

所以我听从了你的建议。这是我得到的日志:

[RECEIVE] :cesame1582!~cesame158@Wnet-59540.41.55.213.rev.sfr.net 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] :Global!Services@Worldnet.Net 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] :Global!Services@Worldnet.Net 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] :Global!Services@Worldnet.Net 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] :Global!Services@Worldnet.Net 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] :Global!Services@Worldnet.Net NOTICE cesame1582 :[Random News - Apr 24 2004] Pour avoir de l'aide sur les commandes des services, visitez http://help.irc.worldnet.net 
[RECEIVE] :NickServ!Services@Worldnet.Net 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 

【问题讨论】:

  • 您期待什么响应?我在这里看不到任何可以让您的机器人响应该消息的内容。
  • 这一行:SendCommand('PRIVMSG Daneel : .challenge_caesar start' . "\n\r");我想将“Daneel”“.challenge_caesar start”作为私人消息发送给机器人请参阅最底部的SendCommand函数。谢谢你的帮助:)
  • 好吧,为什么服务器会给你一个空字符串?它有时会发生,但这并不意味着机器人处于空闲状态。相反,您应该在知道机器人加入频道后立即发送命令(在 NAMES 列表的末尾)。
  • 我希望一个随机字符串作为响应
  • if(trim($server['READ_BUFFER']) == "" &amp;&amp; $channel_joined &amp;&amp;!$msg_sent) { 为什么$server['READ_BUFFER'] 会是空的?

标签: php bots irc


【解决方案1】:

IRC 服务器一般不会发送空字符串。

如果您希望在 BOT 进入频道后发出命令,您应该在知道它在频道中时立即发送它,该频道位于 /NAMES 列表的末尾,或者一旦您收到TOPIC


另外,PRIVMSG 的语法如下:

PRIVMSG <NICKNAME> :<MESSAGE>

: 后面没有空格。如果接收端设置为响应.command 但得到 .command,则可能是问题所在。

【讨论】:

  • 好的,在抑制多余的空格字符后,我从机器人那里得到了答案。非常感谢大家!
猜你喜欢
  • 2014-09-18
  • 2019-06-13
  • 2019-10-28
  • 1970-01-01
  • 2018-10-07
  • 2020-12-05
  • 2017-06-04
  • 2019-09-19
  • 1970-01-01
相关资源
最近更新 更多