如何使用C#开发实现Skype指定联系人消息发送功能
C# 向Skype指定联系人发送消息的可行实现方案
Skype4Com 依赖的旧版 Skype Desktop API 已在2018年被微软彻底移除,所有基于该组件的旧方案均已失效,目前可落地的实现路径按稳定性排序如下:
方案1:基于Azure Bot + Bot Framework SDK(最稳定,适合后台日志推送场景)
这是官方支持的服务端主动发消息方案,不需要前台挂Skype客户端,长期运行稳定性最高,完全适配自动推日志的需求:
- 实现步骤:
- 在Azure门户创建Azure Bot资源,开启Skype频道,按照引导完成Bot的Skype配置(个人使用不需要公开发布,将自己账号添加为Bot联系人即可)
- 记录Bot的AppId、AppSecret,同时获取要接收消息的目标联系人Skype ID(格式为
live:xxx,可在Skype个人资料页找到) - C#项目通过NuGet安装
Microsoft.Bot.Connector包
- 核心代码示例:
using Microsoft.Bot.Connector; using Microsoft.Bot.Connector.Authentication; using System; using System.Collections.Generic; // 初始化Bot认证 var appId = "你的Azure Bot AppId"; var appSecret = "你的Azure Bot AppSecret"; var targetSkypeId = "目标联系人Skype ID,例:live:123456_abcdef"; var credentials = new MicrosoftAppCredentials(appId, appSecret); var connectorClient = new ConnectorClient(new Uri("https://smba.trafficmanager.net/apis/"), credentials); // 创建和目标用户的直连会话 var conversationId = await connectorClient.Conversations.CreateDirectConversationAsync( new ChannelAccount { Id = targetSkypeId }, new ChannelAccount { Id = $"28:{appId}" } ); // 构造日志消息 var message = Activity.CreateMessageActivity(); message.Text = "应用运行日志内容"; // 替换为实际日志文本 message.From = new ChannelAccount { Id = $"28:{appId}" }; message.Recipient = new ChannelAccount { Id = targetSkypeId }; message.Conversation = new ConversationAccount { Id = conversationId.Id }; // 发送消息 await connectorClient.Conversations.SendToConversationAsync((Activity)message);
- 注意点:首次使用需要在Skype中把创建的Bot添加为联系人,后续即可无交互自动发消息,无严格的接口调用频率限制,适合长期运行的日志推送场景。
方案2:基于Microsoft Graph API(适合个人账号临时使用)
如果不想创建Bot资源,可以用Graph API直接调用个人Skype账号发消息:
- 实现步骤:
- 在Azure AD注册个人账号应用,授权
Chat.Create、ChatMessage.Send委托权限 - 通过OAuth设备码流获取账号访问令牌(后台服务可以缓存刷新令牌,避免重复授权)
- 通过Graph SDK构造聊天会话发送消息
- 在Azure AD注册个人账号应用,授权
- 核心代码示例:
using Microsoft.Graph; using Azure.Identity; var clientId = "你的Azure AD应用ClientId"; var tenantId = "consumers"; // 个人账号固定填consumers var targetSkypeId = "目标联系人Skype ID"; // 设备码认证,适配无界面服务场景 var credential = new DeviceCodeCredential((code) => { Console.WriteLine($"请访问 {code.VerificationUrl} 输入代码 {code.UserCode} 完成授权"); }, tenantId, clientId); var graphClient = new GraphServiceClient(credential); // 创建一对一聊天会话 var chat = new Chat { ChatType = ChatType.OneOnOne, Members = new List<ConversationMember> { new AadUserConversationMember { Roles = new List<String> { "owner" }, AdditionalData = new Dictionary<string, object> { {"user@odata.bind", $"https://graph.microsoft.com/v1.0/users/me"} } }, new SkypeUserConversationMember { Roles = new List<String> { "owner" }, Id = targetSkypeId } } }; var createdChat = await graphClient.Chats.PostAsync(chat); // 发送日志消息 await graphClient.Chats[createdChat.Id].Messages.PostAsync(new ChatMessage { Body = new ItemBody { Content = "应用运行日志内容" } });
- 注意点:个人账号的访问令牌有效期为1小时,需要缓存刷新令牌自动续期,否则每次服务重启都需要手动授权。
方案3:Skype Web私有接口(非官方,仅个人自用)
如果不想做Azure相关配置,可以直接调用Skype网页版的私有接口,该方案无官方支持,微软随时可能修改接口导致失效:
- 实现步骤:
- 登录网页版Skype,按F12抓包获取请求头中的
X-Skypetoken值,以及自己账号的Skype ID - 用HttpClient直接构造POST请求发消息
- 登录网页版Skype,按F12抓包获取请求头中的
- 核心代码示例:
using System.Net.Http; using System.Text; using Newtonsoft.Json; var skypeToken = "抓包获取的X-Skypetoken值"; var targetSkypeId = "目标联系人Skype ID"; var httpClient = new HttpClient(); httpClient.DefaultRequestHeaders.Add("X-Skypetoken", skypeToken); var payload = new { content = "应用运行日志内容", messagetype = "RichText", contenttype = "text" }; var json = JsonConvert.SerializeObject(payload); var content = new StringContent(json, Encoding.UTF8, "application/json"); // 调用消息发送接口 var apiUrl = $"https://client-s.gateway.messenger.live.com/v1/users/ME/conversations/{targetSkypeId}/messages"; var response = await httpClient.PostAsync(apiUrl, content); response.EnsureSuccessStatusCode();
- 注意点:Skype Token有效期通常为24小时,过期后需要重新抓包获取,该方案违反Skype服务条款,不建议在生产环境使用。
不推荐使用任何第三方封装的非公开Skype客户端SDK,这类库大多长期不更新,且存在账号被盗、消息泄露的风险。
内容的提问来源于stack exchange,提问作者tedious26
相关产品推荐
相关产品推荐

