如何使用Bash编写的IRC bot从IRC频道读取消息?

时间:2011-05-17 20:10:13

标签: bash irc bots channel

我找不到关于用Bash编写的IRC机器人的大量文档,所以这是我的问题。 我有一个简单的机器人,可以加入一个频道并将信息写入频道。

但是,如何从频道中读取消息,即来自用户的消息?

最终,我希望我的机器人能够识别出一个关键词,它可以让机器人运行并返回一些东西。作为我的机器人的基础,我使用了http://www.blog.tdobson.net/node/174中的脚本。指向我一些有关如何在Bash中编写IRC机器人的有用文档也很棒。

3 个答案:

答案 0 :(得分:2)

保留IRC锥度协议问题由ii解决。

它是一个IRC客户端,它以文本文件(作为日志)生成所有输出,但如果您向这些文件写入(追加行),则实际上是向IRC发送命令。所以这很简单。

我建议使用awk进行文本解析。如果你已经做了复杂的bash脚本,它是一种针对它的语言并且易于学习。

答案 1 :(得分:1)

您指向我们的基本流是tail -f file | telnet foo | while true; do blah; done

此方法将写入文件的数据转换为telnet命令,但没有任何内容从telnet命令获取数据并将其传送到脚本中。

修改循环以支持tail -f file | telnet foo | while read f; do echo "I got message $f"; done为您提供从telnet会话发送给您的数据,然后您可以解析该数据。这个策略的问题在于你不能自发地做任何事情,只是为了响应来自telnet会话的流量。

您可以通过请求超时来解决该问题:

tail -f pingbot.input | telnet irc.freenode.net 6667 | while read -t 2 f || true; do
  echo I got message $f;
done

你会在超时时得到一个空的$ f,如果你收到一条消息就会得到一个完整的$ f。从irc协议解析PRIVMSG输出留给读者练习。

tail | telnet | while read f; do ; done循环不是完成此任务的传统方式。传统上,您可以将telnet设置为协处理(coproc)。但无论哪种方式都可行。

答案 2 :(得分:0)

以下是使用带SSL的ncat(nmap的ncat)的示例:

rm irc_file &> /dev/null
rm BOT_file &> /dev/null
touch irc_file
touch BOT_file

#open a background TCP connection to the IRC server with SSL, start inputting to ncat by reading from a source and piping to it, then redirect output to a place where we can use it

tail -n +1 -f ./irc_file | ncat --ssl irc.fu.bar 6697 >> ./BOT_file &
echo $! > bgproc.pid
sleep .5 

#IRC Protocol stuff

echo PASS 1234 >> ./irc_file            #send pass first per rfc
sleep .5 
echo NICK BOT >> ./irc_file             #send our IRC NICK
echo USER BOT 0 * :BOT >> ./irc_file    # send our IRC USER
sleep 1
echo "JOIN #123" >> ./irc_file          #Join channel "#123"
echo "PRIVMSG #123" Hello! BOT is online! >> ./irc_file #Send message to channel "#123"

tail -f ./BOT_file | while read line #read file BOT_file continuously and pipe into while read loop
    do

       echo $line

        if [[ "$line" = *!testcmd* ]];then  #Look for our first bot cmd
            echo "PRIVMSG #123" Hello! I am a BOT i see your testcmd. >> ./irc_file #Respond if found
        fi

        if [[ "$line" = *PING*irc.fu.bar* ]];then   #if we do nothing the server will ping us   
        echo "PONG" irc.fu.bar >> ./irc_file    #send em a pong back
        echo "PING Received... Sending PONG..."
        fi  

done

当前正在用这样的东西构建一个有趣的小项目。我敢肯定还有一百万种其他方法,但是如果您没有其他参考,该方法将奏效。