WuKongIM Docs

Python 快速接入

按准备、安装、连接、收发和清理顺序完成首次接入。

编辑此页报告文档问题

使用 Python 3.11+、asyncio 和 PyPI 0.1.0 完成在线收发。每个客户端属于一个事件循环。

1. 准备接入

认证与 Token让受信业务后端分别提供两人的 uidtokenwebsocketUrl。客户端只连接 Gateway,不调用 Product HTTP 管理接口。

设备类别是 APP 0、WEB 1、PC/Desktop 2Python 默认 Desktop 2,后端保存 Token 时必须使用相同设备类别。开发地址通常为 ws://127.0.0.1:5200;仅当 listener 或代理配置了 /ws 时使用 ws://127.0.0.1:5200/ws。生产使用 wss://,跨机器时使用客户端实际可达地址。

想先看到实际收发效果,可按运行官方示例准备两端;下文说明如何接入自己的应用。

2. 安装 SDK

本文使用 PyPI wukong-easy-sdk==0.1.0,要求 Python 3.11+。分发名是 wukong-easy-sdk,导入名是 wukong_easy_sdk

python3 -m venv .venv
source .venv/bin/activate
python -m pip install --index-url https://pypi.org/simple "wukong-easy-sdk==0.1.0"

Windows PowerShell 将激活命令替换为 .venv\Scripts\Activate.ps1。运行依赖为 websockets>=15.0.1,<18,仓库 uv.lock 固定开发与验证依赖。

3. 连接与监听

下面代码用环境中的身份向 WKIM_PEER 发送一条消息,并继续接收 10 秒;Bob 必须已经在线。实际应用应让客户端存活到应用退出。

import asyncio
import os

from wukong_easy_sdk import AuthOptions, WKIM, WKIMChannelType, WKIMEvent


async def main():
    im = WKIM.init(
        os.environ.get("WKIM_URL", "ws://127.0.0.1:5200"),
        AuthOptions(uid=os.environ["WKIM_UID"], token=os.environ["WKIM_TOKEN"]),
    )

    def receive(message):
        # 将 message["payload"] 交给应用 UI 或有界队列。
        # 不要把完整消息或 Token 写入生产日志。
        print("Message received")

    listener = im.on(WKIMEvent.MESSAGE, receive)
    im.on(WKIMEvent.ERROR, lambda error: print("EasySDK operation failed"))
    async with im:
        ack = await im.send(
            os.environ["WKIM_PEER"], WKIMChannelType.PERSON,
            {"type": 1, "content": "你好,Python!"},
        )
        assert ack["reasonCode"] == 1
        await asyncio.sleep(10)
    im.off(WKIMEvent.MESSAGE, listener)


asyncio.run(main())

async with im 在进入时等待 CONNECT 鉴权,退出时执行 destroy()。群聊使用 WKIMChannelType.GROUP,Channel 与成员关系由业务后端预先建立。Payload 接受 JSON 对象或数组,按 UTF-8 JSON 编码为 Base64;接收兼容对象、JSON 文本和 Base64 JSON。

Python 参数使用 snake_case,消息和结果字典保留 JS 的 camelCase:发送结果包含 messageIdmessageSeqreasonCode;接收还包含 headerchannelIdchannelTypefromUid、秒级 timestamppayload。消息 ID 是字符串,序号保持完整整数精度。自定义事件通过 WKIMEvent.CUSTOM_EVENT 提供 idtype、毫秒级 timestampdata

send() 支持 client_msg_noheadersettingtopic 关键字参数;默认 header.redDot=true,显式 false 会保留。可选消息标记与 Channel 类型仍取决于服务端支持。

自动 RECVACK 表示消息已进入 SDK 分发队列,不代表业务处理完成或已读。发送成功、对端接收和业务处理的区别见消息收发

4. 收发第一条消息

下载与安装包一致的示例源码,继续使用当前虚拟环境:

git clone --branch v0.1.0 --depth 1 https://github.com/WuKongIM/WuKongEasySDK-Python.git

