如何在Python中检测Skype通话的连接与断开状态?
问题分析
你当前的代码通过webbrowser调用Skype URI发起通话,但这种方式属于单向触发——脚本只是告诉系统打开Skype的通话链接,之后通话的所有流程都在Skype客户端内部运行,你的Python脚本和Skype之间没有建立双向通信通道,因此无法直接追踪通话是否接通、正在进行或已结束。
可行解决方案
方案1:使用Microsoft Graph API(官方推荐,支持跨平台)
如果你的场景基于微软生态的Skype(或Teams,目前个人Skype已逐步整合到Teams),可以通过Microsoft Graph的通信API发起通话并监听状态,核心步骤如下:
- 在Azure门户注册应用,获取客户端ID并申请
Calls.Initiate.All、Calls.AccessMedia.All等权限 - 通过OAuth2完成身份认证,获取访问令牌
- 调用API发起通话,同时通过Webhook或轮询API获取实时状态
核心代码示例:
import requests # 替换为你的实际令牌和应用配置 access_token = "YOUR_ACCESS_TOKEN" headers = { "Authorization": f"Bearer {access_token}", "Content-Type": "application/json" } # 构造通话请求体 call_payload = { "targets": [{"identity": {"user": {"id": "skype.test.user.1"}}}], "requestedModalities": ["audio"], "callbackUri": "https://your-internal-endpoint.com/call-status" # 接收状态通知的回调地址 } # 发起通话 response = requests.post( "https://graph.microsoft.com/v1.0/communications/calls", headers=headers, json=call_payload ) # 轮询获取通话状态 call_id = response.json()["id"] status_response = requests.get( f"https://graph.microsoft.com/v1.0/communications/calls/{call_id}", headers=headers ) call_status = status_response.json()["state"] # 状态取值包括connecting/connected/disconnected等
方案2:Windows平台下使用Skype COM接口(仅桌面Skype)
如果是Windows系统的桌面版Skype,可以通过pywin32库访问Skype的COM对象,直接监听通话状态:
- 安装依赖:
pip install pywin32 - 确保Skype客户端已启动并登录
- 通过COM接口连接Skype并绑定事件监听
示例代码:
import win32com.client import pythoncom class SkypeCallListener: def OnCallStatus(self, call, status): # 通话状态变更时触发回调 status_map = { 0: "未知状态", 1: "响铃中", 2: "通话中", 3: "已结束" } print(f"通话状态更新: {status_map.get(status, '无法识别')}") def track_skype_call(number): pythoncom.CoInitialize() # 绑定Skype COM对象和事件监听 skype = win32com.client.DispatchWithEvents("Skype4COM.Skype", SkypeCallListener) # 通过COM直接发起通话 skype.PlaceCall(number) # 保持脚本运行以监听事件 print("正在监听通话状态...按Ctrl+C退出") try: while True: pythoncom.PumpWaitingMessages() except KeyboardInterrupt: print("停止监听") track_skype_call('skype.test.user.1')
方案3:临时手动确认(快速兼容)
如果暂时无法接入API或COM接口,可以在脚本中添加手动确认逻辑,让用户反馈通话状态:
import webbrowser def call_number(number): try: print(f"正在呼叫: {number}") skype_uri = f"skype:{number}?call" webbrowser.open_new_tab(skype_uri) # 手动输入通话状态 user_status = input("请输入当前通话状态(接通/未接通/已结束):") print(f"已记录通话状态: {user_status}") except Exception as e: print(f"呼叫失败: {number}") print(str(e)) call_number('skype.test.user.1')
内容的提问来源于stack exchange,提问作者Soumya Boral
相关产品推荐
相关产品推荐

