【发布时间】:2019-05-11 01:00:12
【问题描述】:
我正在尝试在 Python 3 中创建一个 Twitch 机器人,该机器人将同时监控并向多个频道发送消息。我已经用线程做到了这一点,但它显然对 CPU 要求很高,而且我读过使用 Select() 更有效。下面的代码允许我从多个抽搐频道读取聊天内容,但我不知道如何确定返回为可写的连接是否是我想要写入的连接。
我可以传入具有套接字连接和标识符的对象列表,以便我知道哪些对象作为可写返回?
我已经阅读了许多与使用 select() 以及其他在线资源相关的 stackoverflow 帖子,但是,作为一个业余编码员,我很难理解这一点。
#!/usr/bin/env
import socket
import select
HOST = "irc.chat.twitch.tv"
PORT = 6667
NICK = "channelname"
PASS = 'oauth:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'
CHANNEL = "channelname"
def create_sockets(usr_list):
final_socket_list = []
channels_first_element = 0
channels_last_element = len(usr_list)
for index in range(channels_first_element, channels_last_element):
channel = usr_list[index]
s = socket.socket()
s.connect((HOST, PORT))
s.setblocking(False)
s.send(bytes("PASS " + PASS + "\r\n", "UTF-8"))
s.send(bytes("NICK " + NICK + "\r\n", "UTF-8"))
s.send(bytes("JOIN #" + channel + " \r\n", "UTF-8"))
s.send(bytes('CAP REQ :twitch.tv/membership\r\n'.encode('utf-8')))
s.send(bytes('CAP REQ :twitch.tv/commands\r\n'.encode('utf-8')))
s.send(bytes('CAP REQ :twitch.tv/tags\r\n'.encode('utf-8')))
final_socket_list.append(s)
return final_socket_list
def main():
alive = True
user_list = ['channelone', 'channeltwo', 'channelthree']
user_sockets = create_sockets(user_list)
while alive:
readable, writable, errorreads = select.select(user_sockets, user_sockets, [])
if len(readable) != 0:
for element in readable:
print(str(element.recv(1024), "utf-8"))
if __name__ == "__main__":
main()
【问题讨论】:
标签: python-3.x sockets select irc twitch