PHP搭建TS3 Bot时无法发送消息,无报错原因求助
问题分析与解决方案
首先得明确:你目前的代码只是定义了一堆配置常量并把它们输出到页面,完全没有实现和Teamspeak 3服务器建立查询连接、执行发送消息操作的核心逻辑——这就是为什么测试时既没反应也没报错的原因,因为代码根本没碰TS3服务器的查询接口。
要实现TS3 Bot的消息发送功能,你需要通过TS3的Query接口(基于TCP的文本协议)和服务器交互,下面是完整的实现步骤和示例代码:
核心实现步骤
- 建立与TS3 Query端口的TCP连接
- 发送登录指令验证身份
- 选择要操作的虚拟服务器(通过端口或者服务器ID)
- 发送消息到指定目标(比如服务器频道、特定客户端)
- 处理服务器响应,添加错误检测
- 关闭连接
完整示例代码
<?php // 基础配置常量 define("HOST", "localhost"); define("QUERY_USER", "serveradmin"); define("BOT_NICKNAME", "Test BOT"); define("QUERY_PASSWORD", "your_query_password_here"); // 这里填你的服务器查询密码 define("QUERY_PORT", 10011); define("SERVER_PORT", 9987); // 1. 建立TCP连接到TS3 Query服务器 $socket = fsockopen(HOST, QUERY_PORT, $errno, $errstr, 10); if (!$socket) { die("连接失败: $errstr ($errno)"); } // 读取服务器初始欢迎信息 fgets($socket); // 2. 登录到Query服务器 fwrite($socket, "login " . QUERY_USER . " " . QUERY_PASSWORD . "\n"); $response = fgets($socket); // 检查登录是否成功(TS3响应里包含error id=0表示成功) if (strpos($response, 'error id=0') === false) { die("登录失败: " . $response); } // 3. 设置Bot的昵称 fwrite($socket, "clientupdate client_nickname=" . urlencode(BOT_NICKNAME) . "\n"); fgets($socket); // 4. 选择要操作的虚拟服务器(通过端口) fwrite($socket, "use port=" . SERVER_PORT . "\n"); $response = fgets($socket); if (strpos($response, 'error id=0') === false) { die("选择虚拟服务器失败: " . $response); } // 5. 发送消息到服务器所有在线客户端(也可以指定频道/用户,看需求) // 这里是发送到服务器公告(所有在线用户都能收到) fwrite($socket, "sendtextmessage targetmode=1 msg=Hello from Test BOT!\n"); $response = fgets($socket); if (strpos($response, 'error id=0') !== false) { echo "消息发送成功!"; } else { echo "消息发送失败: " . $response; } // 6. 关闭连接 fwrite($socket, "quit\n"); fclose($socket); ?>
关键注意事项
- 查询密码: 确保
QUERY_PASSWORD填的是TS3服务器的Query密码(不是普通用户密码),你可以在TS3服务器的serverquery_login_password配置项里找到或者修改它。 - 错误处理: 一定要检查每个指令的响应,TS3的Query协议会返回包含错误码的响应,通过
error id=0判断操作是否成功,这样能快速定位问题。 - 字符编码: 发送包含特殊字符的昵称或消息时,要用
urlencode()编码,避免协议解析错误。 - 权限: 确保你的Query用户(默认是serveradmin)有足够的权限发送消息,比如
b_serverinstance_send_textmessage权限。
现在把这段代码替换你原来的测试代码,配置好正确的密码,再测试应该就能看到效果了。
内容的提问来源于stack exchange,提问作者Takio
相关产品推荐
相关产品推荐

