@gpfspam

Как преобразовать в Python 3 кодировку?

Доброе время суток!
Пытаюсь наладить общение с сервером через WebSocket
Клиентская часть выглядит следующим образом

#!/usr/bin/env python3

import json
import socket
import random
import hashlib, base64

HOST = '192.168.2.208'  # The server's hostname or IP address
PORT = 8088        # The port used by the server

raw_key = bytes(random.getrandbits(8) for _ in range(16))
key = base64.b64encode(raw_key).decode()

s=socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((HOST, PORT))

request = ("GET /asterisk/ari/events?api_key=test_ari:test_ari&app=ari HTTP/1.1\r\n"
"Host: 192.168.2.208:8088\r\n"
"Upgrade: websocket\r\n"
"Connection: Upgrade\r\n"
"Sec-WebSocket-Key: %s \r\n"
"Origin: http://192.168.2.208\r\n"
"Sec-WebSocket-Version: 13\r\n"
"\r\n"
) % key
s.send(request.encode())

while True:
    data = s.recv(2024)
    if not data:
        s.close()
        break
    data=data.decode('utf-8')
    print (data)


При рукопожатии, сервер отвечает
b'HTTP/1.1 101 Switching Protocols\r\nUpgrade: websocket\r\nConnection: Upgrade\r\nSec-WebSocket-Accept: KYGe09BSgoqVr/5ACVqEjZ9Igyo=\r\n\r\n'


Декодирование происходит корректно
HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Accept: KYGe09BSgoqVr/5ACVqEjZ9Igyo=


Но дальше при событиях на сервере, он отвечает в формате JSON и выдает
b'\x81~\x02`{\n  "type": "Dial",\n  "timestamp": "2019-04-23T20:59:29.627+0500",\n  "dialstatus": "",\n  "forward": "",\n  "dialstring": "1002",\n  "peer": {\n    "id": "1556035169.26",\n    "name": "PJSIP/1002-0000000d",\n    "state": "Down",\n    "caller": {\n      "name": "",\n      "number": ""\n    },\n    "connected": {\n      "name": "",\n      "number": ""\n    },\n    "accountcode": "",\n    "dialplan": {\n      "context": "from-internal",\n      "exten": "s",\n      "priority": 1\n    },\n    "creationtime": "2019-04-23T20:59:29.625+0500",\n    "language": "ru"\n  },\n  "asterisk_id": "00:0c:29:b2:91:db",\n  "application": "ari"\n}'


и тут уже ошибка
Traceback (most recent call last):
  File "./ari.py", line 38, in <module>
    data=data.decode('utf-8')
UnicodeDecodeError: 'utf-8' codec can't decode byte 0x81 in position 0: invalid start byte


Я понимаю, что символы типа x81~\x02 кодировка utf-8 не понимает, я конечно могу поставить другую кодировку, например data=data.decode('cp1251'), тогда ошибки нет, и эти символы преобразуются в Ѓ~
Ѓ~`{
  "type": "Dial",
  "timestamp": "2019-04-23T21:09:56.471+0500",
  "dialstatus": "",
  "forward": "",
  "dialstring": "1002",
  "peer": {
    "id": "1556035796.30",
    "name": "PJSIP/1002-0000000f",
    "state": "Down",
    "caller": {
      "name": "",
      "number": ""
    },
    "connected": {
      "name": "",
      "number": ""
    },
    "accountcode": "",
    "dialplan": {
      "context": "from-internal",
      "exten": "s",
      "priority": 1
    },
    "creationtime": "2019-04-23T21:09:56.469+0500",
    "language": "ru"
  },
  "asterisk_id": "00:0c:29:b2:91:db",
  "application": "ari"
}


Но как мне получить чистую строку JSON, чтобы преобразовать ее в массив и дальше с ним работать? Я думал избавиться от этих символов заменой подстроки по регулярному выражению, но эти символы встречаются не только в начале но и в середине строки. Что посоветуете, возможно у меня не тот подход и задача решается гораздо проще?
  • Вопрос задан
  • 132 просмотра
Пригласить эксперта
Ответы на вопрос 1
Не изобретайте велосипед(если только перед вами не учебная задача стоит)
https://websockets.readthedocs.io/en/stable/
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы