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-demo(dart/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 条,注意不要在循环里逐条推送,先聚合再发送。