From 0bcfea6aa44239928d9bca5ede8523beb71fdf41 Mon Sep 17 00:00:00 2001 From: sunxyw <31698606+sunxyw@users.noreply.github.com> Date: Fri, 18 Mar 2022 02:30:45 +0800 Subject: [PATCH 1/7] add qingyunke chatbot integration example --- .../example/integrate-qingyunke-chatbot.md | 87 +++++++++++++++++++ 1 file changed, 87 insertions(+) create mode 100644 docs/advanced/example/integrate-qingyunke-chatbot.md diff --git a/docs/advanced/example/integrate-qingyunke-chatbot.md b/docs/advanced/example/integrate-qingyunke-chatbot.md new file mode 100644 index 00000000..b59d92e6 --- /dev/null +++ b/docs/advanced/example/integrate-qingyunke-chatbot.md @@ -0,0 +1,87 @@ +# 接入青云客智能聊天机器人API + +作为一个群聊机器人,懂得聊天会让机器人增色不少,在大数据和 AI 热潮下,不少厂商都研发了自己的智能聊天 API,例如图灵机器人、腾讯智能闲聊等,大厂开发的 API 自然有着他人无可比拟的健壮性和可靠性,但是随之而来不菲的价格显然并不适合大众开发者。这时候一个免费、可用的智能聊天 API 便非常重要了,其中,青云客是少有的完全免费、无需注册的智能聊天 API,提供了包括智能聊天、歌词、天气查询、笑话等多种有用功能,且接入简单,非常适合新手开发者尝试。 + +## 阅读接入指南 + +不管接入何种服务,阅读接入指南永远都是最优先、最重要的一步,所幸青云客的接入指南十分简单,简单来说归纳为以下: +* 请求:GET https://api.qingyunke.com/api.php +* 参数: +* * `key` 目前固定为 `free` +* * `appid` 目前固定为 `0` +* * `msg` 关键词,需要经过 `urlencode` +* 注意:返回结果中 `{br}` 代表换行 + +## 逻辑编写 + +阅读过后,我们便可以进行主要的编写工作了。 + +首先,为了机器人的性能考虑,也为了避免过分打扰群聊的聊天,我们希望机器人只有在主动触发(@AT 或者 关键词等)时才会进行智能聊天。 + +对于关键词匹配,我们可以使用 `@CQCommand`: + +```php +/** + * 智能聊天 + * + * @CQCommand(start_with="机器人") + */ +public function chat() +{ + // 替换掉机器人前缀,并获取消息内容 + $msg = ctx()->getMessage(); + $msg = substr_replace($msg, ' ', 3, -strlen($msg)); + ctx()->setMessage($msg); + $msg = ctx()->getFullArg('怎么了?'); + + // 确认没有其他同名命令 + if (MessageUtil::matchCommand($msg, ctx()->getData())->status === false) { + Console::info('正在获取智能聊天回复:' . $msg); + // 请求 API 获取回复 + $raw_data = file_get_contents('https://api.qingyunke.com/api.php?key=free&appid=0&msg=' . urlencode($msg)); + try { + $data = json_decode($raw_data, true, 512, JSON_THROW_ON_ERROR); + } catch (\Exception $e) { + $data = ['content' => '机器人解析异常,请稍后再试']; + Console::warning('无法获取智能聊天回复:' . $e->getMessage()); + } + if ($data['result'] !== 0) { + $data = ['content' => '机器人服务异常,请稍后再试']; + Console::warning('无法获取智能聊天回复:' . $raw_data); + } + Console::info('获取智能聊天回复完成:' . $data['content']); + // 将 {br} 替换为换行 + $data['content'] = strtr($data['content'], ['{br}' => "\n"]); + return $data['content']; + } + return true; +} +``` + +这样我们的命令便只会在用户发送以`机器人`开头的消息时才会触发。 + +同时,我们也希望在 @AT 机器人时也进行回复,此时可以使用 `@CQBefore` 方法进行折中: + +```php +/** + * 将 AT 机器人的消息交由智能聊天处理 + * + * @CQBefore("message") + */ +public function changeAt(): bool +{ + // 判断此条消息是否 AT 了机器人 + if (MessageUtil::isAtMe(ctx()->getMessage(), ctx()->getRobotId())) { + // 将 AT 本身从消息中去掉 + $msg = str_replace(CQ::at($this->bot->getSelfId()), '', ctx()->getMessage()); + ctx()->setMessage($msg); + // 调用智能聊天 + ctx()->reply($this->chat()); + return false; + } + return true; +} +``` + + + From a33d320f4ccaae02b4a3fefd6988cb3172650628 Mon Sep 17 00:00:00 2001 From: sunxyw <31698606+sunxyw@users.noreply.github.com> Date: Fri, 18 Mar 2022 02:54:23 +0800 Subject: [PATCH 2/7] update integrate-qingyunke-chatbot.md --- .../example/integrate-qingyunke-chatbot.md | 59 ++++++++++--------- 1 file changed, 30 insertions(+), 29 deletions(-) diff --git a/docs/advanced/example/integrate-qingyunke-chatbot.md b/docs/advanced/example/integrate-qingyunke-chatbot.md index b59d92e6..a502e136 100644 --- a/docs/advanced/example/integrate-qingyunke-chatbot.md +++ b/docs/advanced/example/integrate-qingyunke-chatbot.md @@ -2,6 +2,10 @@ 作为一个群聊机器人,懂得聊天会让机器人增色不少,在大数据和 AI 热潮下,不少厂商都研发了自己的智能聊天 API,例如图灵机器人、腾讯智能闲聊等,大厂开发的 API 自然有着他人无可比拟的健壮性和可靠性,但是随之而来不菲的价格显然并不适合大众开发者。这时候一个免费、可用的智能聊天 API 便非常重要了,其中,青云客是少有的完全免费、无需注册的智能聊天 API,提供了包括智能聊天、歌词、天气查询、笑话等多种有用功能,且接入简单,非常适合新手开发者尝试。 +## 结果演示 +![圖片](https://user-images.githubusercontent.com/31698606/158875192-108698a3-b54e-4fc0-889a-0829ca328b13.png) + + ## 阅读接入指南 不管接入何种服务,阅读接入指南永远都是最优先、最重要的一步,所幸青云客的接入指南十分简单,简单来说归纳为以下: @@ -29,32 +33,29 @@ public function chat() { // 替换掉机器人前缀,并获取消息内容 - $msg = ctx()->getMessage(); - $msg = substr_replace($msg, ' ', 3, -strlen($msg)); - ctx()->setMessage($msg); - $msg = ctx()->getFullArg('怎么了?'); - - // 确认没有其他同名命令 - if (MessageUtil::matchCommand($msg, ctx()->getData())->status === false) { - Console::info('正在获取智能聊天回复:' . $msg); - // 请求 API 获取回复 - $raw_data = file_get_contents('https://api.qingyunke.com/api.php?key=free&appid=0&msg=' . urlencode($msg)); - try { - $data = json_decode($raw_data, true, 512, JSON_THROW_ON_ERROR); - } catch (\Exception $e) { - $data = ['content' => '机器人解析异常,请稍后再试']; - Console::warning('无法获取智能聊天回复:' . $e->getMessage()); - } - if ($data['result'] !== 0) { - $data = ['content' => '机器人服务异常,请稍后再试']; - Console::warning('无法获取智能聊天回复:' . $raw_data); - } - Console::info('获取智能聊天回复完成:' . $data['content']); - // 将 {br} 替换为换行 - $data['content'] = strtr($data['content'], ['{br}' => "\n"]); - return $data['content']; + $msg = $this->getContext()->getMessage(); + $msg = str_replace('机器人', '', $msg); + if (empty(trim($msg))) { + $msg = $this->getContext()->getFullArg('怎么了?'); } - return true; + + Console::info('正在获取智能聊天回复:' . $msg); + // 请求 API 获取回复 + $raw_data = file_get_contents('https://api.qingyunke.com/api.php?key=free&appid=0&msg=' . urlencode($msg)); + try { + $data = json_decode($raw_data, true, 512, JSON_THROW_ON_ERROR); + } catch (\Exception $e) { + $data = ['content' => '机器人解析异常,请稍后再试']; + Console::warning('无法获取智能聊天回复:' . $e->getMessage()); + } + if ($data['result'] !== 0) { + $data = ['content' => '机器人服务异常,请稍后再试']; + Console::warning('无法获取智能聊天回复:' . $raw_data); + } + Console::info('获取智能聊天回复完成:' . $data['content']); + // 将 {br} 替换为换行 + $data['content'] = strtr($data['content'], ['{br}' => "\n"]); + return $data['content']; } ``` @@ -71,12 +72,12 @@ public function chat() public function changeAt(): bool { // 判断此条消息是否 AT 了机器人 - if (MessageUtil::isAtMe(ctx()->getMessage(), ctx()->getRobotId())) { + if (MessageUtil::isAtMe($this->getContext()->getMessage(), $this->bot->getSelfId())) { // 将 AT 本身从消息中去掉 - $msg = str_replace(CQ::at($this->bot->getSelfId()), '', ctx()->getMessage()); - ctx()->setMessage($msg); + $msg = str_replace(CQ::at($this->bot->getSelfId()), '', $this->getContext()->getMessage()); + $this->getContext()->setMessage('机器人' . trim($msg)); // 调用智能聊天 - ctx()->reply($this->chat()); + $this->getContext()->reply($this->chat()); return false; } return true; From 6650846b157929a8e7c6e68b020985ad7506c591 Mon Sep 17 00:00:00 2001 From: sunxyw <31698606+sunxyw@users.noreply.github.com> Date: Fri, 18 Mar 2022 15:19:19 +0800 Subject: [PATCH 3/7] update integrate-qingyunke-chatbot.md --- docs/advanced/example/integrate-qingyunke-chatbot.md | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/docs/advanced/example/integrate-qingyunke-chatbot.md b/docs/advanced/example/integrate-qingyunke-chatbot.md index a502e136..cd193744 100644 --- a/docs/advanced/example/integrate-qingyunke-chatbot.md +++ b/docs/advanced/example/integrate-qingyunke-chatbot.md @@ -33,10 +33,10 @@ public function chat() { // 替换掉机器人前缀,并获取消息内容 - $msg = $this->getContext()->getMessage(); + $msg = ctx()->getMessage(); $msg = str_replace('机器人', '', $msg); if (empty(trim($msg))) { - $msg = $this->getContext()->getFullArg('怎么了?'); + $msg = ctx()->getFullArg('怎么了?'); } Console::info('正在获取智能聊天回复:' . $msg); @@ -72,12 +72,12 @@ public function chat() public function changeAt(): bool { // 判断此条消息是否 AT 了机器人 - if (MessageUtil::isAtMe($this->getContext()->getMessage(), $this->bot->getSelfId())) { + if (MessageUtil::isAtMe(ctx()->getMessage(), ctx()->getRobotId())) { // 将 AT 本身从消息中去掉 - $msg = str_replace(CQ::at($this->bot->getSelfId()), '', $this->getContext()->getMessage()); - $this->getContext()->setMessage('机器人' . trim($msg)); + $msg = str_replace(CQ::at(ctx()->getRobotId()), '', ctx()->getMessage()); + ctx()->setMessage('机器人' . trim($msg)); // 调用智能聊天 - $this->getContext()->reply($this->chat()); + ctx()->reply($this->chat()); return false; } return true; From 326f934013984c3bc7e7d3dc3e45abdb94a83a56 Mon Sep 17 00:00:00 2001 From: Jerry Ma Date: Fri, 18 Mar 2022 16:44:04 +0800 Subject: [PATCH 4/7] Update mkdocs.yml --- mkdocs.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/mkdocs.yml b/mkdocs.yml index d355837e..15b3316f 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -125,6 +125,7 @@ nav: - 开发实战教程: - 接入 WebSocket 客户端: advanced/connect-ws-client.md - 编写管理员才能触发的功能: advanced/example/admin.md + - 接入青云客聊天API: advanced/example/integrate-qingyunke-chatbot.md - FAQ: - FAQ: faq/FAQ.md - 从 v1 升级: faq/to-v2.md From 095855162b68a6f082b029a5c653d60ffa6160d1 Mon Sep 17 00:00:00 2001 From: Jerry Ma Date: Fri, 18 Mar 2022 16:48:30 +0800 Subject: [PATCH 5/7] Update mkdocs.yml --- mkdocs.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mkdocs.yml b/mkdocs.yml index 15b3316f..596fb60e 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -39,7 +39,7 @@ extra: version: provider: mike -copyright: 'Copyright © 2019 - 2021 CrazyBot Team      +copyright: 'Copyright © 2019 - 2022 CrazyBot Team      From cca6102e91a5f04d7659e7b14640e1ad6b06a48c Mon Sep 17 00:00:00 2001 From: Jerry Ma Date: Fri, 18 Mar 2022 16:57:27 +0800 Subject: [PATCH 6/7] Update README.md --- README.md | 13 +++---------- 1 file changed, 3 insertions(+), 10 deletions(-) diff --git a/README.md b/README.md index 24089449..969a2c32 100644 --- a/README.md +++ b/README.md @@ -62,20 +62,15 @@ vendor/bin/start server ## 特点 - 原生为多账号设计,支持多个机器人负载均衡 - 使用 Swoole 多工作进程机制和协程加持,尽可能简单的情况下提升了性能 -- 灵活的注解事件绑定机制 +- 灵活的注解事件绑定机制,可兼容使用 PHP8 的 Attribute(>=2.7 可用) - 易用的上下文,模块内随处可用 -- 采用模块化编写,可自由搭配其他 composer 组件 +- 采用模块化编写,可自由搭配其他 composer 组件,也可单文件面向过程编写 - 常驻内存,全局缓存变量随处使用,提供多种缓存方案 - 自带 MySQL、Redis 等数据库连接池等数据库连接方案 - 本身为 HTTP 服务器、WebSocket 服务器,可以构建属于自己的 HTTP API 接口 - 静态文件服务器,可将前端合并到一起 - 自带 PHP + Swoole 环境,无需手动编译安装,by [crazywhalecc/static-php-cli](https://github.com/crazywhalecc/static-php-cli) -## 从 v1 升级 -炸毛框架 v2 相对 v1 版本改动了不少内容,其中包括框架底层机制、注解事件分发、调试、命名空间等变化,详情可查看上方文档。 - -如果旧版框架使用过程中无问题且对新功能暂无需求,可以继续使用 v1 版本,后续也将维护安全类更新和修复致命 bug。 - ## 下载源码 框架源码可直接克隆本仓库进行编辑,如果你在国内,访问 GitHub 和 clone 仓库比较慢,可以将 `github.com` 替换为 `fgit.zhamao.me` 进行加速。 @@ -93,12 +88,10 @@ vendor/bin/start server ### 支付宝 ![支付宝二维码](https://cdn.jsdelivr.net/gh/zhamao-robot/zhamao-framework/resources/images/alipay_img.jpg) -如果你对我们的周边感兴趣,我们还有炸毛机器人定制 logo 的雨伞,详情咨询作者 QQ,我们会作为您捐助了本项目! - ## 关于 框架和 SDK 是 炸毛机器人 项目的核心框架开源部分。炸毛机器人是作者写的一个高性能机器人,曾获全国计算机设计大赛一等奖。 -作者的炸毛机器人已从2018年初起稳定运行了**四年**,并且持续迭代。 +作者的炸毛机器人已从2018年初起稳定运行了**四年半**,并且持续迭代。 欢迎随时在 HTTP-API 插件群里提问,当然更好的话可以加作者 QQ([627577391](http://wpa.qq.com/msgrd?v=3&uin=627577391&site=qq&menu=yes))或提交 Issue 进行疑难解答。 From 689076d97cc096dc36f299fa9a8b95619f39abc1 Mon Sep 17 00:00:00 2001 From: Jerry Ma Date: Sat, 19 Mar 2022 20:33:13 +0800 Subject: [PATCH 7/7] Update mkdocs.yml --- mkdocs.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mkdocs.yml b/mkdocs.yml index 596fb60e..7b11a268 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -106,7 +106,7 @@ nav: - Console 终端: component/common/console.md - TaskWorker 管理: component/common/task-worker.md - Terminal 终端: component/common/remote-terminal.md - - EventTracer 事件追踪器: component/comon/event-tracer.md + - EventTracer 事件追踪器: component/common/event-tracer.md - HTTP 服务器工具类: - HTTP 和 WebSocket 客户端: component/http/zmrequest.md - HTTP 路由管理: component/http/route-manager.md