在Python-3中运行此脚本时:
#!/usr/bin/python
# -*- coding: utf-8 -*-
import socket
import random
import os
import threading
import sys
class bot(threading.Thread):
def __init__( self, net, port, user, nick, start_chan ):
self.id= random.randint(0,1000)
self.irc = socket.socket ( socket.AF_INET, socket.SOCK_STREAM )
self.irc_connect ( net, port )
self.irc_set_user( user,nick )
self.irc_join( start_chan )
self.finnish=False
threading.Thread.__init__(self)
def run( self ):
while not self.finnish:
serv_data_rec = self.irc.recv ( 4096 )
if serv_data_rec.find ( "PING" ) != -1:
self.irc.send( "PONG"+ serv_data_rec.split() [ 1 ] + "\r\n" )
elif serv_data_rec.find("PRIVMSG")!= -1:
line = serv_data_rec.split( "!" ) [ 0 ] + " :" + serv_data_rec.split( ":" ) [ 2 ]
self.irc_log( line )
self.irc_message( line )
def stop( self ):
self.finnish = True
self.irc_quit()
def irc_connect( self, net, port ):
self.net = net
self.port = port
self.irc.connect ( ( net, port ) )
def irc_set_user( self, user, nick ):
self.user = user
self.nick = nick
self.irc.send( "NICK " + nick + "\r\n" )
self.irc.send( "USER " + user + "\r\n" )
def irc_join( self, chan ):
self.chan = chan
self.irc.send( "JOIN " + chan + "\r\n" )
def irc_message( self, msg ):
self.irc.send( "PRIVMSG " + self.chan+" " + msg + " \r\n" )
def irc_message_nick( self, msg , nick):
self.irc.send( "PRIVMSG " + self.chan+" " + nick + " " + msg + " \r\n" )
def irc_ping( self ):
self.irc.send("PING :" + self.net)
def irc_log( self, line ):
if not os.path.exists("./logs"):
os.makedirs("./logs")
f = open("./logs/" + self.net + self.chan + "#" + "% s" %self.id,'a')
try:
f.write( line )
finally:
f.close()
def irc_quit( self ):
self.irc.send( "QUIT\r\n" )
def irc_quit_msg(self, msg):
self.irc.send( "QUIT :" + msg + "\r\n" )
def main():
bot_main= bot( "irc.freenode.net",6667,"botty botty botty :Python IRC","hello_nick","#martin3333" )
bot_main.start()
while 1:
inp = raw_input()
if inp =="!QUIT":
bot_main.stop()
break
sys.exit(0)
if __name__ == '__main__': main()
我得到以下追溯:
File "./hatebozzer.py", line 84, in <module>
if __name__ == '__main__': main()
File "./hatebozzer.py", line 75, in main
bot_main= bot( "irc.freenode.net",6667,"botty botty botty :Python IRC","hello_nick","#martin3333" )
File "./hatebozzer.py", line 14, in __init__
self.irc_set_user( user,nick )
File "./hatebozzer.py", line 43, in irc_set_user
self.irc.send( "NICK " + nick + "\r\n" )
TypeError: 'str' does not support the buffer interface
我知道在Python 3中字符串的处理方式完全不同,但我并不是要尝试转换字符串或做任何异国情调。 我只是想连接它们,所以我在这里错了什么?
答案 0 :(得分:5)
send
想要一个bytes
序列作为其参数。
在Python2中,"NICK " + nick + "\r\n"
是一个字节序列。
但是在Python3中,它是str
,在Python2中它将被称为unicode
。在Python3中,这不是一个字节序列。
在Python3中,要将str
转换为字节序列,请应用编码:
("NICK " + nick + "\r\n").encode('utf-8')
或(要遵循最佳做法,请使用format
代替+
):
"NICK {n}\r\n".format(n=nick).encode('utf-8')
答案 1 :(得分:2)
您链接的代码是而不是 Python 3兼容。
您正在尝试将Unicode字符串发送到套接字,而该套接字需要bytes
。该代码还使用raw_input()
,在Python 3中将其重命名为input
。
使用Python 2代替运行该代码。