You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Python中检测Skype通话的连接与断开状态?

问题分析

你当前的代码通过webbrowser调用Skype URI发起通话,但这种方式属于单向触发——脚本只是告诉系统打开Skype的通话链接,之后通话的所有流程都在Skype客户端内部运行,你的Python脚本和Skype之间没有建立双向通信通道,因此无法直接追踪通话是否接通、正在进行或已结束。

可行解决方案

方案1:使用Microsoft Graph API(官方推荐,支持跨平台)

如果你的场景基于微软生态的Skype(或Teams,目前个人Skype已逐步整合到Teams),可以通过Microsoft Graph的通信API发起通话并监听状态,核心步骤如下:

  1. 在Azure门户注册应用,获取客户端ID并申请Calls.Initiate.All、Calls.AccessMedia.All等权限
  2. 通过OAuth2完成身份认证,获取访问令牌
  3. 调用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对象,直接监听通话状态:

  1. 安装依赖:pip install pywin32
  2. 确保Skype客户端已启动并登录
  3. 通过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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 09:25:13