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

如何程序化实现Discord通话自动检测、接听与重置(非热键方案,支持快捷切换)

实现Discord个人账号自动接听通话的方案(无热键/机器视觉/机器人)

核心思路

放弃抓包方案,直接利用Discord客户端与本地程序的IPC(进程间通信)接口——这是Discord官方未公开但社区广泛使用的本地通信方式,无需依赖热键、机器视觉或服务器机器人,完全基于个人客户端的本地交互实现。

具体实现步骤

1. 连接Discord本地IPC套接字

Discord客户端会在本地创建IPC套接字,路径因系统而异:

  • Windows:%APPDATA%\discord\ipc-0(数字可能变化,遍历匹配即可)
  • Linux:/run/user/$(id -u)/discord-ipc-0
  • macOS:~/Library/Application Support/discord/ipc-0

用编程语言的socket库直接连接该套接字,注意Discord的IPC使用带长度前缀的JSON帧通信(前缀为4字节小端整数,代表后续JSON的字节长度)。

2. 鉴权与事件监听

连接成功后,发送OPCODE 0的鉴权请求(携带Discord客户端的会话信息,可通过读取客户端本地缓存或模拟RPC鉴权获取),鉴权通过后,订阅通话相关事件:

  • 监听CALL_CREATE事件:检测新来电
  • 监听VOICE_STATE_UPDATE事件:辅助判断通话状态变化

3. 自动接听逻辑

当监听到来电事件(且自动接听开关处于开启状态),发送OPCODE 1的操作请求,调用CALL_ACCEPT指令完成接听,无需手动操作。

4. 全局开关实现(F12切换)

用键盘监听库(如Python的pynput)监听F12按键,维护一个全局状态变量auto_accept_enabled,每次按下F12时切换该变量的布尔值,只有当变量为True时才执行自动接听逻辑。

5. 通话重置操作

当需要重置通话时,发送CALL_END指令结束当前通话,或发送VOICE_CHANNEL_LEAVE离开当前语音频道,按需执行重置逻辑。

简化代码示例(Python)

import socket
import json
import struct
from pynput import keyboard
import uuid

# 全局开关状态
auto_accept_enabled = False

def toggle_auto_accept(key):
    global auto_accept_enabled
    if key == keyboard.Key.f12:
        auto_accept_enabled = not auto_accept_enabled
        print(f"自动接听已{'开启' if auto_accept_enabled else '关闭'}")

# 启动键盘监听
listener = keyboard.Listener(on_press=toggle_auto_accept)
listener.start()

# 连接Discord IPC(Windows示例路径,替换为你的实际路径)
ipc_path = r"C:\Users\<你的用户名>\AppData\Roaming\discord\ipc-0"
sock = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
try:
    sock.connect(ipc_path)
except socket.error:
    print("无法连接Discord IPC,请确保Discord客户端已运行")
    exit()

# 发送鉴权请求(适配Discord IPC v1版本)
auth_payload = json.dumps({
    "op": 0,
    "d": {
        "v": 1,
        "client_id": "你的Discord客户端ID(可从客户端缓存获取)",
        "type": 2
    }
}).encode('utf-8')
# 添加4字节小端长度前缀
sock.send(struct.pack('<I', len(auth_payload)) + auth_payload)

# 监听事件并处理来电
while True:
    # 读取长度前缀
    length_data = sock.recv(4)
    if not length_data:
        break
    length = struct.unpack('<I', length_data)[0]
    # 读取JSON数据
    payload = json.loads(sock.recv(length).decode('utf-8'))
    
    # 检测来电事件
    if payload.get('t') == 'CALL_CREATE' and auto_accept_enabled:
        # 发送接听请求
        accept_payload = json.dumps({
            "op": 1,
            "d": {
                "cmd": "CALL_ACCEPT",
                "args": {"call_id": payload['d']['id']},
                "nonce": str(uuid.uuid4())
            }
        }).encode('utf-8')
        sock.send(struct.pack('<I', len(accept_payload)) + accept_payload)
        print("已自动接听来电")

注意事项

  • 确保Discord客户端始终处于运行状态,IPC连接依赖本地客户端
  • Discord的IPC协议可能随客户端版本更新,需根据实际返回的协议版本调整payload格式
  • 避免高频发送指令,防止触发Discord的反机制
  • 客户端ID可通过Discord客户端的本地缓存文件(如Local Storage中的数据)获取

内容的提问来源于stack exchange,提问作者Данир Сабитов

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 17:55:22