Python Twitch 的 IRC 机器人在一个输出中接收两条消息
Python IRC bot for Twitch receiving two messages in one output
所以我为 Twitch.tv 创建了一个聊天机器人,直到几天前它已经运行了好几个月。要么聊天太泛滥,要么 twitch 改变了他们发送消息的方式。无论哪种方式,在接收到的每条消息中,我都会在打印到控制台时添加一个新行,并且一些消息没有添加这一行,这意味着多个消息可以放在一个 irc.recv() 中。我尝试编辑 recv 的大小,但没有成功。这是 irc.recv() 提供的打印图像,以防有帮助。
http://i.stack.imgur.com/pWeGt.jpg
如果您查看中间部分,您会发现这两条消息之间没有 space,这意味着如果第二个人做了一些可禁止的事情,那么第一位用户将被禁止。
如您所见,通过遵循“:nick!nick@nick.tmi.twitch.tv PRIVMSG #channel :”可以很容易地分隔消息,但对于了解此设计的人来说,也很容易滥用机器人并超时任何人。
我希望实现的是一种修改 irc.recv() 的方法,以便它仅且始终只接收一条消息。
这里有几个代码片段,可以更好地理解正在发生的事情。
# -*- coding: utf-8 -*-
import socket
import threading
import datetime
import time
bot_owner = 'asd'
nick = 'asdrobot'
channel = '#asd'
server = 'irc.twitch.tv'
password = 'asd' #login authentication
global irc
irc = socket.socket()
irc.connect((server, 6667)) #connects to the server
irc.send('PASS ' + password + '\r\n')
irc.send('USER ' + nick + ' 0 * :' + bot_owner + '\r\n')
irc.send('NICK ' + nick + '\r\n')
irc.send('JOIN ' + channel + '\r\n')
while True:
senderdata = irc.recv(1024) #gets output from IRC server
sendermessage = '' #Empties variable
senderuser = '' #Empties variable
senderusertemplist = [] #Empties variable
if(senderdata.find('PRIVMSG') != -1):
print senderdata
try:
senderuser = senderdata.split(':')[1]
senderuser = senderuser.split('!')[0] #determines the sender of the messages
except IndexError as e:
senderuser = 'ERRORERROR'
print 'can not split this data'
print e
sendermessage = senderdata.split(channel)[-1]
sendermessage = sendermessage.split(':', 1)[-1]
sendermessagelow = sendermessage.lower()
这些只是最重要的部分,当代码写到这里时,问题已经出现了。
如果无法解决 "fix" 这个问题并且这是 IRC 工作原理的一部分,我很想知道,但如果您知道解决它的方法,我将非常感激。
谢谢。
我决定选择性能 > 安全性,因为在这种情况下安全性并不是什么大问题。这是我解决它的方法:
senderdata = irc.recv(2048) #gets output from IRC server
linecount = senderdata.count('\r\n')
if(linecount == 1):
print senderdata
print "Single message"
tryComment(senderdata)
elif(senderdata.find('tmi.twitch.tv JOIN ' + channel) != -1):
print linecount-1, 'People joined'
elif(senderdata.find('tmi.twitch.tv PART ' + channel) != -1):
print linecount-1, 'People left'
elif(linecount > 1):
print "Multiple messages"
messagelist = []
messagelist = senderdata.split('\r\n')
print len(messagelist)
for i in range(0, len(messagelist)):
if (len(messagelist[i]) > 0):
print messagelist[i]
tryComment(messagelist[i])
print "message number: "
print i
else:
print "This message is empty"
print i
如果有人试图复制此 "solution",则 "tryComment()" 是检查消息的原始主循环。是否有人加入、有人离开或消息为空时忽略检查功能。
所以我为 Twitch.tv 创建了一个聊天机器人,直到几天前它已经运行了好几个月。要么聊天太泛滥,要么 twitch 改变了他们发送消息的方式。无论哪种方式,在接收到的每条消息中,我都会在打印到控制台时添加一个新行,并且一些消息没有添加这一行,这意味着多个消息可以放在一个 irc.recv() 中。我尝试编辑 recv 的大小,但没有成功。这是 irc.recv() 提供的打印图像,以防有帮助。
http://i.stack.imgur.com/pWeGt.jpg
如果您查看中间部分,您会发现这两条消息之间没有 space,这意味着如果第二个人做了一些可禁止的事情,那么第一位用户将被禁止。
如您所见,通过遵循“:nick!nick@nick.tmi.twitch.tv PRIVMSG #channel :”可以很容易地分隔消息,但对于了解此设计的人来说,也很容易滥用机器人并超时任何人。
我希望实现的是一种修改 irc.recv() 的方法,以便它仅且始终只接收一条消息。
这里有几个代码片段,可以更好地理解正在发生的事情。
# -*- coding: utf-8 -*-
import socket
import threading
import datetime
import time
bot_owner = 'asd'
nick = 'asdrobot'
channel = '#asd'
server = 'irc.twitch.tv'
password = 'asd' #login authentication
global irc
irc = socket.socket()
irc.connect((server, 6667)) #connects to the server
irc.send('PASS ' + password + '\r\n')
irc.send('USER ' + nick + ' 0 * :' + bot_owner + '\r\n')
irc.send('NICK ' + nick + '\r\n')
irc.send('JOIN ' + channel + '\r\n')
while True:
senderdata = irc.recv(1024) #gets output from IRC server
sendermessage = '' #Empties variable
senderuser = '' #Empties variable
senderusertemplist = [] #Empties variable
if(senderdata.find('PRIVMSG') != -1):
print senderdata
try:
senderuser = senderdata.split(':')[1]
senderuser = senderuser.split('!')[0] #determines the sender of the messages
except IndexError as e:
senderuser = 'ERRORERROR'
print 'can not split this data'
print e
sendermessage = senderdata.split(channel)[-1]
sendermessage = sendermessage.split(':', 1)[-1]
sendermessagelow = sendermessage.lower()
这些只是最重要的部分,当代码写到这里时,问题已经出现了。
如果无法解决 "fix" 这个问题并且这是 IRC 工作原理的一部分,我很想知道,但如果您知道解决它的方法,我将非常感激。
谢谢。
我决定选择性能 > 安全性,因为在这种情况下安全性并不是什么大问题。这是我解决它的方法:
senderdata = irc.recv(2048) #gets output from IRC server
linecount = senderdata.count('\r\n')
if(linecount == 1):
print senderdata
print "Single message"
tryComment(senderdata)
elif(senderdata.find('tmi.twitch.tv JOIN ' + channel) != -1):
print linecount-1, 'People joined'
elif(senderdata.find('tmi.twitch.tv PART ' + channel) != -1):
print linecount-1, 'People left'
elif(linecount > 1):
print "Multiple messages"
messagelist = []
messagelist = senderdata.split('\r\n')
print len(messagelist)
for i in range(0, len(messagelist)):
if (len(messagelist[i]) > 0):
print messagelist[i]
tryComment(messagelist[i])
print "message number: "
print i
else:
print "This message is empty"
print i
如果有人试图复制此 "solution",则 "tryComment()" 是检查消息的原始主循环。是否有人加入、有人离开或消息为空时忽略检查功能。