在Angular 5中获取Skype for Business用户状态与头像信息
嘿,我来给你分享两种经过验证的实现方案,分别针对Angular 5和C#,用来展示Skype for Business用户的在线状态与头像信息,希望能帮你快速落地需求!
Angular 5 实现方案
要在Angular 5里实现这个功能,核心是借助Skype for Business Web SDK来获取用户的状态和头像数据。下面是具体步骤:
1. 引入Web SDK脚本
首先在项目的index.html中引入Skype的Bootstrap脚本,这是初始化SDK的基础:
<script src="https://swx.cdn.skype.com/shared/v/1.2.18/SkypeBootstrap.min.js"></script>
2. 组件中初始化SDK并编写业务逻辑
在你的Angular组件(比如SkypeStatusComponent)中,先声明全局的Skype对象,然后在组件初始化时完成SDK的初始化,再编写获取用户状态和头像的方法:
import { Component, OnInit } from '@angular/core'; // 声明全局Skype对象,避免TS编译报错 declare var Skype: any; @Component({ selector: 'app-skype-status', templateUrl: './skype-status.component.html' }) export class SkypeStatusComponent implements OnInit { userEmail = 'user@domain.com'; // 目标用户邮箱/SIP地址 userPresence: string; userAvatarUrl: string; ngOnInit(): void { // 初始化Skype SDK Skype.initialize({ apiKey: 'SWX-BUILD-SDK' }, () => { this.loadUserInfo(this.userEmail); }, (error) => { console.error('Skype SDK初始化失败:', error); }); } private loadUserInfo(userEmail: string): void { const app = Skype.Application.getInstance(); // 查询目标用户 app.personsAndGroupsManager.createPersonQuery() .search(userEmail) .then((persons) => { if (persons.length > 0) { const targetUser = persons[0]; // 监听在线状态变化 targetUser.presence.status.changed((newStatus) => { this.userPresence = newStatus; }); // 获取初始状态 this.userPresence = targetUser.presence.status(); // 获取头像URL this.userAvatarUrl = targetUser.avatarUrl(); } else { console.error('未找到目标用户'); } }) .catch((error) => { console.error('获取用户信息失败:', error); }); } }
3. 模板中展示状态和头像
在组件的HTML模板里,直接绑定数据即可:
<div class="skype-user-info"> <img [src]="userAvatarUrl" alt="用户头像" class="avatar" /> <div class="presence-status"> 当前状态: {{ userPresence }} <!-- 可以根据状态显示不同样式,比如在线用绿色,离开用黄色 --> <span [ngClass]="{'status-online': userPresence === 'Online', 'status-away': userPresence === 'Away'}"></span> </div> </div>
C# 实现方案
如果是后端C#服务需要获取Skype for Business用户的状态和头像,推荐使用**UCWA(Unified Communications Web API)**来调用Skype服务器的接口。下面是具体实现:
1. 准备依赖与认证
首先安装Microsoft.Identity.Client包(用于获取OAuth令牌),然后配置Skype for Business服务器的认证信息:
using Microsoft.Identity.Client; using System.Net.Http; using System.Net.Http.Headers; using System.Threading.Tasks; public class SkypeService { // 配置参数,根据你的Skype环境修改 private const string ClientId = "your-client-id"; private const string TenantId = "your-tenant-id"; private const string SkypeServerUrl = "https://your-skype-server/ucwa/oauth/v1"; private const string Scope = "https://your-skype-server/ucwa/All"; private async Task<string> GetAccessToken() { var app = PublicClientApplicationBuilder .Create(ClientId) .WithTenantId(TenantId) .Build(); var result = await app.AcquireTokenInteractive(new[] { Scope }) .ExecuteAsync(); return result.AccessToken; } }
2. 获取用户在线状态
编写方法调用UCWA的presence接口:
public async Task<string> GetUserPresence(string userSip) { var accessToken = await GetAccessToken(); using var httpClient = new HttpClient(); httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", accessToken); // 先创建UCWA应用实例 var appResponse = await httpClient.PostAsync($"{SkypeServerUrl}/applications", null); var appData = await appResponse.Content.ReadAsAsync<dynamic>(); var appUrl = appData._links.self.href; // 查询用户presence var presenceUrl = $"{appUrl}/people/{userSip}/presence"; var presenceResponse = await httpClient.GetAsync(presenceUrl); var presenceData = await presenceResponse.Content.ReadAsAsync<dynamic>(); return presenceData.availability; // 返回状态,比如Online、Away等 }
3. 获取用户头像
UCWA提供了直接获取头像的接口,也可以通过用户SIP地址构造头像URL(如果服务器支持的话):
public async Task<string> GetUserAvatarUrl(string userSip) { var accessToken = await GetAccessToken(); using var httpClient = new HttpClient(); httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", accessToken); var appResponse = await httpClient.PostAsync($"{SkypeServerUrl}/applications", null); var appData = await appResponse.Content.ReadAsAsync<dynamic>(); var appUrl = appData._links.self.href; var personUrl = $"{appUrl}/people/{userSip}"; var personResponse = await httpClient.GetAsync(personUrl); var personData = await personResponse.Content.ReadAsAsync<dynamic>(); return personData._links.avatar.href; // 返回头像的直接URL }
注意事项
- Angular方案需要确保你的域名在Skype for Business服务器的CORS白名单中,否则会出现跨域问题。
- C#方案需要提前在Azure AD或本地AD中注册应用,获取对应的ClientId和权限。
- 两种方案都需要用户有访问Skype for Business数据的权限,比如企业内部用户的AD权限。
内容的提问来源于stack exchange,提问作者user7784348
相关产品推荐
相关产品推荐

