diff --git a/docs/advanced/example/weather-bot.md b/docs/advanced/example/weather-bot.md new file mode 100644 index 00000000..f31cd5ca --- /dev/null +++ b/docs/advanced/example/weather-bot.md @@ -0,0 +1,112 @@ +# 基于词性分析和魅族天气的天气查询机器人 + +本文将基于 [`jieba-php`](https://github.com/fukuball/jieba-php) 中文分词库以及 [魅族天气 API](https://github.com/shichunlei/-Api/blob/master/MeizuWeather.md) 开发一个天气查询机器人。 + +## 结果演示 +![圖片](https://user-images.githubusercontent.com/31698606/159122016-61ba9696-5786-4561-b371-827d9f1d01aa.png) +尾部的随机表情并非本教程的一部分。 + +## 逻辑编写 + +[`jieba-php`](https://github.com/fukuball/jieba-php) 是目前比较好用的中文分词库,虽然最近的维护并不活跃,但已足够我们的需求: +```shell +composer require fukuball/jieba-php:dev-master +``` + +以下代码使用了本文作者自行编写的天气查询库,需要进行引入: +```shell +composer require sunxyw/weather +``` +您也可以将以下代码自行改写为直接调用魅族天气 API,详情请参阅[魅族天气 API 文档](https://github.com/shichunlei/-Api/blob/master/MeizuWeather.md)。 + +```php + 'small']); + Posseg::init(); + } + + /** + * 查询天气 + * + * @CQCommand(keyword="天气") + * + * @return string + */ + public function cmdQueryWeather(): string + { + // 分词并进行词性分析 + $seg_list = Posseg::cut(ctx()->getMessage()); + $tags = array_column($seg_list, 'tag'); + // 找出词性为 ns(地名)的单词 + $location_index = array_search('ns', $tags, true); + $location = $seg_list[$location_index]['word']; + + // 此处引入了本文作者自己写的天气库 + $w = new Weather(); + try { + $report = $w->getWeather($location); + } catch (\InvalidArgumentException) { + return '城市输入错误'; + } catch (\JsonException $e) { + Console::warning("天气查询失败:{$e->getMessage()}"); + return '天气查询失败'; + } + + $template = <<getCity(), + $report->getRealtime()['weather'], + $report->getRealtime()['temperature'], + $report->getRealtime()['humidity'], + $report->getRealtime()['wind_direction'], + $report->getRealtime()['wind_speed'], + $report->getRealtime()['air_quality'], + ]; + foreach (array_slice($report->getForecastDaily(), 0, 3) as $forecast) { + $args[] = $forecast['date']; + $args[] = $forecast['weather']; + $args[] = $forecast['temperature']['day']; + $args[] = $forecast['temperature']['night']; + $args[] = $forecast['wind_direction']; + $args[] = $forecast['wind_speed']; + } + return vsprintf($template, ...$args); + } +} +``` + + + diff --git a/mkdocs.yml b/mkdocs.yml index 4540d4d4..af4095b3 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -126,6 +126,7 @@ nav: - 接入 WebSocket 客户端: advanced/connect-ws-client.md - 编写管理员才能触发的功能: advanced/example/admin.md - 接入青云客聊天API: advanced/example/integrate-qingyunke-chatbot.md + - 开发天气机器人: advanced/example/weather-bot.md - FAQ: - FAQ: faq/FAQ.md - 从 v1 升级: faq/to-v2.md