开黑啦kook 机器人开发 PHP swoole Liunx 服务器(宝塔)
安装环境 PHP 拓展 直接使用 宝塔一键安装 (Windows系统不支持)
设置命令行的PHP版本避免执行脚本时 获取不到 swoole
检查swoole是否安装成功
获取官方SDK
GitHub - kaiheila/php-bot: 开黑啦机器人的php版本https://github.com/kaiheila/php-bot
配置参数 机器人链接模式选择 webhook
密钥 自己设置
回调链接直接填写 (配置回调地址之前 先将机器人邀请进频道,在域名后面一定要自己定义域名端口如果是正常的80端口会被占用导致无法运行)
端口一定要开放否则无法监听到,如果是腾讯云就去安全组释放端口,最好在宝塔面板页开放端口
获取到邀请链接后直接请求即可
配置好参数示例:
使用tp5框架创建一个 api 文件 用于 配置 WebHook 回调地址 处理 Challenge 请求
(数据默认会先被进行 zlib (deflate) 压缩再发送。请先使用你使用的语言的 zlib 相关方法解压,或在提供给 KOOK 开放平台的 callback url 中加上 Query 参数 compress=0 以停用压缩)
config = [
'token' => Env::get('kook.token'),
'verify_token' => Env::get('kook.verify_token'),
'encrypt_key' => Env::get('kook.encrypt_key'),
];
}
public function start(){
$params = file_get_contents("php://input");
Log::info("接收参数");
$param = json_decode($params,true);
Log::info($param);
if (isset($param['encrypt']) && !empty($param['encrypt'])){
Log::info('解密信息');
$challenge = $this->decryptData($param['encrypt'],$this->config['encrypt_key']);
Log::info($challenge);
$response_data = json_decode($challenge,true);
Log::info($response_data);
if (!empty($response_data)){
// 判断是否是验证请求 s 等于 0 代表 消息(包含聊天和通知消息)
if (isset($response_data['s']) && $response_data['s'] == 0 && isset($response_data['d']['channel_type']) && $response_data['d']['channel_type'] == 'WEBHOOK_CHALLENGE'){
// 判断验证token是否正确
if ($response_data['d']['verify_token'] == $this->config['verify_token']) {
// code...
return json(['challenge' => $response_data['d']['challenge']]);
}else {
return json(['msg'=>'验证错误!']);
}
}
}
}
}
/
* 数据加密
* @param $data
* @param $key 密钥
* @return string
*/
private function encryptData($data, $key)
{
$iv = substr(md5(uniqid()), 0, 16);
return base64_encode($iv.openssl_encrypt($data, 'aes-256-cbc', $key, 0, $iv));
}
/
*
* 数据解密
* @param $eData
* @param $key 密钥
* @return false|string
*/
private function decryptData($eData, $key)
{
$eData = base64_decode($eData);
$iv = substr($eData, 0, 16);
return openssl_decrypt(substr($eData, 16), 'aes-256-cbc', $key, 0, $iv);
}
}
在项目根目录(在tp5 command文件夹中创建也可 自定义命令行 ) 创建一个 PHP文件 使用脚本运行 复制官方示例webhook.php即可 配置好参数
官方示例使用的是 swoole中的 http 服务器
实例化http服务器
$http = new Swoole\Http\Server(监听IP地址,监听端口);
监听IP地址: 可以填写 0.0.0.0 代表所有,可以指定 使用当前服务器IP
监听端口:则是你在机器人后台填写的 http请求地址的端口
参数配置好,打开终端 ,进入项目根目录
使用命令 检查端口是否被占用
netstat -anp | grep 9501
如果被占用这 使用命令 kill 进程 注意如果进程后面跟着 nginx 则代表端口被 nginx占用,那是在绑定域名时设置了端口号,这时候去宝塔域名把绑定了端口的域名删除即可,如果直接kill进程会导致nginx 停止运行(绑定域名时不用设置端口,设置回调地址时设置端口即可)
在执行 文件
php webhook.php 启动
启动成功 打印 啊啊啊
这是我自己在代码中添加的日志 $session->log('receiveFrame', '啊啊啊啊');
在频道内随便发送一条信息
监听到数据