You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Errbot插件问题:用户输入消息无法传入curl请求(Python)

解决Errbot插件中用户消息无法传入请求的问题

你的插件命令崩溃主要有两个核心原因,咱们一步步拆解解决:

1. 请求格式不匹配API预期

你构造的是JSON结构的请求体,但直接把字典传给requests.postdata参数时,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.postdata参数替换为json=data,确保请求体以JSON格式发送,匹配API的接收要求。
  • 增加异常捕获逻辑,即使请求失败,插件也会返回错误提示而非直接崩溃。
  • 补充团队不存在的判断,提前反馈无效输入。

用户正确的命令执行方式

用户需要按如下格式执行命令(消息内容包含空格时,请用引号包裹):

!oncall page team_name --message "服务器CPU使用率过高,请排查处理"

内容的提问来源于stack exchange,提问作者Jrsys

火山引擎 最新活动