Python结合asyncio使用Slack Socket Mode搭配AsyncWebClient时connect报错咨询
问题根因
- 当前报错核心是同步版
SocketModeClient与异步版AsyncWebClient的运行时模型不兼容,不存在额外的配置缺失问题。 - 同步版SocketModeClient内部调用Web API时,预期拿到WebClient直接返回的字典格式响应,从而可以直接用下标取
url字段完成WebSocket连接地址的获取。 - 传入的
AsyncWebClient中所有Web API调用方法都是协程实现,方法调用后不会直接返回响应字典,而是返回一个未调度执行的协程对象。 - 当同步客户端尝试对这个协程对象做字典下标取值操作时,就会触发
TypeError: 'coroutine' object is not subscriptable,同时伴随协程从未被await调用的RuntimeWarning。
异步客户端搭配的可行性说明
AsyncWebClient完全可以在Socket Mode应用中使用,但必须和异步版本的SocketModeClient配套使用,不能和同步版客户端混用。- 异步版本的SocketModeClient全链路逻辑都是协程实现,调用Web Client方法时会自动对返回的协程做await处理,和AsyncWebClient的运行逻辑完全匹配。
- 如果坚持使用同步版的
SocketModeClient,则必须搭配同步版本的WebClient,强行传入异步客户端必然会出现上述不兼容报错。
对应修正方案
方案1:全异步运行场景(适配AsyncWebClient)
将客户端替换为异步版本,所有涉及客户端调用的逻辑放入asyncio事件循环中执行,正确代码示例:
import asyncio from slack_sdk.web.async_client import AsyncWebClient from slack_sdk.socket_mode.async_client import AsyncSocketModeClient app_token = 'xapp-XXX' bot_token = 'xoxb-XXX' async def run_socket_mode(): web_client = AsyncWebClient(bot_token) sm_client = AsyncSocketModeClient(app_token=app_token, web_client=web_client) # 异步客户端的connect方法为协程,必须通过await触发执行 await sm_client.connect() # 保持连接持续接收事件 await sm_client.start() if __name__ == "__main__": asyncio.run(run_socket_mode())
方案2:同步运行场景(保持原有非异步逻辑)
移除AsyncWebClient的使用,替换为同步版WebClient,代码示例:
from slack_sdk.web import WebClient from slack_sdk.socket_mode import SocketModeClient app_token = 'xapp-XXX' bot_token = 'xoxb-XXX' web_client = WebClient(bot_token) sm_client = SocketModeClient(app_token=app_token, web_client=web_client) # 同步客户端方法可直接调用,无需await sm_client.connect() sm_client.start()
注意事项
- 两类SocketModeClient的调用逻辑完全独立,SDK未做跨运行时模型的兼容适配,禁止同步/异步客户端实例随意混搭。
- 异步版本SocketModeClient的所有公开方法都是协程形式,必须运行在asyncio事件循环内,不能在普通同步代码中直接无await调用。
内容的提问来源于stack exchange,提问作者Flyingdiver
相关产品推荐
相关产品推荐