两个终端分别设置自己的 WKIM_UIDWKIM_TOKENWKIM_PEER 和可选的 WKIM_URL,运行:

python WuKongEasySDK-Python/examples/chat.py

例如 Alice 的 WKIM_UID=aliceWKIM_PEER=bob;Bob 相反。Token 通过各自受信环境提供。两端都显示 Connected 后输入消息,再反向发送,输入 /quit 清理退出。示例主动展示聊天内容,SDK 自身默认静默。

两端都连接成功后,Alice 向 bob 发送,Bob 在消息回调中核对发送者和正文;再由 Bob 向 alice 回发。发送结果表示服务端接受请求,不能代替对端接收或已读。

5. 清理连接

每个实例只属于一个 asyncio 事件循环,没有全局单例。同步与异步回调在独立任务中串行分发,异步回调可以 await im.send(...) 回复,也可以断开或销毁客户端。不要阻塞事件循环,或在回调中等待同一串行分发器上的后续事件。

操作语义
await im.connect()并发调用共享一次鉴权;已连接时返回当前结果
im.is_connected当前连接已通过鉴权
im.on(event, callback) / im.off(event, callback)保存并移除原回调;已经开始执行的回调可能继续完成
await im.ping()等待同 ID 响应,包括有效的 result: null
await im.disconnect()取消待处理请求、socket、心跳与重连;之后可重新连接
await im.destroy()永久关闭实例并释放监听器,可重复调用
更换账号、Token 或地址关闭旧实例,再创建新实例

取消一个 connect() 等待者不会取消共享连接,需要停止时调用 disconnect()。取消或超时的发送会释放请求占用,但已到达服务端的消息仍可能提交。

6. 常见问题

WKIMOptions 的时间单位均为秒:连接总超时 10 秒、请求 15 秒、心跳间隔 25 秒、Pong 超时 10 秒、关闭超时 2 秒。成功鉴权后的意外断线最多重试 5 次,从 1 秒指数增长到最多 30 秒,附带 20% 抖动。首次连接失败、鉴权拒绝、服务端主动断开、协议错误、事件队列满、证书校验失败和手动退出停止自动重试。

默认上限为 1,024 个待处理请求、4 MiB 序列化待处理请求、1 MiB 单条线路消息,以及 256 条事件、4 MiB 事件线路大小预算,包含当前执行事件;Python 对象开销另计。请求满返回 ErrorCode.QUEUE_FULL;事件队列满关闭连接,未进入队列的消息不被确认,过载时生命周期事件为尽力投递。保持回调短小并控制应用处理速度。

SDK 不离线排队或自动重发。超时与丢失 SENDACK 可能导致提交结果未知,应保留 client_msg_no 通过业务后端对账,再决定是否重试。错误通过 WKIMError.code 保留服务端原因码或本地 ErrorCode,错误文本不回显敏感响应。

WSS 默认验证证书链与主机名,最低 TLS 1.2。私有 CA 使用 WKIMOptions(ca_file="/path/ca.pem"),交互示例读取 WKIM_CA_FILE。不提供跳过校验的选项;不自动读取系统代理,直接使用传入的 Gateway/代理 URL。

默认不输出日志;WKIMOptions(debug_logging=True) 只启用固定生命周期元数据,不记录 Token、Payload、URL、原始帧、服务端响应文本或底层异常对象。

可选:群聊

群聊使用 WKIMChannelType.GROUP,无需客户端订阅。由可信后端建立群、添加成员并管理权限;接收继续使用 WKIMEvent.MESSAGE。跨节点成员变更需要包含成员缓存修复的服务端,只升级 Python 包无法修复旧服务端行为。Slot Leader 切换时在线路由需要恢复,不能保证切换期间连续投递。完整示例与版本条件见群聊说明

下一步

继续阅读消息收发上线检查。需要离线恢复、会话、未读或推送时,先查看 SDK 选择版本与验证记录保留各次验证的完整环境和范围。

本页内容