如何程序化实现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,提问作者Данир Сабитов
相关产品推荐
相关产品推荐

