我一直试图编写一个IRC机器人,而我已经成功了。我在实现我想做的事情时遇到了问题。代码工作正常,但我有以下问题:
因为机器人使用While循环来读取来自IRC的命令,当我添加第二个时,使用time.sleep(秒),机器人没有连接,因为它读取我的第二个循环并暂停连接不及时响应:PING做它断开连接。我一直在寻找,但是我觉得我觉得比较困惑,因为我不知道该怎么办。
无堆栈,多线程,子进程。有这么多的结果让我更加困惑。那么什么是最好的方法我尝试一个RSS机器人机器人工作正常,如果我使用命令!rss在IRC通道但我需要它检查新的10分钟,如果使用睡眠命令主循环混乱起来。
这是我的代码:
#!/usr/bin/python
import socket, sys, string, time, feedparser, hashlib
port = 6667
nick = "RSSbot"
host = 'irc.server.com'
name = "RSSBOT"
channel = '#debug'
ident = 'rssbot'
irc = socket.socket()
irc.connect ( (host, port) )
irc.send ( 'NICK ' + nick + '\r\n' )
irc.send ( 'USER ' + ident + ' ' + ident + ' ' + ident + ' :rssbot\r\n' )
def readRss():
feedurl = feedparser.parse("http://api.twitter.com/1/statuses/user_timeline.rss?screen_name=username")
newest = feedurl['items'][0].title
newest = newest.replace("username:","")
msg = newest.split("http://")
title = msg[0]
url = msg[1]
url = "http://" + url
e = feedurl.entries[2]
threadurl = e.link
id = hashlib.md5(url + title).hexdigest()
irc.send ("PRIVMSG #debug :Tittle:%s\r\n" % newest)
irc.send ("PRIVMSG #debug :URL: %s\r\n" % url)
irc.send ("PRIVMSG #debug :MD5: %s\r\n" % id)
while 1:
data = irc.recv ( 1024 )
print(data)
if data.find ( '376' ) != -1:
irc.send( 'JOIN ' + channel + '\r\n' )
if data.find ( 'PING' ) != -1:
irc.send( 'PONG ' + data.split() [1] + '\r\n')
if data.find ( '!rss' ) != -1:
feedurl = feedparser.parse("http://api.twitter.com/1/statuses/user_timeline.rss?screen_name=username")
newest = feedurl['items'][0].title
newest = newest.replace("username:","")
msg = newest.split("http://")
title = msg[0]
url = msg[1]
url = "http://" + url
#e = feedurl.entries[2]
#threadurl = e.link
id = hashlib.md5(url + title).hexdigest()
irc.send ("PRIVMSG #debug :Tittle:%s\r\n" % newest)
irc.send ("PRIVMSG #debug :URL: %s\r\n" % url)
irc.send ("PRIVMSG #debug :MD5: %s\r\n" % id)
while true:
readRss()
time.sleep(300)
如果我添加一个while:true在while 1中:使用time.sleep(300)sleep命令与while 1:loop冲突,我需要做类似的事情,所以我可以每x分钟检查一次新的feed 。我该怎么办?
答案 0 :(得分:3)
使用单独的计时器而不是新的循环。
import time
last_update = time.time()
while 1:
# the rest of your while loop as usual
now = time.time()
if now - last_update > 300:
# you've waited 300 seconds
# check feeds or whatever
last_update = now
答案 1 :(得分:0)
我在我的irc bot上使用线程模块处理了这个问题,检查项目这可能对你有帮助https://github.com/mouuff/MouBot(我打电话给fonction ircloop这将回答服务器ping并做botting的事情:)