Dart / Flutter + Server酱:任务完成/出错,微信立刻知道

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

前置条件

  • 一个 Server酱 SendKey(30 秒获取教程
  • 本机可运行 Dart / Flutter 的环境

方式一:官方 SDK(推荐)

安装:

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

调用(来自官方 README):

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-demodart/main.dart),同样自动识别两种 SendKey,可直接复制使用:

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;
}

运行方式:

dart run main.dart

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

常见问题

免费额度够用吗?

免费版每天 5 条。程序类通知建议在任务结束时合并推送一条摘要;量大可订阅会员目前特价最低 3 元/月,一天最多可发 1000 条(价格详情)。

消息没收到怎么办?

先检查返回 JSON 的 code 是否为 0,再按 常见问题与排查 逐项检查。

有频率限制吗?

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

相关集成

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

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

请帮我把 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 条结果摘要即可,批量任务合并成一条,不要每步都推。
请根据我当前的项目和场景直接写好代码/配置并验证。