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

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

前置条件

官方示例实现

以下代码来自官方示例仓库 serverchan-demojava/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 条,注意不要在循环里逐条推送,先聚合再发送。

相关集成

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