你知唔知我系靓仔

v免签二二二开


系统更新:支持 Telegram 通知和 API Key 配置

更新内容

本次更新主要增加了以下功能:

  1. Telegram 通知支持

    • 系统现在支持通过 Telegram Bot 发送通知消息。
    • 当客户端断开连接或重连成功时,系统会自动通过 Telegram Bot 发送通知。
  2. API Key 配置

    • 新增了 API Key 的配置选项,用户可以在设置页面中配置 API Key,用于系统与其他服务的集成。
  3. 客户端状态管理

    • 新增了 is_disconnected 字段,用于记录客户端是否断开连接的状态。
  4. 数据库结构调整

    • 为了支持新功能,数据库 setting 表中新增了四个字段:telegramBottelegramChatapi_keyis_disconnected

实现方法

1. 后端更新

1.1 新增字段查询与保存

在后端的 getSettingssaveSetting 函数中,新增了对 telegramBottelegramChatapi_keyis_disconnected 字段的处理逻辑。

  • getSettings 函数

    • 查询 setting 表中的 telegramBottelegramChatapi_keyis_disconnected 字段,并将其值返回给前端。
    $telegramBot = Db::name("setting")->where("vkey", "telegramBot")->find();
    $telegramChat = Db::name("setting")->where("vkey", "telegramChat")->find();
    $apiKey = Db::name("setting")->where("vkey", "api_key")->find();
    $isDisconnected = Db::name("setting")->where("vkey", "is_disconnected")->find();
  • saveSetting 函数

    • 保存前端提交的 telegramBottelegramChatapi_keyis_disconnected 字段的值到数据库中。
    Db::name("setting")->where("vkey", "telegramBot")->update(array("vvalue" => input("telegramBot")));
    Db::name("setting")->where("vkey", "telegramChat")->update(array("vvalue" => input("telegramChat")));
    Db::name("setting")->where("vkey", "api_key")->update(array("vvalue" => input("apiKey")));
    Db::name("setting")->where("vkey", "is_disconnected")->update(array("vvalue" => input("isDisconnected")));
1.2 Telegram 通知功能

新增了一个辅助函数 sendTelegramMessage,用于通过 Telegram Bot 发送消息。

private function sendTelegramMessage($message)
{
    $botToken = Db::name("setting")->where("vkey", "telegramBot")->value("vvalue");
    $chatId = Db::name("setting")->where("vkey", "telegramChat")->value("vvalue");

    if (empty($botToken) || empty($chatId)) {
        return false;
    }

    $apiUrl = "https://api.telegram.org/bot{$botToken}/sendMessage";
    $params = [
        'chat_id' => $chatId,
        'text' => $message,
    ];

    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $apiUrl);
    curl_setopt($ch, CURLOPT_POST, true);
    curl_setopt($ch, CURLOPT_POSTFIELDS, $params);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    $response = curl_exec($ch);
    curl_close($ch);

    $responseData = json_decode($response, true);
    return isset($responseData['ok']) && $responseData['ok'] === true;
}

checkHeartbeat 函数中,调用 sendTelegramMessage 函数发送通知消息。

if ($timeDiff >= 180) {
    $telegramMessage = "⚠️ 客户端断开连接\n时间: " . date('Y-m-d H:i:s', $currentTime);
    $this->sendTelegramMessage($telegramMessage);
} else {
    $telegramMessage = "✅ 客户端重连成功\n时间: " . date('Y-m-d H:i:s', $currentTime);
    $this->sendTelegramMessage($telegramMessage);
}

2. 前端更新

2.1 新增输入字段

在前端设置页面中,新增了 telegramBottelegramChatapiKeyisDisconnected 的输入字段。

<div class="layui-form-item">
    <label class="layui-form-label">Telegram Bot Token</label>
    <div class="layui-input-block">
        <input type="text" id="telegramBot" placeholder="请输入 Telegram Bot Token" autocomplete="off" class="layui-input">
    </div>
