php实现钉钉业务报警机器人
使用场景,服务器报异常错误,想要及时收到报警信息并处理
环境介绍,本博使用yaf框架+php,仅仅提供思路,参考,具体根据自己实际情况进行编写
1,每十分钟执行一次任务脚本
# 每10分钟执行一次的任务
if [ "0" -eq "$(($minute % 10))" ]; then
php -f ${pathRoot}public/index.php 'request_uri=/error/dingdingLog'
fi
2,先在钉钉pc端创建业务机器人
具体操作,参考:https://ding-doc.dingtalk.com/doc#/serverapi2/qf2nxq
我使用的是第三种方式,ip段
3,如果是已添加之后,复制链接
这是你需要群发消息的地址
https://oapi.dingtalk.com/robot/send?access_token=XXXXXX
4,php实现,捕获接口异常
/**
* error action
*
* @return bool
* @throws Exception
*/
public function errorAction()
{
$req = $this->getRequest();
$exception = $req->getException();
//来自接口的错误
if ($exception instanceof ApiException) {
return $this->json($exception->getCode(), $exception->getMessage());
}
//其它异常
if ($this->yafAutoRender) {
$exceptions = [];
if (! $exception instanceof Exception) {
$exception = new Yaf\Exception\LoadFailed('no exception');
}
//add exception
$exceptions[] = $exception;
//show trace
$this->getView()->exceptions = $exceptions;
Yaf\Dispatcher::getInstance()->autoRender(true);
} else {
if ($exception instanceof Yaf\Exception\LoadFailed) { //接口不存在
$this->log($exception, ApiException::NOT_EXISTS);
return $this->json(ApiException::NOT_EXISTS, $exception->getMessage());
}
$this->log($exception);
return $this->json(ApiException::FATAL, $exception->getMessage());
}
}
5,修改框架错误日志log写入方法
/**
* error log
*
* @param Exception $exception
* @param int $error_code 0-正常报错
*/
private function log($exception, $error_code = 0)
{
//log exception
$msg = sprintf("%s:%s. in %s on line %s, trace:%s",
get_class($exception),
$exception->getMessage(),
$exception->getFile(),
$exception->getLine(),
$exception->getTraceAsString()
);
// 排除 404 的报错才推送
// there is not method / not such file or diractory
if ($error_code != ApiException::NOT_EXISTS) {
$this->saveLog($exception->getMessage());
}
LK::log()->error($msg);
}
如上所示,我将一部分日志写入redis
6,保存日志
public function saveLog($msg)
{
$redis = LK::redis('log');
$key = md5($msg);
$saved = $redis->sadd('error_log', $key);
if ($saved) {
$redis->setex($key, 1100, $msg);
}
return $saved;
}
7,读取redis消息,给钉钉推送错误消息
public function dingdingLogAction()
{
$redis = LK::redis('log');
$keys = $redis->sMembers('error_log');
if (count($keys)) {
foreach ($keys as $key) {
if (false != ($msg = $redis->get($key))) {
Func::dingdingLog($msg);
}
}
$redis->del('error_log');
}
}
8,curl上面那个地址,具体信息自行修改
/**
* 钉钉消息推送
* 推到钉钉 php+web 群
* @return bool
*/
public static function dingdingLog($msg)
{
$url = 'https://oapi.dingtalk.com/robot/send?access_token=XXXXXX';
$env = \Yaf\Application::app()->environ();
$fix = 'somi';
$time = date('Y-m-d H:i:s');
$data = [
'msgtype' => 'text',
'text' => [
'content' => "[{$fix}:{$env}:{$time}]:{$msg}",
]
];
$data_string = json_encode($data);
$resp = \Frame\Core\Tools::curl($url, 'POST', $data_string, ['Content-Type: application/json;charset=utf-8']);
$resp = json_decode($resp, true);
if ($resp['errorcode']) {
return false;
}
return true;
}
9,如图是我的报警信息示例
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
· 三行代码完成国际化适配,妙~啊~