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

基于C++实现Teams消息转Telegram Bot的Webhook方案求助

改进思路与代码优化建议

一、核心功能缺失:Teams消息接收逻辑未实现

你的代码仅在main函数中写了空循环,完全没有处理Teams Webhook消息接收的逻辑。Teams是通过Outgoing Webhook将频道消息以POST请求的形式推送到你指定的服务地址,因此你的程序需要搭建一个HTTP服务端来监听并处理这些请求,而非空循环等待。

二、Telegram API调用错误

  1. API地址错误:你当前使用的https://t.me/ITSys****不是Telegram Bot的官方API地址,正确地址应为https://api.telegram.org/bot{你的bot_token}/sendMessage。
  2. Chat ID错误:chat_id需要填写目标聊天的数字ID(可通过向Bot发送消息后调用getUpdates接口获取),而非机器人名称。
  3. 参数未编码:直接拼接chat_id和text作为POST参数会导致特殊字符(如空格、中文)传输失败,需使用curl_easy_escape对参数进行URL编码。

三、Teams消息解析缺失

Teams推送的Webhook请求体是JSON格式,包含消息的完整内容(如发送者、文本、附件等),你需要解析该JSON来提取需要转发的内容。推荐使用轻量级JSON库nlohmann/json来处理解析逻辑。

四、7*24运行稳定性优化

  1. 异常捕获:为HTTP请求处理、网络调用等可能抛出异常的逻辑添加try-catch块,避免程序崩溃。
  2. 日志记录:添加日志输出(如写入文件或控制台),方便排查运行中的问题。
  3. 进程守护:在服务器部署时,可通过systemd等工具将程序配置为守护进程,确保意外退出后自动重启。

优化后的代码示例

以下是基于cpp-httplib(轻量HTTP服务库)和nlohmann/json的完整示例:

#include <iostream>
#include <string>
#include <curl/curl.h>
#include <nlohmann/json.hpp>
#include <httplib.h>

using namespace std;
using json = nlohmann::json;

// Telegram配置
const string BOT_TOKEN = "你的Telegram Bot Token";
const string CHAT_ID = "目标聊天的数字ID";

// CURL回调函数
size_t write_callback(void* ptr, size_t size, size_t nmemb, string* response) {
    response->append((char*)ptr, size * nmemb);
    return size * nmemb;
}

// 发送消息到Telegram
bool send_to_telegram(const string& text) {
    CURL* curl = curl_easy_init();
    if (!curl) return false;

    // URL编码参数
    char* encoded_text = curl_easy_escape(curl, text.c_str(), text.length());
    string post_fields = "chat_id=" + CHAT_ID + "&text=" + encoded_text;
    curl_free(encoded_text);

    string response;
    curl_easy_setopt(curl, CURLOPT_URL, ("https://api.telegram.org/bot" + BOT_TOKEN + "/sendMessage").c_str());
    curl_easy_setopt(curl, CURLOPT_POST, 1L);
    curl_easy_setopt(curl, CURLOPT_POSTFIELDS, post_fields.c_str());
    curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_callback);
    curl_easy_setopt(curl, CURLOPT_WRITEDATA, &response);
    
    // 开启SSL验证(生产环境建议开启)
    curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, 1L);
    curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, 2L);

    CURLcode res = curl_easy_perform(curl);
    bool success = (res == CURLE_OK);
    if (!success) {
        cerr << "Telegram API调用失败: " << curl_easy_strerror(res) << endl;
    }

    curl_easy_cleanup(curl);
    return success;
}

// 处理Teams Webhook请求
void handle_teams_webhook(const httplib::Request& req, httplib::Response& res) {
    try {
        // 解析Teams发送的JSON请求体
        json teams_data = json::parse(req.body);
        
        // 提取消息文本(根据Teams Webhook的实际结构调整)
        string message_text = teams_data["text"];
        // 可选:添加发送者信息
        string sender = teams_data["from"]["name"];
        string full_text = "来自Teams的消息 (" + sender + "):\n" + message_text;

        // 转发到Telegram
        if (send_to_telegram(full_text)) {
            res.status = 200;
            res.set_content("转发成功", "text/plain");
        } else {
            res.status = 500;
            res.set_content("转发失败", "text/plain");
        }
    } catch (const exception& e) {
        cerr << "解析Teams请求失败: " << e.what() << endl;
        res.status = 400;
        res.set_content("无效的请求格式", "text/plain");
    }
}

int main() {
    // 初始化CURL
    curl_global_init(CURL_GLOBAL_ALL);

    // 创建HTTP服务器,监听指定端口(如8080)
    httplib::Server svr;
    svr.Post("/teams-webhook", handle_teams_webhook);

    cout << "服务器启动,监听端口8080..." << endl;
    svr.listen("0.0.0.0", 8080);

    // 清理CURL资源
    curl_global_cleanup();
    return 0;
}

部署与编译说明

  1. 依赖安装:需安装libcurl、cpp-httplib和nlohmann/json(可通过包管理器或源码编译)。
  2. 编译命令:
g++ -o teams-to-telegram main.cpp -lcurl -pthread
  1. Teams配置:在Teams频道中创建Outgoing Webhook,将回调地址设置为你的服务器地址+/teams-webhook(如http://your-server-ip:8080/teams-webhook)。
  2. 守护进程配置:使用systemd创建服务文件,确保程序7*24运行:
[Unit]
Description=Teams to Telegram Forwarder
After=network.target

[Service]
Type=simple
ExecStart=/path/to/teams-to-telegram
Restart=always
User=your-user

[Install]
WantedBy=multi-user.target

内容的提问来源于stack exchange,提问作者R1kHarD

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 11:10:14