You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.08 16:42:28