aiowebsocket 报错 asyncio.exceptions.IncompleteReadError: 0 bytes read on a total of 2 expected bytes

用python模拟websocket请求,报错

    async def refund_run_data(self,pnr,uri='wss://endpoint-v4-chatbot.vueling.com/socket.io/?EIO=3&transport=websocket',proxies_type=None):
        """
        
        """
        sessionId = str(uuid.uuid1())
        async with AioWebSocket(uri) as aws:
            converse = aws.manipulator  # 初始化 aiowebsocket 库的连接类
            mes = await converse.send('42["processInput",{"URLToken":"cba92de4473675f50885b02f529f57aa0bb5bd878e9e0d65a4c4a19b62feabcd","channel":"webchat-client","data":{"culture":"en-GB","helpCenterFlow":"RefundAirportTaxes","type":null,"subType":null,"clientTarget":null},"passthroughIP":null,"reloadFlow":false,"resetContext":false,"resetFlow":false,"resetState":false,"sessionId":"session-' + sessionId + '","source":"device","text":"GET_STARTED","userId":"27bca16b-15f4-4827-96b4-ec27e559aee7"}]')
            self.logger.info(f"发送了消息: {mes}")
            # 会话开始
            for i in range(13):
                await converse.receive()

            await converse.send('2')
            mes = await converse.send('42["processInput",{"URLToken":"cba92de4473675f50885b02f529f57aa0bb5bd878e9e0d65a4c4a19b62feabcd","channel":"webchat-client","data":{"culture":"en-GB","helpCenterFlow":"RefundAirportTaxes","type":null,"subType":null,"clientTarget":null},"passthroughIP":null,"reloadFlow":false,"resetContext":false,"resetFlow":false,"resetState":false,"sessionId":"session-' + sessionId + '","source":"device","text":"email","userId":"27bca16b-15f4-4827-96b4-ec27e559aee7"}]')
            self.logger.info(f"发送了消息: {mes}")
            #
            for i in range(6):
                await converse.receive()

            await converse.send('2')
            mes = await converse.send('42["processInput",{"URLToken":"cba92de4473675f50885b02f529f57aa0bb5bd878e9e0d65a4c4a19b62feabcd","channel":"webchat-client","data":{"culture":"en-GB","helpCenterFlow":"RefundAirportTaxes","type":null,"subType":null,"clientTarget":null},"passthroughIP":null,"reloadFlow":false,"resetContext":false,"resetFlow":false,"resetState":false,"sessionId":"session-' + sessionId + '","source":"device","text":"' + str(pnr) + '",''"userId":"27bca16b-15f4-4827-96b4-ec27e559aee7"}]')
            self.logger.info(f"发送了消息: {mes}")
            # 
            for i in range(6):
                mes = await converse.receive()
                print(mes)
            await converse.send('2')
            mes = await converse.send('42["processInput",{"URLToken":"cba92de4473675f50885b02f529f57aa0bb5bd878e9e0d65a4c4a19b62feabcd","channel":"webchat-client","data":{"culture":"en-GB","helpCenterFlow":"RefundAirportTaxes","type":null,"subType":null,"clientTarget":null},"passthroughIP":null,"reloadFlow":false,"resetContext":false,"resetFlow":false,"resetState":false,"sessionId":"session-' + sessionId + '","source":"device","text":"nevergiveup17apr05@qq.com","userId":"27bca16b-15f4-4827-96b4-ec27e559aee7"}]')
            self.logger.info(f"发送了消息: {mes}")
            # 
            for i in range(8):
                mes = await converse.receive()
                mes_str = mes.decode('utf-8')
                if 'value' in mes_str:
                    value_list = re.findall('.*?"value":"(.*?)".*?', mes_str,re.S)
                    global value_str
                    value_str = ','.join(value_list)

                    await converse.send('2')
                    mes = await converse.send('42["processInput",{"URLToken":"cba92de4473675f50885b02f529f57aa0bb5bd878e9e0d65a4c4a19b62feabcd","channel":"webchat-client","data":{"adaptivecards": {"selectedPassengers": "' + value_str + '"}},"passthroughIP":null,"reloadFlow":false,"resetContext":false,"resetFlow":false,"resetState":false,"sessionId":"session-' + sessionId + '","source":"device","text":"","userId":"27bca16b-15f4-4827-96b4-ec27e559aee7"}]')
                    self.logger.info(f"发送了消息: {mes}")
                    # 
                    for i in range(12):
                        await converse.receive()

                    await converse.send('2')
                    mes = await converse.send('42["processInput",{"URLToken":"cba92de4473675f50885b02f529f57aa0bb5bd878e9e0d65a4c4a19b62feabcd","channel":"webchat-client","data":{"culture":"en-GB","helpCenterFlow":"RefundAirportTaxes","type":null,"subType":null,"clientTarget":null},"passthroughIP":null,"reloadFlow":false,"resetContext":false,"resetFlow":false,"resetState":false,"sessionId":"session-' + sessionId + '","source":"device","text":"nevergiveup17apr05@qq.com",''"userId":"27bca16b-15f4-4827-96b4-ec27e559aee7"}]')
                    self.logger.info(f"发送了消息: {mes}")
                    # 
                    for i in range(3):
                        await converse.receive()

                    await converse.send('2')
                    mes = await converse.send('42["processInput",{"URLToken":"cba92de4473675f50885b02f529f57aa0bb5bd878e9e0d65a4c4a19b62feabcd","userId": "27bca16b-15f4-4827-96b4-ec27e559aee7","sessionId": "session-' + sessionId + '","channel": "webchat-client","source": "device","passthroughIP": null,"reloadFlow": false,"resetFlow": false,"resetState": false,"resetContext": false,"text": "","data": {"adaptivecards": {"phonePrefix": "+86","phone": "18611715578"}}}]')
                    self.logger.info(f"发送了消息: {mes}")
                    # 
                    for i in range(11):
                        mes = await converse.receive()
                        mes_str = mes.decode('utf-8')
                        if 'reference' in mes_str:
                            describe = re.findall('.*?reference (.*?). If .*?', mes_str, re.S)[0]
                            self.logger.info(f"返回的个案号: {describe}")
                            return describe
                else:
                    await converse.send('2')
                    mes = await converse.send('42["processInput",{"URLToken":"cba92de4473675f50885b02f529f57aa0bb5bd878e9e0d65a4c4a19b62feabcd","channel":"webchat-client","data":{"culture":"en-GB","helpCenterFlow":"RefundAirportTaxes","type":null,"subType":null,"clientTarget":null},"passthroughIP":null,"reloadFlow":false,"resetContext":false,"resetFlow":false,"resetState":false,"sessionId":"session-' + sessionId + '","source":"device","text":"nevergiveup17apr05@qq.com",''"userId":"27bca16b-15f4-4827-96b4-ec27e559aee7"}]')
                    self.logger.info(f"发送了消息: {mes}")
                    # 
                    for i in range(3):
                        await converse.receive()

                    await converse.send('2')
                    mes = await converse.send('42["processInput",{"URLToken":"cba92de4473675f50885b02f529f57aa0bb5bd878e9e0d65a4c4a19b62feabcd","userId": "27bca16b-15f4-4827-96b4-ec27e559aee7","sessionId": "session-' + sessionId + '","channel": "webchat-client","source": "device","passthroughIP": null,"reloadFlow": false,"resetFlow": false,"resetState": false,"resetContext": false,"text": "","data": {"adaptivecards": {"phonePrefix": "+86","phone": "18611715578"}}}]')
                    self.logger.info(f"发送了消息: {mes}")
                    # 
                    for i in range(15):
                        mes = await converse.receive()
                        mes_str = mes.decode('utf-8')
                        if 'reference' in mes_str:
                            describe = re.findall('.*?reference (.*?). If .*?', mes_str,re.S)[0]
                            self.logger.info(f"返回的个案号: {describe}")
                            return describe


