处理消息/websocket处理器

简要描述

  • 添加WebSocket消息处理器,您需要自己实现WebSocket Server。
  • 该类处理器使用长连接,发送完成后不会断开。

请求URL

  • http://127.0.0.1:8888/api/

请求方式

  • POST

参数

参数名必选类型说明
typeint接口编号
protocolint协议类型
urlstring服务器地址

请求示例

有断开重连机制

 {
  "type": 1001,
  "protocol": 3,
  "url": "ws://127.0.0.1:18000"
 }

返回示例

  {
    "data": {
      "status": 0,
      "desc": "",
      "cookie": ""
    }
  }

ws服务器代码示例

import asyncio
import json
import platform
import sys

import requests
import websockets
import websockets.exceptions

if platform.system() == 'Windows':
    asyncio.set_event_loop_policy(asyncio.WindowsSelectorEventLoopPolicy())

loop = asyncio.new_event_loop()
asyncio.set_event_loop(loop)
loop = asyncio.get_event_loop()


class WebsocketServer:
    def __init__(self):
        self.msg_count = 0

    # 调用API
    def send_http(self, data: dict) -> dict:
        r = requests.post(WECHAT_API_URL, json.dumps(data))
        return r.json()

    # 消息处理
    async def server_recv(self, websocket):
        async for message in websocket:
            try:
                self.msg_count += 1
                data = json.loads(message)
                print(data)
            except (json.JSONDecodeError, GeneratorExit):
                pass
            except Exception as ex:
                print("handle err", ex)
            await websocket.send("ok")

    # 握手
    @staticmethod
    async def server_hands(websocket):
        while True:
            recv_text = await websocket.recv()
            print("client: " + recv_text)
            if recv_text == "hello":
                print("connected success")
                await websocket.send("hello")
                return True
            else:
                await websocket.send("connected fail")

    # 握手并且接收数据
    async def server_run(self, websocket, path):
        print(path)
        try:
            await self.server_hands(websocket)
            await self.server_recv(websocket)
        except websockets.exceptions.ConnectionClosedError:
            print("client disconnect")
            sys.exit(0)
        except Exception as ex:
            print("Unknown Error: " + str(ex))


def addCallBackUrl(callBackUrl):
    """
    设置回调地址,当有人发送消息时,微信会就把信息发送到这个接口中
    :param callBackUrl: 回调地址,当有人发送消息时,微信会就把信息发送到这个接口中
    :return:
    """
    # 获取所有的回调地址
    resdatalist = requests.post(WECHAT_API_URL, json={"type": 1003}).json()["data"]["data"]
    # 删除之前的回调地址
    for item in resdatalist:
        requests.post(WECHAT_API_URL, json={"type": 1002, "cookie": item["cookie"]})
    # 设置新的回调地址
    requests.post(WECHAT_API_URL, json={"type": 1001, "protocol": 3, "url": callBackUrl})


WECHAT_API_URL = "http://127.0.0.1:8888/api/"

if __name__ == '__main__':
    # 给微信设置回调地址,当有人给发送消息时,微信会就把信息发送到这个接口中# 给微信设置回调地址,当有人给发送消息时,微信会就把信息发送到ws服务中
    addCallBackUrl("ws://127.0.0.1:18001/websocket/")
    # 启动ws服务器
    wsServer = WebsocketServer()
    server = websockets.serve(wsServer.server_run, "127.0.0.1", 18001, ping_interval=5)
    loop.run_until_complete(server)
    loop.run_forever()

返回参数说明

参数名类型说明
error_codeint错误代码
descriptionstring错误描述
datajson业务数据

备注