Java + Server酱:任务完成/出错,微信立刻知道
效果:在 Java 程序中调用 Server酱 API,任务完成、异常告警等消息实时推送到你的微信。
前置条件
- 一个 Server酱 SendKey(30 秒获取教程)
- 本机可运行 Java 的环境
官方示例实现
以下代码来自官方示例仓库 serverchan-demo(java/Main.java),同样自动识别两种 SendKey,可直接复制使用:
import java.io.FileInputStream;
import java.io.IOException;
import java.io.BufferedReader;
import java.io.DataOutputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLEncoder;
import java.util.Properties;
import java.util.regex.*;
public class Main {
public static void main(String[] args) {
Properties data = parseIniFile("../.env");
String key = data.getProperty("SENDKEY");
String ret = scSend("主人服务器宕机了 via java", "第一行\n\n第二行", key);
System.out.println(ret);
}
public static Properties parseIniFile(String filePath) {
Properties properties = new Properties();
try {
properties.load(new FileInputStream(filePath));
} catch (IOException e) {
e.printStackTrace();
}
return properties;
}
public static String scSend(String var0, String var1, String var2) {
try {
String var3;
// 判断 sendkey 是否以 "sctp" 开头,并提取数字部分拼接 URL
if (var2.startsWith("sctp")) {
Pattern pattern = Pattern.compile("sctp(\\d+)t");
Matcher matcher = pattern.matcher(var2);
if (matcher.find()) {
String num = matcher.group(1);
var3 = "https://" + num + ".push.ft07.com/send/" + var2 +".send";
} else {
throw new IllegalArgumentException("Invalid sendkey format for sctp");
}
} else {
var3 = "https://sctapi.ftqq.com/" + var2 + ".send";
}
String var10000 = URLEncoder.encode(var0, "UTF-8");
String var4 = "text=" + var10000 + "&desp=" + URLEncoder.encode(var1, "UTF-8");
URL var5 = new URL(var3);
HttpURLConnection var6 = (HttpURLConnection) var5.openConnection();
var6.setRequestMethod("POST");
var6.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
var6.setDoOutput(true);
DataOutputStream var7 = new DataOutputStream(var6.getOutputStream());
var7.writeBytes(var4);
var7.flush();
var7.close();
int var8 = var6.getResponseCode();
BufferedReader var9 = new BufferedReader(new InputStreamReader(var6.getInputStream()));
StringBuilder var11 = new StringBuilder();
String var10;
while ((var10 = var9.readLine()) != null) {
var11.append(var10);
}
var9.close();
return var11.toString();
} catch (Exception var12) {
var12.printStackTrace();
return null;
}
}
}
运行方式:
java Main.java # Java 11+ 支持单文件直接运行
官方示例从仓库根目录的
.env文件读取SENDKEY;集成到你的项目时,可改为读取环境变量SERVERCHAN_SENDKEY或你的配置系统。纯标准库实现(HttpURLConnection),无第三方依赖。
常见问题
免费额度够用吗?
免费版每天 5 条。程序类通知建议在任务结束时合并推送一条摘要;量大可订阅会员目前特价最低 3 元/月,一天最多可发 1000 条(价格详情)。
消息没收到怎么办?
先检查返回 JSON 的 code 是否为 0,再按 常见问题与排查 逐项检查。
有频率限制吗?
每分钟最多 50 条,注意不要在循环里逐条推送,先聚合再发送。