raise exceptions.IncompleteReadError(incomplete, n)
asyncio.exceptions.IncompleteReadError: 0 bytes read on a total of 2 expected bytes

但是这个报错是偶尔会出现,想知道为什么出现以及怎么解决



  1. 确认于服务器交互的心跳交互通讯有没有,你这都是循环receive等待的,如果长时间服务不发送信息,你可能有断连的可能
  2. 尽量保持和浏览器的行为一致,把各种头都给模拟带上,可以参考官方文档

    img

  3. 如果还没解决建议尽早弃坑,从star数,issue数,最后维护时间来看,出现问题可能需要自己研究源码了,试着用其他客户端比如websocket-client

    img

img

想要稳定的,花钱买别人二次封装api的,或者自己对websocket进行二次开发,业界py主流用websocket都是这么干的,
你可以了解下python-socketio

你这个应该是长期不发送信息,读取了0字节发出的报错,你要基于针对长期不发送消息,接受不到数据饭方面去考虑处理了

参考链接

requests.exceptions.ChunkedEncodingError: ('Connection broken: IncompleteRead(0 bytes read)', Incomp_甜甜圈Sweet Donut的博客-CSDN博客_"requests.exceptions.chunkedencodingerror: (\"conn 解决了之前的报错:我的环境:linux_centos python2.7报错情况:Traceback (most recent call last):File "total_flow_count.py", line 89, in <module>query_total_flow()File "total_flow_count.py", line 59, in que... https://blog.csdn.net/qinglingLS/article/details/96476151?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522166752337516782427423282%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fblog.%2522%257D&request_id=166752337516782427423282&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~blog~first_rank_ecpm_v1~rank_v31_ecpm-2-96476151-null-null.nonecase&utm_term=aiowebsocket%20%E6%8A%A5%E9%94%99%20asyncio.exceptions.IncompleteReadError%3A%200%20bytes%20read%20on%20a%20total%20of%202%20expected%20bytes&spm=1018.2226.3001.4450

保持和浏览器的行为一致