實戰模擬│企業微信機器人實時報錯預警

2022-06-13 12:02:29

一、建立機器人

  • 選擇群右鍵管理聊天資訊新增群機器人
  • 完善機器人基本資訊,包括頭像、名稱等

二、機器人設定說明

  • 建立好的機器人都有一個唯一的 webhook 地址
  • 一定要保護好自己的 webhook 地址,如果一旦洩露,可以通過移除機器人,再重新建立一個去處理
  • 點選 webhook 地址,可以看到檔案說明,也可以進行普通的推播訊息設定
  • 其中的自定義推播訊息,在機器人設定說明欄目裡面有詳細說明,但是需要自己開發

三、機器人資訊推播

  • 當前自定義機器人 支援文字(text)、markdown(markdown)、圖片(image)、圖文(news)四種訊息型別
  • 我們只要根據它的檔案說明,將指定型別的訊息傳送給 webhook 地址即可實現訊息推播
// 文字訊息型別
{
    "msgtype": "text",
    "text": {
        "content": "廣州今日天氣:29度,大部分多雲,降雨概率:60%",
        "mentioned_list":["wangqing","@all"],
        "mentioned_mobile_list":["13800001111","@all"]
    }
}

// markdown訊息型別
{
    "msgtype": "markdown",
    "markdown": {
        "content": "實時新增使用者反饋<font color="warning">132例</font>,請相關同事注意。\n
         >型別:<font color="comment">使用者反饋</font>
         >普通使用者反饋:<font color="comment">117例</font>
         >VIP使用者反饋:<font color="comment">15例</font>"
    }
}

// 圖片訊息型別
{
    "msgtype": "image",
    "image": {
        "base64": "DATA",
        "md5": "MD5"
    }
}

// 圖文訊息型別
{
    "msgtype": "news",
    "news": {
       "articles" : [
           {
               "title" : "中秋節禮品領取",
               "description" : "今年中秋節公司有豪禮相送",
               "url" : "www.qq.com",
               "picurl" : "http://res.mail.qq.com/node/ww/wwopenmng/images/independent/doc/test_pic_msg1.png"
           }
        ]
    }
}

四、錯誤預警推播

  • 這裡以 Thinkphp 框架為例,將錯誤預警整合到專案中,實現實時錯誤推播
  • 首先在 config 組態檔新增錯誤處理類,執行哪個檔案來處理錯誤
  • 設定完成後,專案只要遇到錯誤,程式都會走指定的檔案去處理
  • 然後在該檔案中完善錯誤推播預警邏輯即可,一般錯誤預警都是用 markdown 型別進行推播
'exception_handle'       => '\app\common\exception\WorkWx',
<?php
namespace app\common\exception;

use Exception;
use itbdw\Ip\IpLocation;
use app\common\util\Helper;
use think\exception\Handle;
use think\exception\HttpException;
use think\exception\ValidateException;

class WorkWx extends Handle
{
    const WEBHOOK = '填寫你自己的webhook地址';

    public function render(Exception $e)
    {
        $clientIP = Helper::getClientIp();
        $clientAddress = IpLocation::getLocation($clientIP);
        unset($clientAddress['ip']);
        $ipAddress = implode('-', $clientAddress);

        // 引數驗證錯誤
        if ($e instanceof ValidateException) {
            $data = [
                'msgtype' => 'markdown',
                'markdown' => [
                    'content' => "來自 **<font color="info">天眼</font>** 的溫馨提醒,請相關同事注意。
                             >**描述:** <font color="comment">引數驗證錯誤</font>
                             >**端IP:** <font color="comment">{$clientIP}</font>
                             >**地址:** <font color="comment">{$ipAddress}</font>
                             >**狀態:** <font color="comment">{$e->getCode()}</font>
                             >**行數:** <font color="comment">{$e->getLine()}</font>
                             >**檔案:** <font color="red">{$e->getFile()}</font>
                             >**提示:** <font color="warning">{$e->getError()}</font>
                             >**資訊:** <font color="warning">{$e->getMessage()}</font>"
                ]
            ];

            return Helper::postCurl(self::WEBHOOK, json_encode($data));
        }

        // 請求異常
        if ($e instanceof HttpException) {
            $data = [
                'msgtype' => 'markdown',
                'markdown' => [
                    'content' => "來自 **<font color="info">天眼</font>** 的溫馨提醒,請相關同事注意。
                             >**描述:** <font color="comment">請求異常</font>
                             >**端IP:** <font color="comment">{$clientIP}</font>
                             >**地址:** <font color="comment">{$ipAddress}</font>
                             >**狀態:** <font color="comment">{$e->getCode()}</font>
                             >**行數:** <font color="comment">{$e->getLine()}</font>
                             >**檔案:** <font color="red">{$e->getFile()}</font>
                             >**資訊:** <font color="warning">{$e->getMessage()}</font>"
                ]
            ];

            return Helper::postCurl(self::WEBHOOK, json_encode($data));
        }


        // 其他錯誤交給系統處理
        return parent::render($e);
    }
}