我试图为我朋友的直播制作一个Twitch机器人,我在发送消息(或识别命令)方面遇到了一些问题。
我的代码:
import socket,string
HOST = "irc.twitch.tv"
PORT = 6667
NICK = "Axiom"
IDENT = "Axiom"
REALNAME = "Axiom"
CHANNEL = "#itwreckz"
PASSWORD = "oauth:PASSHERE"
readbuffer = ""
print "Connecting.."
t = socket.socket()
t.connect((HOST, PORT))
print "Connected! Logging in"
t.send("PASS %s\r\n" % PASSWORD)
t.send("NICK %s\r\n" % NICK)
t.send("USER %s %s BOT :%s\r\n" % (IDENT, HOST, REALNAME))
print "Logged in. Joining Channel"
t.send("JOIN %s\r\n" % CHANNEL)
print "JOINED!"
while 2>1:
readbuffer = readbuffer+t.recv(1024)
taco = string.split(readbuffer, "\n")
readbuffer = taco.pop()
for line in taco:
line=string.rstrip(line)
line=string.split(line)
if len(line) > 3:
print line
command = line
if "!test" in command:
print "If you see this, it recognizes command." #Doesn't show
t.send("PRIVMSG %s :IT WORKS!\r\n" % CHANNEL) #This either
if(line[0]=="PING"):
t.send("PONG %s\r\n" % line[1])
有谁知道我可以搞砸了?
if len(line) >3:
有效,因为它会显示在聊天中发送的消息(仅当消息超过3个字符时)。所以我猜我把那些东西设置得很好。它打印消息等。
我似乎无法让命令工作。
编辑:这是一个非常古老的帖子,但我想指出我最终重新制作整个IRC机器人以更好地工作。
对于任何可能感兴趣的人:
import socket,time
network = 'irc.example.net'
port = 6667
channels = ['#Channel1','#Channel2'] #Add as many as you want
nick = 'myIRCBot'
identify = True
password = 'superAwesomePassword'
irc = socket.socket (socket.AF_INET, socket.SOCK_STREAM)
print "Connecting to "+network+" ..."
irc.connect ((network, port))
print "Changing nick to "+nick+"..."
irc.send ('NICK '+nick+'\r\n')
if identify == True:
print "Verifying password..."
irc.send("PASS %s\n" % (password))
print "Setting login data..."
irc.send ('USER '+nick+' '+nick+' '+nick+' :'+nick+' IRC\r\n')
time.sleep(1)
for channel in channels:
print "Joining "+channel+"..."
irc.send ('JOIN '+channel+'\r\n')
irc.send ('PRIVMSG '+channel+' :'+nick+' Started! Type .help for more\r\n')
time.sleep(1)
print nick+" bot started."
while True:
data = irc.recv(4096)
if data.find('PING') != -1:
irc.send('PONG '+data.split()[1]+'\r\n')
try:
user = data.split("!",1)[0].replace(":","",1)
vhost = data.split(" ",1)[0].split("!",1)[1]
dType = data.split(" ",1)[1].split(" ",1)[0]
chan = data.split(" ",1)[1].split(" ",1)[1].split(" ",1)[0]
msg = data.split(" ",1)[1].split(" ",1)[1].split(" ",1)[1].replace(":","",1).replace("\n","",1).replace("\r","",1)
if msg == '.help':
irc.send ('PRIVMSG '+chan+' :This is the only command!\r\n')
print user+" ("+vhost+") "+dType+" to "+chan+": "+msg
except:
pass
答案 0 :(得分:1)
在第line=string.rstrip(line)
行,您将从该行中删除尾随空格。在下一行line=string.split(line)
,您将该行拆分为单词。在此之后,line
是邮件中每个单词的列表。因此,实际上当您检查len(line) > 3
时,您需要检查该行是否包含三个以上的字词。
当您想从IRC消息中提取命令时,最简单(尽管不是完全可靠)的方法是抓住您现在拥有的单词列表的第一个元素,就像您检查{{1} }。在这种情况下," PING"是命令。
现在,如果您不是指IRC协议命令,而是指其他用户作为消息发送的命令,那就是另一个故事。收到的所有邮件 - 私人或频道 - 都遵循以下格式:
if line[0] == "PING"
因此,如果您正在查找来自PRIVMSG <message target> :<message received>
部分中包含"!test"
的其他用户的邮件。最有可能发生的事情是message received
,string.split(line)
部分的第一个单词是message received
,而不只是":!test"
。如果你想让整个IRC privmsg的消息部分保持完整,你真正需要做的是寻找冒号并抓住那之后的一切,即
"!test"
words = line.split()
if words[0] == "PRIVMSG":
message = line[line.find(":"):][1:]
message_words = message.split()
if "!test" in message_words:
print "If you see this, it recognizes the command"
行有点乱,但发生的一切都是我在行中找到message = line[line.find(":"):][1:]
的第一次出现,然后将结肠切掉那个。