# Dart / Flutter 接入 Server酱：程序消息推送到微信（2026 教程）

> 在 Dart / Flutter 程序中调用 Server酱 API 推送微信通知：官方SDK 与 示例代码直接可用，自动兼容 Server酱Turbo 与 Server酱³ 两种 SendKey。

- 网页版：https://sct.ftqq.com/docs/integrations/dart/
- 更新日期：2026-07-17

# Dart / Flutter + Server酱：任务完成/出错，微信立刻知道

> 效果：在 Dart / Flutter 程序中调用 Server酱 API，任务完成、异常告警等消息实时推送到你的微信。

## 前置条件

- 一个 Server酱 SendKey（[30 秒获取教程](https://sct.ftqq.com/docs/getting-started/sendkey/)）
- 本机可运行 Dart / Flutter 的环境

## 方式一：官方 SDK（推荐）

安装：

```bash
# pubspec.yaml 中加入依赖
dependencies:
    serverchan_sdk:
# 然后 dart pub get 或 flutter pub get
```

调用（来自官方 README）：

```dart
import 'package:serverchan_sdk/serverchan_sdk.dart';

void main() async {
  const sendkey = 'your-sendkey';
  const title = '测试标题';
  const desp = '这是消息的详细内容';

  try {
    ScSendResponse response = await scSend(sendkey, title, desp: desp);
    print('Response Code: ${response.code}');
    print('Response Message: ${response.message}');
  } catch (e) {
    print('Error: $e');
  }
}
```

SDK 按 SendKey 前缀自动识别 Server酱Turbo（`SCT` 开头）与 Server酱³（`sctp` 开头），无需关心端点差异。

## 方式二：官方示例直调实现

以下代码来自官方示例仓库 [serverchan-demo](https://github.com/easychen/serverchan-demo)（`dart/main.dart`），同样自动识别两种 SendKey，可直接复制使用：

```dart
import 'package:http/http.dart' as http;
import 'package:dart_dotenv/dart_dotenv.dart';

void main() async {
  final dotEnv = DotEnv(filePath: '../.env');
  // 打印 dotEnv 内容
  print(dotEnv);
  final key = dotEnv.get('SENDKEY') ?? '';

  if (key != null) {
    final ret = await scSend('主人服务器宕机了 via dart', '第一行\n\n第二行', key);
    print(ret);
  } else {
    print('SENDKEY is not found in .env file');
  }
}

Future<String> scSend(String text, [String desp = '', String? key]) async {
  key = key ?? '[SENDKEY]';
  String url;
  if (key.startsWith('sctp')) {
    final regExp = RegExp(r'sctp(\d+)t');
    final match = regExp.firstMatch(key);
    if (match != null) {
      final num = match.group(1); // 提取数字部分
      url = 'https://$num.push.ft07.com/send/$key.send';
    } else {
      throw ArgumentError('Invalid key format');
    }
  } else {
    url = 'https://sctapi.ftqq.com/$key.send';
  }

  final request = http.MultipartRequest('POST', Uri.parse(url));
  request.fields['text'] = text;
  request.fields['desp'] = desp;

  final response = await request.send();
  final responseBody = await response.stream.bytesToString();

  return responseBody;
}
```

运行方式：

```bash
dart run main.dart
```

> 官方示例从仓库根目录的 `.env` 文件读取 `SENDKEY`；集成到你的项目时，可改为读取环境变量 `SERVERCHAN_SENDKEY` 或你的配置系统。依赖见官方仓库 `dart/pubspec.yaml`。

## 常见问题

**免费额度够用吗？**

免费版每天 5 条。程序类通知建议在任务结束时合并推送一条摘要；量大可订阅会员目前特价最低 3 元/月，一天最多可发 1000 条（[价格详情](https://sct.ftqq.com/subscribe)）。

**消息没收到怎么办？**

先检查返回 JSON 的 `code` 是否为 `0`，再按 [常见问题与排查](https://sct.ftqq.com/docs/getting-started/faq/) 逐项检查。

**有频率限制吗？**

每分钟最多 50 条，注意不要在循环里逐条推送，先聚合再发送。

## 相关集成

- [Python 脚本推送微信通知](https://sct.ftqq.com/docs/integrations/python/)
- [Node.js 推送微信通知](https://sct.ftqq.com/docs/integrations/nodejs/)
- [Claude Code 任务完成微信通知](https://sct.ftqq.com/docs/integrations/claude-code/)


## 懒人方案：把这段话复制给你的 AI 助手

把下面这段文字原样粘贴给 Claude Code、Cursor 或任何 AI 编程助手，它就会替你完成 Server酱 的接入：

```text
请帮我把 Server酱 微信通知接入到我当前的项目/工具中：
1. API：POST https://sctapi.ftqq.com/{SendKey}.send，参数 title（必填，不能含换行）、desp（正文，支持 Markdown，可选）；成功时返回 JSON 的 code 为 0。
2. 如果我的 SendKey 以 sctp 开头，则改用 https://{uid}.push.ft07.com/send/{SendKey}.send，uid 是 SendKey 中 sctp 与 t 之间的数字。
3. SendKey 从环境变量 SERVERCHAN_SENDKEY 读取；如果没有，提醒我到 https://sct.ftqq.com 免费获取（每天 5 条额度）。
4. 安全要求：不要把 SendKey 硬编码进代码、不要打印到日志、不要提交到 git。
5. 频率约定：任务结束发 1 条结果摘要即可，批量任务合并成一条，不要每步都推。
请根据我当前的项目和场景直接写好代码/配置并验证。
```

