Errbot插件问题:用户输入消息无法传入curl请求(Python)
解决Errbot插件中用户消息无法传入请求的问题
你的插件命令崩溃主要有两个核心原因,咱们一步步拆解解决:
1. 请求格式不匹配API预期
你构造的是JSON结构的请求体,但直接把字典传给requests.post的data参数时,requests会自动将其编码为application/x-www-form-urlencoded格式的表单数据,而你的API大概率期望接收application/json格式的请求,这会导致API无法解析请求,进而触发命令崩溃。
2. 未处理message参数为空的场景
如果用户执行命令时没有在--message后输入内容,message会是None,虽然字符串格式化不会直接报错,但传给API的state_message会变成字符串"None",这可能不符合API的参数要求,甚至触发错误逻辑。
修正后的完整代码
@arg_botcmd('team_key', type=str) # 加上required=True,强制用户必须提供消息内容,避免message为空 @arg_botcmd('--message', dest='message', type=str, required=True) def oncall_page(self, msg, team_key=None, message=None): # 先判断团队是否存在,提前返回错误提示 if team_key not in page_list.keys(): yield f"团队 {team_key} 不在通知列表中!" return team_id = page_list[team_key] # 直接使用message,无需额外格式化(已由required=True保证非空) data = {"message_type":"CRITICAL","state_message": message} try: # 使用json参数传递数据,requests会自动设置Content-Type为application/json response = requests.post( f'https://www.apiurl.com/{team_id}', json=data ) # 检查请求是否成功,捕获API返回的错误状态码 response.raise_for_status() yield f"已成功发起对 {team_id} 的通知!" except requests.exceptions.RequestException as e: # 请求失败时返回友好提示,避免插件崩溃 yield f"通知发送失败:{str(e)}"
关键改动说明
- 给
--message参数添加required=True,强制用户必须输入消息内容,从源头避免message为空的情况。 - 将
requests.post的data参数替换为json=data,确保请求体以JSON格式发送,匹配API的接收要求。 - 增加异常捕获逻辑,即使请求失败,插件也会返回错误提示而非直接崩溃。
- 补充团队不存在的判断,提前反馈无效输入。
用户正确的命令执行方式
用户需要按如下格式执行命令(消息内容包含空格时,请用引号包裹):
!oncall page team_name --message "服务器CPU使用率过高,请排查处理"
内容的提问来源于stack exchange,提问作者Jrsys




