Skip to the content.

把微信公众号的消息转发给 Teams

我们上篇文章说了如何使用 GraphAPI 给 Teams 的 channel 和 chat 里发送消息,我们今天来看一个具体例子:

当用户给微信公众号里发送消息,我们如何把这个消息转发到 Teams 里。

要将用户发送给微信公众号的消息转发到 Teams,需要使用一个中间服务来接收微信公众号的消息并将其转发到 Teams。

首先,我们需要在微信公众号上配置服务器配置,以便将消息发送到您的中间服务器。

然后,在中间服务器上使用微信公众号的 API 接收来自用户的消息。

接下来,使用 Microsoft Graph API 来将消息发送到 Teams。在应用程序中使用 Microsoft 身份验证库(MSAL)来获取访问令牌,并使用该令牌来调用 Microsoft Graph API。

最后,使用 Microsoft Graph API 在 Teams 中发送消息,例如在聊天会话中发送文本消息或附件。这里就涉及到上篇文章的内容。

请微信公众号相关权限

  1. 注册微信公众平台帐号:首先,在微信公众平台注册帐号,并通过认证。

  2. 创建公众号:然后,创建一个微信公众号,并将其与您的帐号关联。

  3. 开通权限:接下来,在公众号后台中开通相关权限,如消息管理权限、消息接收权限等。

  4. 配置服务器:最后,在公众号后台中配置服务器,并将消息推送到您的服务器。

接收来自用户的消息

  1. 配置服务器:在服务器上配置好开发环境,并配置好服务器域名,用于接收微信服务器发送的消息。

  2. 使用微信公众号的 API:接下来,使用微信公众号的 API 接收用户的消息。微信公众号提供了丰富的API,用于接收消息、发送消息、管理用户等。

  3. 最后,编写代码来实现接收用户消息的功能。可以使用编程语言如Python、C#等编写代码。

以下是一个示例 C# 代码,使用微信公众号的 API 接收用户的消息:

using System;
using System.Xml;
using System.IO;

public class WeChatController : ApiController
{
    [HttpPost]
    public HttpResponseMessage HandleWeChatMessage()
    {
        // 获取请求的XML数据
        StreamReader reader = new StreamReader(HttpContext.Current.Request.InputStream);
        string requestXml = reader.ReadToEnd();

        // 将XML数据转换为XML文档
        XmlDocument requestDoc = new XmlDocument();
        requestDoc.LoadXml(requestXml);

        // 解析XML文档,获取用户的消息
        string msgType = requestDoc.SelectSingleNode("xml/MsgType").InnerText;
        string content = requestDoc.SelectSingleNode("xml/Content").InnerText;

        // 处理用户的消息
        string responseContent = "";
        if (msgType == "text")
        {
            responseContent = "您发送的消息是:" + content;
        }
        else if (msgType == "image")
        {
            responseContent = "您发送的是图片,图片地址为:" + requestDoc.SelectSingleNode("xml/PicUrl").InnerText;
        }
        // 其他类型的消息处理方式类似
        // ...

        // 构造响应的XML数据
        string responseXml = string.Format("<xml><ToUserName><![CDATA[{0}]]></ToUserName><FromUserName><![CDATA[{1}]]></FromUserName><CreateTime>{2}</CreateTime><MsgType><![CDATA[text]]></MsgType><Content><![CDATA[{3}]]></Content></xml>", requestDoc.SelectSingleNode("xml/FromUserName").InnerText, requestDoc.SelectSingleNode("xml/ToUserName").InnerText, DateTime.Now.Ticks, responseContent);

        // 返回响应的XML数据
        HttpResponseMessage response = new HttpResponseMessage();
        response.Content = new StringContent(responseXml, Encoding.UTF8, "application/xml");
        return response;
    }
}

这段代码实现了一个 ASP.NET Web API 控制器,它接收来自微信服务。首先,它使用 HttpPost 标记的 HandleWeChatMessage 方法来处理来自微信服务器的 POST 请求。在这个方法中,它首先通过读取请求的 InputStream 来获取请求的 XML 数据。然后,它将 XML 数据转换为 XML 文档,并使用 XmlDocument 类的 LoadXml 方法加载该文档。

接下来,它使用 SelectSingleNode 方法解析 XML 文档,获取用户发送的消息类型(例如文本、图片等)和内容。根据消息类型,它会执行不同的处理方式。例如,如果消息类型是文本,它会返回一条消息,表示“您发送的消息是:” + 用户发送的文本内容。如果消息类型是图

发送消息到 Microsoft Teams

以下是一个示例 C# 代码,使用 Microsoft Graph API 在 Teams 中发送消息:

using Microsoft.Graph;
using Microsoft.Identity.Client;
using System.Net.Http.Headers;
using System.Threading.Tasks;

class Program
{
    static void Main(string[] args)
    {
        // 获取访问令牌
        var graphClient = GetAuthenticatedClient();

        // 发送消息
        var message = new ChatMessage
        {
            Body = new ItemBody
            {
                Content = "Hello, Teams!"
            },
            ToRecipients = new List<Recipient>
            {
                new Recipient
                {
                    EmailAddress = new EmailAddress
                    {
                        Address = "user@contoso.com"
                    }
                }
            }
        };

        graphClient.Teams["{team-id}"].Channels["{channel-id}"].Messages.Request().AddAsync(message);

    }

    private static GraphServiceClient GetAuthenticatedClient()
    {
        IPublicClientApplication app = PublicClientApplicationBuilder
            .Create("your-client-id")
            .WithTenantId("your-tenant-id")
            .Build();
        string[] scopes = new string[] { "https://graph.microsoft.com/.default" };
        AuthenticationResult result = app.AcquireTokenInteractive(scopes).ExecuteAsync().Result;
        GraphServiceClient graphClient = new GraphServiceClient(
            new DelegateAuthenticationProvider(
                (requestMessage) =>
                {
                    requestMessage.Headers.Authorization =
                        new AuthenticationHeaderValue("bearer", result.AccessToken);
                    return Task.FromResult(0);
                }));
        return graphClient;
    }
}

该代码使用了 Microsoft Graph SDK for .NET 来发送消息。它首先使用 MSAL 获取访问令牌,然后使用该令牌创建一个已身份验证的 GraphServiceClient 对象。接下来,代码使用该对象发送消息到 Teams 的特定团队和频道。需要注意的是,在使用这段代码之前,需要替换client_id,tenant_id, team_id, channel_id。

如果我们想把消息发送到 chat,而不是 channel,可以看一下我的前一篇文章,只需要修改一句话就可以了。

注意点

在使用 Microsoft Graph API 发送消息到 Teams 时,需要注意以下几点:

  • 权限:首先,您需要确保您有足够的权限来发送消息。您需要在 Azure 门户中为您的应用程序授予“TeamsAppPermission.SendChatMessage”权限。

  • 团队和频道 ID:您需要知道要发送消息的团队和频道的 ID。可以通过 Microsoft Graph API 获取团队和频道的 ID。

  • 用户邮件地址:您需要知道要发送消息的用户的邮件地址。可以通过 Microsoft Graph API 查询用户的邮件地址。

  • 身份验证:您需要使用已身份验证的 GraphServiceClient 对象来发送消息。您需要使用 MSAL 获取访问令牌,并使用该令牌创

Written on July 10, 2022