用 Python 调文本投递,请求体并不复杂。生产事故多半出在超时策略和重试范围:本机脚本一次通过,迁到定时任务后出现双写或乱码。会写 requests 不够。进程模型和幂等键才决定这句会不会进会话两次。
Flask 视图里同步等待发送,页面一卡,操作方连点,就是多次提交。这个坑和字段名无关,和你把投递放在哪一类线程有关。
请求只表达一次投递
统一入口为 POST,请求头带 X-QIWEI-TOKEN。文本 method 为 /msg/sendText。guid、toId、content 为文档字段。toId 可以是 userId 或 roomId,调用方必须同时记录会话类型,不能只留一个无类型字符串。示例代码里如果没有类型,这示例不能进仓库。
python
import os
import requests
API = "http://manager.qiweapi.com/qiwe/api/qw/doApi"
TOKEN = os.environ["QIWEI_TOKEN"]
def send_text(guid, to_id, content):
headers = {
"X-QIWEI-TOKEN": TOKEN,
"Content-Type": "application/json",
}
body = {
"method": "/msg/sendText",
"params": {
"guid": guid,
"toId": to_id,
"content": content,
},
}
r = requests.post(API, headers=headers, json=body, timeout=20)
r.raise_for_status()
return r.json()
print(send_text("你的guid", "你的userid", "Python 连通测试"))
Token 从环境变量读取。示例脚本夹带生产凭证入库,测试句会在次日出现在真实会话。缺配置应拒绝启动,不要静默打默认号。timeout 必须显式给出:过短会把正常投递打成失败,过长会拖死工作线程。代理解密 HTTPS 后证书不对,表象像鉴权失败,先核对运行环境再改签名。
Web 线程同步投递会把连点变成多次提交
请求阶段只写入任务,由独立进程消费。字符编码须显式 UTF-8。Windows 计划任务默认代码页一变,手机显示乱码而通道仍报成功。日志也用 UTF-8,否则排障时中文变成问号,看起来像接口返回异常。
查询类接口可以有限重试。投递超时不能套同一装饰器。uuid4() 每次不同,不能充当幂等键,键应来自业务单号。虚拟环境和依赖要锁死。本机 http 库一套、服务器另一套,证书校验行为不同,会表现为本机通、服务器鉴权失败。
笔记本里重复执行同一单元格,效果等于人工双发。独立脚本连续跑三次更有用:一次成功;把超时压到极短后会话仍一条;错误会话类型能从回执中读出。换一台机器、换一个同事,按同样顺序,测试会话里只有该出现的那一句,并且任务表能对上单号。这才叫示例过关,不是 print 了成功。
查看企业微信 API 文档: