我找不到关于用Bash编写的IRC机器人的大量文档,所以这是我的问题。 我有一个简单的机器人,可以加入一个频道并将信息写入频道。
但是,如何从频道中读取消息,即来自用户的消息?
最终,我希望我的机器人能够识别出一个关键词,它可以让机器人运行并返回一些东西。作为我的机器人的基础,我使用了http://www.blog.tdobson.net/node/174中的脚本。指向我一些有关如何在Bash中编写IRC机器人的有用文档也很棒。
答案 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
当前正在用这样的东西构建一个有趣的小项目。我敢肯定还有一百万种其他方法,但是如果您没有其他参考,该方法将奏效。