Я пытаюсь написать своего собственного бота на Python для подключения и взаимодействия с Twitch-чатом через интерфейс IRC. У меня есть соединение и я могу получать и отправлять данные. Я также отвечаю на входящие PING с помощью PONG (они отправляются примерно через 5 минут). Но примерно через 3 минуты бездействия (так что, прежде чем я даже получу PING), соединение обрывается с
socket.error: [Errno 104] Connection reset by peer
Я использую модуль socket
в Python для подключения. Ошибка возникает при вызове метода recv()
в моем сокете.
Некоторые вещи, которые я смог выяснить:
До того, как соединение не будет установлено, оно не будет входить (без ответа). PING.
Время между последним сообщением в чате и разъединением швов должно быть около 3 минут каждый раз. И этого достаточно, чтобы получить что-то (например, сообщение чата от кого-то еще), чтобы сбросить таймер. Я не должен ничего отправлять сам.
Сначала я подумал, что сам перерываю, потому что долго ничего не получаю. Похоже, что это не так, потому что, если я установлю меньшее время ожидания для socket.recv()
, я получу socket.timeout: timed out
, а не ошибку, показанную выше.
Я думаю, что не пропускаю данные, отправленные мне, потому что все сообщения чата приходят. Но я опубликую свой основной цикл для получения данных ниже, просто чтобы быть уверенным.
Мой вопрос сейчас, почему не удается установить соединение и как я могу предотвратить это?
У меня такое ощущение, что это неопределенный вопрос. Это первый раз, когда я пытаюсь работать с интерфейсом IRC, и я не знаю, как получить больше информации о том, в чем именно проблема.
На всякий случай, вот цикл питания, который я использую для получения данных. Я думаю, что это работает нормально, потому что все сообщения чата приходят. Но, возможно, есть ошибка, и я пропускаю некоторые входящие данные (например, PING).
readbuffer = ''
while True:
readbuffer = readbuffer + s.recv(1024)
temp = string.split(readbuffer, '\n')
readbuffer = temp.pop()
for line in temp:
print(line)
# PING/PONG
if "PING :tmi.twitch.tv" in line:
print("PONG :tmi.twitch.tv")
s.send(line.replace('PING', 'PONG'))
Здесь s
- это socket()
из модуля socket
.