使用slack api时,如何在python中避免`socket已经关闭`错误?

iga*_*rav 0 python sockets python-2.7 slack-api

我有以下脚本来监视松弛通道.我的脚本运行好几个星期,但有一段时间我得到一个异常被捕获的打印为 socket is already closed.我无法找到此错误的资源,但它永远不会重新连接.一旦出现,我会一直收到这个错误.

我想了解它为什么会发生以及它的解决方案是什么?

import os
import time
from slackclient import SlackClient

# constants
BOT_ID = os.environ["LOUD_BOT_ID"]
LOUD_BOT_TOKEN = os.environ["LOUD_BOT_TOKEN"]
AT_BOT = "<@" + BOT_ID + ">"

slack_client = SlackClient(os.environ["LOUD_BOT_TOKEN"])

def parse_slack_output(rtm_read_output):
    output_list = rtm_read_output
    if output_list and len(output_list) > 0:
        for output in output_list:
            if output and "text" in output and AT_BOT in output["text"]:
                return (
                    output["text"].split(AT_BOT)[1].strip(),
                    output["channel"],
                    output["user"]
                )
    return None, None, None

if __name__ == "__main__":
    READ_WEBSOCKET_DELAY = 1
    if slack_client.rtm_connect():
        print "Bot is up and running..."
        while True:
            try:
                message, channel, sender_user_id = parse_slack_output(
                    slack_client.rtm_read()
                )
                print message, channel, sender_user_id
                time.sleep(READ_WEBSOCKET_DELAY)
            except Exception as e:
                print e
                time.sleep(READ_WEBSOCKET_DELAY)
    else:
        print "Couldn't connect bot, please check bot's token and ID"
Run Code Online (Sandbox Code Playgroud)

谢谢

小智 5

您必须以try-catch-reconnect方式执行此操作:

if __name__ == "__main__":
    reload(sys)
    sys.setdefaultencoding('utf-8')
    READ_WEBSOCKET_DELAY = 1
    if slack_client.rtm_connect():
        print("jfbot connected and running!")
        while True:
            try:
                command, channel = parse_slack_output(slack_client.rtm_read())
                if command and channel:
                    handle_command(command, channel)
                time.sleep(READ_WEBSOCKET_DELAY)
            except WebSocketConnectionClosedException as e:
                print e
                print 'Caught websocket disconnect, reconnecting...'
                time.sleep(READ_WEBSOCKET_DELAY)
                slack_client.rtm_connect()
            except Exception, e:
                print e
                time.sleep(READ_WEBSOCKET_DELAY)
    else:
        print("Connection failed. Invalid Slack token or bot ID?")
Run Code Online (Sandbox Code Playgroud)