</div>
<div class="layui-form-item">
    <label class="layui-form-label">Telegram Chat ID</label>
    <div class="layui-input-block">
        <input type="text" id="telegramChat" placeholder="请输入 Telegram Chat ID" autocomplete="off" class="layui-input">
    </div>
</div>
<div class="layui-form-item">
    <label class="layui-form-label">API Key</label>
    <div class="layui-input-block">
        <input type="text" id="apiKey" placeholder="请输入 API Key" autocomplete="off" class="layui-input">
    </div>
</div>
<div class="layui-form-item">
    <label class="layui-form-label">客户端断开状态</label>
    <div class="layui-input-block">
        <input type="text" id="isDisconnected" placeholder="客户端断开状态" autocomplete="off" class="layui-input">
    </div>
</div>
2.2 更新 JavaScript 逻辑

savegetstate 函数中,增加了对新增字段的处理逻辑。

  • save 函数

    • 获取 telegramBottelegramChatapiKeyisDisconnected 的值,并将其提交到后端。
    var telegramBot = $("#telegramBot").val();
    var telegramChat = $("#telegramChat").val();
    var apiKey = $("#apiKey").val();
    var isDisconnected = $("#isDisconnected").val();
    
    var postData = {
      // 其他字段...
      telegramBot: telegramBot,
      telegramChat: telegramChat,
      apiKey: apiKey,
      isDisconnected: isDisconnected
    };
  • getstate 函数

    • 从后端获取 telegramBottelegramChatapiKeyisDisconnected 的值,并将其绑定到输入框中。
    $("#telegramBot").val(data.data.telegramBot || '');
    $("#telegramChat").val(data.data.telegramChat || '');
    $("#apiKey").val(data.data.apiKey || '');
    $("#isDisconnected").val(data.data.isDisconnected || '');

数据库新增字段

为了支持新功能,需要在 setting 表中新增以下字段:

字段名 数据类型 说明
telegramBot VARCHAR 存储 Telegram Bot Token
telegramChat VARCHAR 存储 Telegram Chat ID
api_key VARCHAR 存储 API Key
is_disconnected TINYINT 存储客户端断开状态

SQL 语句

ALTER TABLE `setting` ADD COLUMN `telegramBot` VARCHAR(255) DEFAULT '';
ALTER TABLE `setting` ADD COLUMN `telegramChat` VARCHAR(255) DEFAULT '';
ALTER TABLE `setting` ADD COLUMN `api_key` VARCHAR(255) DEFAULT '';
ALTER TABLE `setting` ADD COLUMN `is_disconnected` TINYINT DEFAULT 0;

使用方法

1. 调用 checkHeartbeat 接口

checkHeartbeat 接口用于检测客户端的心跳状态,并根据状态发送 Telegram 通知。可以通过 curl 命令调用该接口。

请求示例
curl "https://domain/admin/index/checkHeartbeat?api_key=123456"
参数说明
  • api_key:必填参数,用于验证请求的合法性。需要在 setting 表中配置 api_key 的值。
返回结果
  • 如果客户端断开连接,返回如下结果:

    {
      "code": 1,
      "msg": "客户端断开连接,日志已记录",
      "data": "1698765432 客户端断开连接"
    }
  • 如果客户端重连成功,返回如下结果:

    {
      "code": 1,
      "msg": "客户端重连成功,日志已更新",
      "data": "1698765600 客户端重连成功"
    }
  • 如果客户端连接正常,返回如下结果:

    {
      "code": 0,
      "msg": "客户端连接正常"
    }

总结

本次更新通过新增 Telegram 通知、API Key 配置和客户端状态管理功能,增强了系统的实时通知能力和扩展性。用户可以在设置页面中配置 Telegram Bot Token、Chat ID 和 API Key,系统会在客户端状态变化时自动发送通知。数据库新增了四个字段以支持这些功能。

通过 curl 命令调用 checkHeartbeat 接口,可以方便地检测客户端状态并触发通知。