Skip to the content.

推送ActivityFeed到Teams

几个月前,Teams 团队又推出了新的 Graph API,让 app 可以给用户发送 Activity Feed。我们来看看如何做。

首先,我们的app需要使用较新的 manifest 1.7版本,当然如果使用最新的1.8版本就更好了。在manifest json中添加 webApplicationInfoactivities 配置块

{
  "$schema": "https://developer.microsoft.com/json-schemas/teams/v1.8/MicrosoftTeams.schema.json",
  "manifestVersion": "1.8",
  "version": "1.0.0",
  "id": "your app id",
  "packageName": "com.example.myapp",
  ...
  "webApplicationInfo": {
    "id": "AAD App ID",
    "resource": "Resource URL for acquiring auth token for SSO",
    "applicationPermissions": [ ... ],
  },
  "activities": {
    "activityTypes": [
      {
        "type":"taskCreated",
        "description":"Task Created Activity",
        "templateText":"{actor} created task {taskId} for you"
      },
      {
        "type":"teamMention",
        "description":"Team Mention Activity",
        "templateText":"{actor} mentioned team"
      }
    ]
  }
}

webApplicationInfo 中的 id 指的是 AzureAD app 的 ID (client ID),resource 是 app 的 reply url (或者 redirect url)。

activities 中,type 是指 activity 的类型,它在整个manifest文件里需要唯一。description 是这类 activity 的简称,templateText 是 activity feed 推送的文本内容,它是一个模版,{actor} 在这里是一个特殊的类型,teams系统会自动填写,如果发送activity feed使用的是 delegated 验证的话,actor就显示delegated的用户的名字,如果是 application 验证的话,它显示的是 app 的名字。{taskId}是一个自定义的参数,你可以在发送 activity feed 的时候指定值。

我们准备好了manifest文件后,可以安装到teams 里,并且我们还需要确保一点:接受 activity feed 的用户也必须安装了我们的app,我之前有一篇文章讲的是如何主动给用户安装 app,有兴趣的读者可以参考那篇文章,这样就可以把你的app主动推给所有的用户进行安装。(当然,你的app首先需要取得相应的权限)。

准备工作做好后,我们就可以发送一个 Graph API的请求。如下:

POST https://graph.microsoft.com/beta/chats/{chatId}/sendActivityNotification
Content-Type: application/json

{
    "topic": {
        "source": "entityUrl",
        "value": "https://graph.microsoft.com/beta/chats/{your-chat-id}"
    },
    "activityType": "taskCreated",
    "previewText": {
        "content": "A new task was created"
    },
    "recipient": {
        "@odata.type": "microsoft.graph.aadUserNotificationRecipient",
        "userId": "569363e2-1111-2222-3333-16f245c5d66a"
    },
    "templateParameters": [
        {
            "name": "taskId",
            "value": "123445"
        }
    ]
}

大家可以看到在 templateParameters 中,我们指定了taskId 参数,这个参数就对应到了之前 manifest 文件里 activities 节点下的 {taskId}

      {
        "type":"taskCreated",
        "description":"Task Created Activity",
        "templateText":"{actor} created task {taskId} for you"
      },

所以最终推送出去的文字内容就是 SomeName created task 123445 for you

Written on June 12, 2021