如何为Mattermost实现对接MantisBT的自定义链接预览插件
绝对可行!我之前帮团队做过类似的MantisBT插件来实现自定义链接预览,下面给你拆解具体的实现步骤,完全能达到你想要的效果:
一、功能可行性确认
MantisBT本身具备完善的插件扩展体系,同时官方提供了REST API用于获取任务数据,所以你想要的“捕获特定链接+展示任务预览”功能完全可以实现。核心思路就是通过插件钩子拦截消息内容,匹配目标链接后调用API拉取数据,再把预览内容追加到原消息里。
二、具体实现步骤
1. 搭建插件基础框架
首先在MantisBT的plugins/目录下创建插件文件夹(比如TaskLinkPreview/),然后创建主插件文件TaskLinkPreview.php,写入基础的插件注册信息:
<?php class TaskLinkPreviewPlugin extends MantisPlugin { function register() { $this->name = '任务链接预览插件'; $this->description = '捕获特定格式的任务链接,自动展示任务摘要、经办人、状态等信息'; $this->version = '1.0'; $this->requires = array( 'MantisCore' => '2.0.0', // 适配你使用的MantisBT版本 ); $this->author = '你的名字'; $this->contact = '你的邮箱'; $this->url = ''; } function hooks() { // 注册消息渲染钩子,用来处理消息内容 return array( 'EVENT_VIEW_BODY_RENDER' => 'generate_link_preview', ); } }
2. 实现链接捕获与预览生成逻辑
在插件类里添加钩子处理函数,负责匹配链接、调用API并生成预览内容:
function generate_link_preview( $p_event, $p_body ) { // 匹配你指定的链接格式 $link_pattern = '/https:\/\/tasks.com\/b\/(\d+)/'; preg_match_all( $link_pattern, $p_body, $match_results ); if( empty( $match_results[1] ) ) { return $p_body; // 没有匹配到目标链接,直接返回原内容 } // 遍历所有匹配到的任务ID foreach( $match_results[1] as $task_id ) { $task_detail = $this->fetch_task_info( $task_id ); if( $task_detail ) { // 生成你想要的预览格式 $preview_content = "\n-----------------------------\n"; $preview_content .= "| {$task_id}: {$task_detail['summary']} |\n"; $preview_content .= "| assignee: {$task_detail['assignee']} |\n"; $preview_content .= "| status: {$task_detail['status']} |\n"; $preview_content .= "-----------------------------\n"; // 把预览内容追加到对应链接后面 $p_body = str_replace( "https://tasks.com/b/{$task_id}", "https://tasks.com/b/{$task_id}{$preview_content}", $p_body ); } } return $p_body; }
3. 调用MantisBT REST API获取任务信息
添加私有方法处理API请求,注意要配置正确的认证信息(建议用MantisBT个人设置里生成的API Token):
private function fetch_task_info( $p_task_id ) { // 替换成你的MantisBT实例REST API地址 $api_endpoint = "https://你的任务服务器地址/api/rest/issues/{$p_task_id}"; // API认证头,用API Token的话格式是 base64_encode('token值:') $request_headers = array( 'Authorization: Basic ' . base64_encode( '你的API_TOKEN:' ), 'Content-Type: application/json', ); // 发起HTTP请求 $curl = curl_init(); curl_setopt( $curl, CURLOPT_URL, $api_endpoint ); curl_setopt( $curl, CURLOPT_HTTPHEADER, $request_headers ); curl_setopt( $curl, CURLOPT_RETURNTRANSFER, true ); $api_response = curl_exec( $curl ); curl_close( $curl ); if( !$api_response ) { return false; } $task_data = json_decode( $api_response, true ); if( empty( $task_data ) ) { return false; } // 从API返回结果中提取需要的字段(字段名根据你的API返回结构调整) return array( 'summary' => $task_data['summary'], 'assignee' => $task_data['handler']['name'] ?? '未分配', 'status' => $task_data['status']['name'] ?? '未知', ); }
4. 安装与测试
- 把插件文件夹放到MantisBT的
plugins/目录下 - 登录MantisBT后台,进入「管理」→「插件管理」,找到你的插件并启用
- 发送包含
https://tasks.com/b/1234格式的消息,就能看到自动生成的任务预览了
三、优化小建议
- 加入缓存机制:把获取到的任务信息缓存10-30分钟,避免频繁调用API增加服务器负载
- 异常处理:API请求失败时,返回“无法获取任务信息”的提示,提升用户体验
- 样式优化:如果MantisBT支持消息内HTML渲染,可以用简单的HTML标签(比如
<hr>、<div>)美化预览样式
内容的提问来源于stack exchange,提问作者sadovsf
相关产品推荐
相关产品推荐

