Grandstream PBX提取数据转JSON并通过Webhook发送的实现问题
解决方法
1. 正确解码并拆分字节数据
Grandstream PBX输出的字节数据需先解码为字符串,再按实际分隔符拆分成36个值的列表。先确认PBX输出的分隔符(常见为逗号、空格或制表符),再执行以下代码:
# 替换为你从PBX提取的字节数据 byte_data = b'value1,value2,...,value36' # 解码为UTF-8字符串并去除首尾空白 raw_str = byte_data.decode('utf-8').strip() # 按分隔符拆分,此处假设为逗号,需根据实际情况修改 values = raw_str.split(',')
2. 验证键值列表长度匹配
确保你的键列表和拆分后的数值列表长度均为36,避免字典组合时出现数据错位或报错:
# 替换为你的36个键名列表 keys = ['key_name_1', 'key_name_2', ..., 'key_name_36'] # 打印长度进行确认 print(f"键列表长度: {len(keys)}, 值列表长度: {len(values)}")
若长度不一致,要么是分隔符选择错误,要么是键列表存在遗漏/冗余,需先修正此问题。
3. 组合成目标字典
使用zip将键与值配对,转换为字典结构:
payload = dict(zip(keys, values)) # 可选操作:若部分值需要类型转换(如字符串转数字),手动处理 # 示例:payload['call_duration'] = int(payload['call_duration'])
4. 发送符合要求的POST请求
核心是发送JSON格式的请求,而非表单或纯文本。使用requests库时,直接用json参数传入字典,它会自动完成JSON序列化与请求头设置:
import requests # 替换为你的Zoho Flow Webhook地址 webhook_url = 'https://flow.zoho.com/your-webhook-endpoint' # 发送请求 response = requests.post(webhook_url, json=payload) # 打印响应信息用于排查问题 print(f"响应状态码: {response.status_code}") print(f"响应内容: {response.text}")
若需手动构造请求,也可使用json.dumps序列化字典,同时指定Content-Type请求头:
import json headers = {'Content-Type': 'application/json'} response = requests.post(webhook_url, data=json.dumps(payload), headers=headers)
5. 排查Zoho Flow端配置
若请求发送成功(状态码为200/201)但仍报错,检查以下内容:
- Zoho Flow的Webhook是否设置为接收JSON格式
- 发送的键名是否与Zoho Flow中配置的字段完全匹配(注意大小写、拼写)
- 部分字段是否要求特定数据类型(如数字、布尔值),需在Python中提前转换类型
内容的提问来源于stack exchange,提问作者Wagner Franceschi
相关产品推荐
相关产品推荐

