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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.12 04:41:30