«Сброс соединения по пиру» при использовании Twitch IRC в Python - PullRequest
1 голос
/ 10 апреля 2019

Я пытаюсь написать своего собственного бота на 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.

1 Ответ

2 голосов
/ 10 апреля 2019

Сам пинг сервера каждые 2 минуты решил проблему.Я только что добавил эту функцию

import time, threading

def sendPing(s):
    print('sending PING')
    s.send("PING :tmi.twitch.tv")
    threading.Timer(120, sendPing, [s]).start()

sendPing(s)

перед основным циклом.

Спасибо ChatterOne за подсказку.

...