Node.js + Server酱:脚本/服务状态实时推送微信

效果:Node.js 脚本执行完毕、服务出现异常或定时任务完成时,自动发送一条包含详情的消息到你的微信。

前置条件

  1. 一个 Server酱 SendKey。获取方法:30 秒获取教程
  2. 一个可运行的 Node.js 环境(建议 Node.js 18 或更高版本)。

配置步骤

方法一:使用官方 SDK(推荐)

这是最简单的方式,SDK 会自动识别 SCTsctp 两种 SendKey 格式并调用正确的 API 端点。

  1. 安装 SDK 在你的项目目录下,通过 npm 安装 serverchan-sdk
    npm install serverchan-sdk
    
  2. 编写推送代码 创建一个 .js 文件(例如 notify.js),写入以下代码。将 你的SENDKEY 替换为你的实际 SendKey。
    // notify.js
    import { scSend } from 'serverchan-sdk'; // 或使用 const { scSend } = require('serverchan-sdk');
    
    const sendkey = '你的SENDKEY'; // 建议从环境变量 process.env.SERVERCHAN_SENDKEY 读取
    const title = 'Node.js 任务执行报告';
    // 每行之间用空行分隔(Markdown 中单个换行不会分段)
    const desp = [
      '**任务名称**:每日数据备份',
      '**执行状态**:【成功】',
      `**完成时间**:${new Date().toLocaleString()}`,
      '**详情**:已成功备份数据库至云端。',
    ].join('\n\n');
    
    async function sendNotification() {
      try {
        const response = await scSend(sendkey, title, desp, { tags: '服务器报警' });
        if (response.code === 0) {
          console.log('Server酱 消息推送成功!');
        } else {
          console.error('推送失败:', response);
        }
      } catch (error) {
        console.error('请求出错:', error);
      }
    }
    
    // 调用函数发送通知
    sendNotification();
    
  3. 运行脚本 在终端执行你的脚本。
    node notify.js
    

方法二:使用 Node.js 原生 fetch(无依赖)

如果你不想引入额外依赖,Node.js 18+ 内置的 fetch API 可以直接调用 Server酱。

  1. 编写推送代码 创建一个 .js 文件,写入以下代码。
    // notify_fetch.js
    const sendkey = '你的SENDKEY'; // 建议从环境变量 process.env.SERVERCHAN_SENDKEY 读取
    const apiUrl = `https://sctapi.ftqq.com/${sendkey}.send`;
    
    const title = '服务异常告警';
    const desp = [
      '**服务**:用户API服务',
      `**时间**:${new Date().toLocaleString()}`,
      '**错误**:数据库连接超时,请立即检查。',
    ].join('\n\n');
    
    async function sendNotification() {
      try {
        const response = await fetch(apiUrl, {
          method: 'POST',
          headers: {
            'Content-Type': 'application/json',
          },
          body: JSON.stringify({ title, desp }),
        });
        const result = await response.json();
        if (result.code === 0) {
          console.log('Server酱 消息推送成功!');
        } else {
          console.error('推送失败:', result);
        }
      } catch (error) {
        console.error('网络请求失败:', error);
      }
    }
    
    // 调用函数发送通知
    sendNotification();
    
    注意:如果你的 SendKey 是 sctp 开头,需要根据规则手动构造 API 端点 https://{uid}.push.ft07.com/send/{sendkey}.send。SDK 会自动处理这一点。
  2. 运行脚本
    node notify_fetch.js
    

完整示例

以下是一个在定时任务(使用 node-cron)完成后推送的完整示例。

  1. 安装依赖
    npm install serverchan-sdk node-cron
    
  2. 创建任务脚本 (scheduled_task.js)
    // package.json 需含 "type": "module"(或改用 require 写法)
    import cron from 'node-cron';
    import { scSend } from 'serverchan-sdk';
    import { someLongRunningTask } from './your-task-module.js'; // 假设这是你的业务函数
    
    const SENDKEY = process.env.SERVERCHAN_SENDKEY; // 从环境变量读取
    
    // 定义每天凌晨 2 点执行的任务
    cron.schedule('0 2 * * *', async () => {
      console.log('开始执行每日数据清理任务...');
      try {
        const result = await someLongRunningTask();
        // 任务成功,发送通知
        await scSend(SENDKEY, '定时任务完成', `数据清理任务已成功执行。\n\n处理记录数:${result.count}`);
        console.log('任务完成通知已发送。');
      } catch (error) {
        // 任务失败,发送告警
        await scSend(SENDKEY, '定时任务执行失败', `任务执行过程中发生错误:\n\n\`\`\`\n${error.message}\n\`\`\``);
        console.error('任务失败,告警已发送。', error);
      }
    });
    
    console.log('定时任务调度器已启动...');
    
  3. 设置环境变量并运行
    export SERVERCHAN_SENDKEY=你的SENDKEY
    node scheduled_task.js
    

常见问题

每天可以发多少条消息? 免费用户每天可发送 5 条。订阅会员目前特价最低 3 元/月,一天最多可发 1000 条(价格详情)。所有用户每分钟最多发送 50 条。

消息没收到怎么办? 请首先访问 常见问题与排查指南,按照步骤检查 SendKey、网络及消息内容格式。

代码中如何安全地存储 SendKey? 强烈建议使用环境变量,避免将密钥硬编码在代码中。例如:

# 在命令行中设置(临时)
export SERVERCHAN_SENDKEY=你的SENDKEY
# 在代码中读取
const sendkey = process.env.SERVERCHAN_SENDKEY;

SDK 和直接调用 API 哪个更好? SDK 更简单,自动处理了 API 端点识别和请求构造。直接调用 fetch 更轻量,无额外依赖。根据项目需求选择即可。

可以推送到企业微信或钉钉吗? 可以。Server酱 支持将消息转发到微信服务号、企业微信应用、钉钉群机器人和飞书群机器人。配置方法详见 通道配置指南

相关集成

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