推送 API
POST 参数、响应和调用示例。
更新于 2026/10/31 21:16:41
请求参数
POST /api/push/{token}
登录后在推送页面复制专属地址,将完整地址作为请求 URL。支持 application/json 和 application/x-www-form-urlencoded,以下示例使用 JSON。
| 参数 | 位置 | 类型 | 必填 | 说明 |
|---|---|---|---|---|
| token | URL 路径 | string | 是 | 专属地址中的完整 Token,不放在请求体中 |
| title | 请求体 | string | 是 | 去掉两端空白后为 1–100 个字符 |
| content | 请求体 | string | 是 | 不能为空或仅含空白,最多 32 KiB UTF-8 文本,支持文本、Markdown 和安全 HTML |
请求头 Content-Type 设为 application/json。可选请求头 Idempotency-Key 最多 128 字节;在服务配置的幂等窗口内(默认 24 小时),同一用户相同标识和内容复用原推送记录,不重复发送或扣量;相同标识用于不同内容返回 HTTP 409。不提供该请求头时,每次请求独立计量。
JSON 请求示例
{
"title": "任务完成",
"content": "处理成功"
}
content 中的换行使用 JSON 转义 \n,例如 "content": "## 运行结果\n\n处理成功"。
返回值说明
响应为 JSON。HTTP 200 和 202 的 code 均为 0,具体推送结果需要同时查看 HTTP 状态和 data.status。错误响应包含 code、message、request_id,不包含 data。
| 字段 | 类型 | 说明 |
|---|---|---|
| code | integer | HTTP 200/202 时为 0;错误时为 HTTP 状态码 × 100 + 1,例如 HTTP 429 对应 42901 |
| message | string | 本次结果说明或错误原因 |
| request_id | string | 推送请求标识,用于定位问题;复用幂等记录时返回原推送标识 |
| data | object | 仅在 HTTP 200/202 时返回的推送结果和当前额度信息 |
| data.status | string | accepted:微信已受理;unknown:结果待确认,请勿直接重发 |
| data.request_id | string | 与外层 request_id 相同的推送请求标识 |
| data.daily_limit | integer | 当前有效的每日总额度 |
| data.used_today | integer | 今日微信已明确受理的条数 |
| data.reserved_today | integer | 今日待确认请求占用的条数 |
| data.remaining_today | integer | 当前可用条数,按每日总额度减去已用和待确认占用计算,最低为 0 |
| data.plan_name | string | 当前有效的额度名称,例如“免费版” |
| data.source | string | 当前额度来源:free(免费)、paid(付费)或 override(手动额度) |
| data.paid_until | string 或 null | 付费权益到期时间,未有付费记录时为 null;当前有效额度仍以 source 和 daily_limit 为准 |
JSON 返回示例
微信已受理(HTTP 200)
{
"code": 0,
"message": "已提交微信",
"request_id": "9cf6f21feae34312a9072c28b6bd1c44",
"data": {
"status": "accepted",
"request_id": "9cf6f21feae34312a9072c28b6bd1c44",
"daily_limit": 40,
"used_today": 1,
"reserved_today": 0,
"remaining_today": 39,
"plan_name": "免费版",
"source": "free",
"paid_until": null
}
}
结果待确认(HTTP 202)
{
"code": 0,
"message": "结果待确认,请勿重复发送",
"request_id": "be83c4735a324101affb34d95aa7f63b",
"data": {
"status": "unknown",
"request_id": "be83c4735a324101affb34d95aa7f63b",
"daily_limit": 40,
"used_today": 0,
"reserved_today": 1,
"remaining_today": 39,
"plan_name": "免费版",
"source": "free",
"paid_until": null
}
}
额度不足(HTTP 429)
{
"code": 42901,
"message": "今日额度不足",
"request_id": "452d8b8bd3b14983a0a1735dd28f467b"
}
上述额度为示例,实际数值以接口返回为准。微信已受理不代表用户已阅读;结果待确认时会保留一次额度占用。
状态说明
| HTTP 状态 | 说明 |
|---|---|
| 200 | 微信已受理,data.status 为 accepted |
| 202 | 结果待确认,data.status 为 unknown,请勿直接重发 |
| 400 | 参数格式、标题或内容不合法,或幂等标识超过长度限制 |
| 401 | Token 无效或已重置 |
| 403 | 当前用户未关注服务号 |
| 409 | 同一幂等标识用于不同内容,或发生并发冲突 |
| 429 | 今日额度不足或请求过于频繁,以 message 说明为准 |
| 500 | 服务处理异常,可凭 request_id 联系管理员 |
| 502 | 微信明确拒绝推送 |
| 503 | 推送配置未完成或服务暂不可用 |
JavaScript 调用示例
以下示例使用 Node.js 18 或以上版本,以 .mjs 文件运行。先将推送页面复制的完整地址配置到环境变量 QINGWA_PUSH_URL。
const pushURL = process.env.QINGWA_PUSH_URL
if (!pushURL) throw new Error('请先设置 QINGWA_PUSH_URL')
const response = await fetch(pushURL, {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ title: '任务完成', content: '处理成功' }),
signal: AbortSignal.timeout(15000)
})
console.log('HTTP 状态:', response.status)
console.log(JSON.stringify(await response.json(), null, 2))
Go 调用示例
配置环境变量 QINGWA_PUSH_URL 后,使用 Go 标准库发送请求。
package main
import (
"fmt"
"io"
"log"
"net/http"
"os"
"strings"
"time"
)
func main() {
pushURL := os.Getenv("QINGWA_PUSH_URL")
if pushURL == "" {
log.Fatal("请先设置 QINGWA_PUSH_URL")
}
client := &http.Client{Timeout: 15 * time.Second}
payload := strings.NewReader(`{"title":"任务完成","content":"处理成功"}`)
response, err := client.Post(pushURL, "application/json", payload)
if err != nil {
log.Fatal(err)
}
defer response.Body.Close()
body, err := io.ReadAll(response.Body)
if err != nil {
log.Fatal(err)
}
fmt.Println("HTTP 状态:", response.StatusCode)
fmt.Println(string(body))
}
Java 调用示例
使用 Java 11 或以上版本的标准库,配置环境变量 QINGWA_PUSH_URL,将代码保存为 QingwaPush.java。
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import java.nio.charset.StandardCharsets;
import java.time.Duration;
public class QingwaPush {
public static void main(String[] args) throws Exception {
String pushURL = System.getenv("QINGWA_PUSH_URL");
if (pushURL == null || pushURL.isBlank()) {
throw new IllegalArgumentException("请先设置 QINGWA_PUSH_URL");
}
String payload = "{\"title\":\"任务完成\",\"content\":\"处理成功\"}";
HttpClient client = HttpClient.newBuilder()
.connectTimeout(Duration.ofSeconds(5))
.build();
HttpRequest request = HttpRequest.newBuilder(URI.create(pushURL))
.timeout(Duration.ofSeconds(15))
.header("Content-Type", "application/json")
.POST(HttpRequest.BodyPublishers.ofString(payload, StandardCharsets.UTF_8))
.build();
HttpResponse<String> response = client.send(
request, HttpResponse.BodyHandlers.ofString(StandardCharsets.UTF_8));
System.out.println("HTTP 状态:" + response.statusCode());
System.out.println(response.body());
}
}
Python 调用示例
使用 Python 3 标准库,配置环境变量 QINGWA_PUSH_URL 后即可调用,无需安装额外依赖。
import json
import os
from urllib.error import HTTPError
from urllib.request import Request, urlopen
payload = json.dumps(
{"title": "任务完成", "content": "处理成功"},
ensure_ascii=False,
).encode("utf-8")
request = Request(
os.environ["QINGWA_PUSH_URL"],
data=payload,
headers={"Content-Type": "application/json"},
method="POST",
)
try:
with urlopen(request, timeout=15) as response:
print("HTTP 状态:", response.status)
print(response.read().decode("utf-8"))
except HTTPError as error:
with error:
print("HTTP 状态:", error.code)
print(error.read().decode("utf-8"))
四种示例均会输出 HTTP 状态和响应正文。若发生超时或返回 HTTP 202,先保留请求信息并核对结果,不要直接自动重发。