Twitch IRC bot不发送消息

时间:2014-07-26 17:18:16

标签: python sockets bots irc twitch

我试图为我朋友的直播制作一个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

1 个答案:

答案 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 receivedstring.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:]的第一次出现,然后将结肠切掉那个。