如何使用 Bash 编写的 IRC 机器人从 IRC 频道读取消息?
Posted
技术标签:
【中文标题】如何使用 Bash 编写的 IRC 机器人从 IRC 频道读取消息?【英文标题】:How to read messages from an IRC channel using an IRC bot written in Bash? 【发布时间】:2011-08-27 13:08:06 【问题描述】:我找不到太多关于用 Bash 编写的 IRC 机器人的文档,所以这是我的问题。 我有一个简单的机器人,可以加入频道并将消息写入频道。
但是,我如何阅读来自频道的消息,即来自用户的消息?
最终,我希望我的机器人能够识别一个关键字,该关键字将使机器人启动并返回一些内容。作为我的机器人的基础,我使用了来自http://www.blog.tdobson.net/node/174 的脚本。向我指出一些关于如何在 Bash 中编写 IRC 机器人的有用文档也很好。
【问题讨论】:
虽然在 bash 中编写 IRC 机器人是一种奇怪的新奇事物,但它实际上并没有什么用处。帮自己一个忙,选择适合此目的的真正编程语言。 我意识到 Python 会是一个更好的选择,但是我已经有一段时间没有用 Python 写过东西了。我只是更习惯于 Bash。 @MartinP 说真的,为此使用 bash 几乎没有意义。你为工作使用错误工具的论点是你有一段时间没有使用正确的工具了..ii
和 sic
您可能会感兴趣。
@Nick:仅仅因为它是错误的工具,并不意味着它不能完成这项工作:) 我认为学习 Bash 的网络方面和 IRC 机器人是很好的正是我可以开始的地方。但我发现我在这里没有得到任何实际帮助:-/ 感谢 hinrik 为这两个客户!
【参考方案1】:
将IRC连接协议问题留给ii解决。
它是一个 IRC 客户端,它在文本文件(作为日志)中生成所有输出,但是如果您向这些文件写入(附加行),您实际上是在向 IRC 发送命令。所以很简单。
我建议使用awk
进行文本解析。如果您已经编写了复杂的 bash 脚本,那么它就是一种旨在实现此目的的语言,并且易于学习。
【讨论】:
【参考方案2】:您指向我们的基本信息流是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 会话的流量。
您可以通过请求超时来解决这个问题:
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)。但无论哪种方式都可能有效。
【讨论】:
以上是关于如何使用 Bash 编写的 IRC 机器人从 IRC 频道读取消息?的主要内容,如果未能解决你的问题,请参考以下文章
Twisted Python IRC bot - 如何异步执行函数以便它不会阻塞机器人?