Python IRC机器人链接解析器?
因此,我无法找到关于这个主题的大量信息,但我正在寻找一个示例来解析发布到IRC频道的给定链接。有什么提示/例子吗?我写了一个快速的例子,完全符合你的要求 请随意使用它作为您需求的基础Python IRC机器人链接解析器?,python,hyperlink,bots,irc,Python,Hyperlink,Bots,Irc,因此,我无法找到关于这个主题的大量信息,但我正在寻找一个示例来解析发布到IRC频道的给定链接。有什么提示/例子吗?我写了一个快速的例子,完全符合你的要求 请随意使用它作为您需求的基础 #!/usr/bin/env python from re import findall from circuits import Component from circuits.ne t.events import connect from circuits.net.sockets import TCPCli
#!/usr/bin/env python
from re import findall
from circuits import Component
from circuits.ne t.events import connect
from circuits.net.sockets import TCPClient
from circuits.protocols.irc import ERR_NICKNAMEINUSE
from circuits.protocols.irc import RPL_ENDOFMOTD, ERR_NOMOTD
from circuits.protocols.irc import IRC, PRIVMSG, USER, NICK, JOIN
from requests import get
from lxml.html import fromstring
class Bot(Component):
def init(self, host, port=6667):
self.host = host
self.port = port
TCPClient().register(self)
IRC().register(self)
def ready(self, component):
self.fire(connect(self.host, self.port))
def connected(self, host, port):
self.fire(USER("circuits", host, host, "Test circuits IRC Bot"))
self.fire(NICK("circuits"))
def numeric(self, source, target, numeric, args, message):
if numeric == ERR_NICKNAMEINUSE:
self.fire(NICK("%s_" % args))
if numeric in (RPL_ENDOFMOTD, ERR_NOMOTD):
self.fire(JOIN("#circuits"))
def message(self, source, target, message):
if target[0] == "#":
urls = findall("http[s]?://(?:[a-zA-Z]|[0-9]|[$-_@.&+]|[!*\(\),]|(?:%[0-9a-fA-F][0-9a-fA-F]))+", message) # noqa
if urls:
url = urls[0]
response = get(url)
if response.status_code == 200:
doc = fromstring(response.text)
title = doc.cssselect("title")
if title:
title = title[0].text.strip()
self.fire(
PRIVMSG(
target,
"URL: {0:s} Title: {1:s}".format(
url,
title
)
)
)
else:
self.fire(PRIVMSG(source[0], message))
bot = Bot("irc.freenode.net")
bot.run()
您将需要:
pip install circuits cssselect lxml requests
免责声明:我是电路的开发者
更新:测试结果与预期相符。你的意思是像获得它的标题等?这是一个很好的起点(免责声明:我是开发人员)是的。此外,我已经为bot编程了框架,但我只是在寻找关于它的建议,获取标题并将其传递给频道,以便在单击之前了解链接的内容:P