Rust + Server酱:任务完成/出错,微信立刻知道
效果:在 Rust 程序中调用 Server酱 API,任务完成、异常告警等消息实时推送到你的微信。
前置条件
- 一个 Server酱 SendKey(30 秒获取教程)
- 本机可运行 Rust 的环境
官方示例实现
以下代码来自官方示例仓库 serverchan-demo(rust/src/main.rs),同样自动识别两种 SendKey,可直接复制使用:
use std::env;
use reqwest::header::{CONTENT_TYPE, CONTENT_LENGTH};
use serde_urlencoded;
use tokio;
use regex::Regex;
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
dotenv::dotenv().ok();
let key = env::var("SENDKEY").unwrap();
let ret = sc_send("主人服务器宕机了 via Rust".to_string(), "第一行\n\n第二行".to_string(), key).await?;
println!("{}", ret);
Ok(())
}
async fn sc_send(text: String, desp: String, key: String) -> Result<String, Box<dyn std::error::Error>> {
let params = [("text", text), ("desp", desp)];
let post_data = serde_urlencoded::to_string(params)?;
// 使用正则表达式提取 key 中的数字部分
let url = if key.starts_with("sctp") {
let re = Regex::new(r"sctp(\d+)t")?;
if let Some(captures) = re.captures(&key) {
let num = &captures[1]; // 提取正则表达式捕获的数字部分
format!("https://{}.push.ft07.com/send/{}.send", num, key)
} else {
return Err("Invalid sendkey format for sctp".into());
}
} else {
format!("https://sctapi.ftqq.com/{}.send", key)
};
let client = reqwest::Client::new();
let res = client.post(&url)
.header(CONTENT_TYPE, "application/x-www-form-urlencoded")
.header(CONTENT_LENGTH, post_data.len() as u64)
.body(post_data)
.send()
.await?;
let data = res.text().await?;
Ok(data)
}
运行方式:
cargo run
官方示例从仓库根目录的
.env文件读取SENDKEY;集成到你的项目时,可改为读取环境变量SERVERCHAN_SENDKEY或你的配置系统。Cargo.toml依赖(来自官方仓库):
[dependencies]
reqwest = "0.11"
serde_urlencoded = "0.7"
tokio = { version = "1", features = ["full"] }
dotenv = "0.15.0"
regex = "1.11.0"
常见问题
免费额度够用吗?
免费版每天 5 条。程序类通知建议在任务结束时合并推送一条摘要;量大可订阅会员目前特价最低 3 元/月,一天最多可发 1000 条(价格详情)。
消息没收到怎么办?
先检查返回 JSON 的 code 是否为 0,再按 常见问题与排查 逐项检查。
有频率限制吗?
每分钟最多 50 条,注意不要在循环里逐条推送,先聚合再发送。