2016-10-20 3 views
0

私は、スラックチャンネルを監視するために以下のスクリプトを用意しています。私のスクリプトは何週間もうまく動作しますが、しばらくの間、例外がキャッチされ、 socket is already closedというように表示されます。このエラーでリソースを見つけることができませんが、再接続することはありません。私はこのエラーが永遠に現れたらそれを得続ける。slack apiを使っているときに、Pythonで `socket is already closed 'エラーを避けるにはどうしたらいいですか?

なぜそれが起こっているのか、その解決策は何かを理解したいですか?あなたはのtry-catch-再接続方法でそれをしなければならない

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" 

おかげ

+0

それは長い時間のために正常に動作し、突然ソケット閉じた状態で失敗した場合、ではありませんピアを閉鎖する可能性は高いですか?ただメッセージを記録して、再接続を試みてください。 – moopet

+0

@moopet私はエラーループから抜け出ることはありません。ソケットは永遠に閉じてください。 – igaurav

+0

あなたの例外ハンドラは* anything *をしないので、そうです。あなたは 'try'ブロックの中に接続と処理ループ全体を持ち、例外ハンドラは丁寧な時間を待ってからやり直します。 – moopet

答えて

4

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?") 
関連する問題