# 快速上手 - 机器人篇



## 简介

看到这里，你已经完成了前面的环境部署，到了最关键的第一步了！

一切都安装成功后，你就已经做好了进行简单配置以运行一个最小的 **机器人问答模块** 的准备。

炸毛框架和机器人客户端是什么关系呢？炸毛框架就好比我们传统的一系列例如 Spring 框架、ThinkPHP 框架等，是服务端，而机器人客户端是一个 HTTP / WebSocket 客户端，时刻准备着连接到炸毛框架。

## 机器人客户端

开发之前请注意，**机器人客户端和框架相互独立！**故有关**机器人客户端**出现的问题请到对应机器人客户端开发者或 GitHub 项目中咨询和讨论，炸毛框架为对接机器人客户端的一个快速开发的框架。

机器人客户端是炸毛框架以外的程序或软件，目前炸毛框架支持的机器人客户端通信标准为 OneBot 标准（原 CQHTTP），只要你的机器人客户端是 OneBot 标准的，就可以和炸毛框架进行无缝对接。

OneBot 机器人部分的选择详情见 [OneBot 实例](/guide/OneBot实例/)。

这里以炸毛框架开发过程中使用的 [go-cqhttp](https://github.com/Mrs4s/go-cqhttp) 来举例进行第一个机器人的配置工作。

简要步骤描述为：

1. 下载 go-cqhttp 对应平台的 [release 文件](https://github.com/Mrs4s/go-cqhttp/releases)
2. 双击 exe 文件或者使用 `./go-cqhttp` 启动
3. 生成默认配置文件并修改默认配置

!!! warning "注意"

    由于 go-cqhttp 项目还处于开发期，而且配置文件格式也发生了多次变化，但大体内容没有变（比如编写此文档时发布的版本中配置文件格式变成了 `hjson` 取代了原来的 `json`。

=== "config.hjson（新格式）"

    ``` json hl_lines="3 5 81 84"
    {
      // QQ号
      uin: 你的机器人QQ
      // QQ密码
      password: "你的QQ密码"
      // 是否启用密码加密
      encrypt_password: false
      // 加密后的密码, 如未启用密码加密将为空, 请勿随意修改.
      password_encrypted: ""
      // 是否启用内置数据库
      // 启用将会增加10-20MB的内存占用和一定的磁盘空间
      // 关闭将无法使用 撤回 回复 get_msg 等上下文相关功能
      enable_db: true
      // 访问密钥, 强烈推荐在公网的服务器设置
      access_token: ""
      // 重连设置
      relogin: {
        // 是否启用自动重连
        // 如不启用掉线后将不会自动重连
        enabled: true
        // 重连延迟, 单位秒
        relogin_delay: 3
        // 最大重连次数, 0为无限制
        max_relogin_times: 0
      }
      // API限速设置
      // 该设置为全局生效
      // 原 cqhttp 虽然启用了 rate_limit 后缀, 但是基本没插件适配
      // 目前该限速设置为令牌桶算法, 请参考: 
      //https://baike.baidu.com/item/%E4%BB%A4%E7%89%8C%E6%A1%B6%E7%AE%97%E6%B3%95/6597000?fr=aladdin
      _rate_limit: {
        // 是否启用限速
        enabled: false
        // 令牌回复频率, 单位秒
        frequency: 1
        // 令牌桶大小
        bucket_size: 1
      }
      // 是否忽略无效的CQ码
      // 如果为假将原样发送
      ignore_invalid_cqcode: false
      // 是否强制分片发送消息
      // 分片发送将会带来更快的速度
      // 但是兼容性会有些问题
      force_fragmented: false
      // 心跳频率, 单位秒
      // -1 为关闭心跳
      heartbeat_interval: 0
      // HTTP设置
      http_config: {
        // 是否启用正向HTTP服务器
        enabled: true
        // 服务端监听地址
        host: 0.0.0.0
        // 服务端监听端口
        port: 5700
        // 反向HTTP超时时间, 单位秒
        // 最小值为5，小于5将会忽略本项设置
        timeout: 0
        // 反向HTTP POST地址列表
        // 格式: 
        // {
        //    地址: secret
        // }
        post_urls: {}
      }
      // 正向WS设置
      ws_config: {
        // 是否启用正向WS服务器
        enabled: true
        // 正向WS服务器监听地址
        host: 0.0.0.0
        // 正向WS服务器监听端口
        port: 6700
      }
      // 反向WS设置
      ws_reverse_servers: [
        // 可以添加多个反向WS推送
        {
            // 是否启用该推送
            enabled: true
            // 反向WS Universal 地址
            // 注意 设置了此项地址后下面两项将会被忽略
            reverse_url: ws://127.0.0.1:20001/
            // 反向WS API 地址
            reverse_api_url: ""
            // 反向WS Event 地址
            reverse_event_url: ""
            // 重连间隔 单位毫秒
            reverse_reconnect_interval: 3000
        }
      ]
      // 上报数据类型
      // 可选: string array
      post_message_format: string
      // 是否使用服务器下发的新地址进行重连
      // 注意, 此设置可能导致在海外服务器上连接情况更差
      use_sso_address: false
      // 是否启用 DEBUG
      debug: false
      // 日志等级
      // WebUi 设置
      web_ui: {
        // 是否启用 WebUi
        enabled: true
        // 监听地址
        host: 127.0.0.1
        // 监听端口
        web_ui_port: 9999
        // 是否接收来自web的输入
        web_input: false
      }
    }
    ```

=== "config.json（旧格式）" 

    ``` json hl_lines="2 3 30 31"
    {
      "uin": 你的QQ号,
      "password": "你的密码",
      "encrypt_password": false,
      "password_encrypted": "",
      "enable_db": true,
      "access_token": "",
      "relogin": {
        "enabled": true,
        "relogin_delay": 3,
        "max_relogin_times": 0
      },
      "ignore_invalid_cqcode": false,
      "force_fragmented": true,
      "heartbeat_interval": 0,
      "http_config": {
        "enabled": false,
        "host": "0.0.0.0",
        "port": 5700,
        "timeout": 0,
        "post_urls": {}
      },
      "ws_config": {
        "enabled": false,
        "host": "0.0.0.0",
        "port": 6700
      },
      "ws_reverse_servers": [
        {
          "enabled": true,
          "reverse_url": "ws://127.0.0.1:20001/",
          "reverse_api_url": "",
          "reverse_event_url": "",
          "reverse_reconnect_interval": 3000
        }
      ],
      "post_message_format": "string",
      "debug": false,
      "log_level": ""
    }
    ```

其中 ws://127.0.0.1:20001/ 中的 127.0.0.1 和 20001 应分别对应炸毛框架配置的 HOST 和 PORT

## 第一次对话

一旦新的配置文件正确生效之后，所在的控制台（如果正在运行的话）应该会输出类似下面的内容：

```verilog
[15:26:34] [I] [#2] 机器人 你的QQ号 已连接！
```

表明机器人已成功连接到炸毛框架了！

这时，如果你是根据安装教程走下来并且未编写任何模块，炸毛自带一个示例模块，里面含有命令：`你好`，`随机数`。如果你对机器人回复：`你好`，它会回复你 `你好啊，我是由炸毛框架构建的机器人！`。这一历史性的对话标志着你已经成功地运行了炸毛框架，开始了编写更强大的 QQ 机器人的创意之旅！

## 编写一个命令

让我们转到框架的模块源代码部分，目录是 `src/Module/Example`，文件是 `Hello.php`。我们插入一段这样的代码：

```php
/**
 * @CQCommand("echo")
 */
public function repeat() {
  $repeat = ctx()->getFullArg("请输入你要回复的内容");
  ctx()->reply($repeat);
  //return $repeat; // 这样的效果等同于 ctx()->reply()
}
```

这样，一个简易的复读机就做好了！回到 QQ 机器人聊天，向机器人发送 `echo 你好啊`，它会回复你 `你好啊`。

<chat-box>
) echo 你好啊
( 你好啊
) echo
( 请输入你要回复的内容
) 哦豁
( 哦豁
</chat-box>

> 如果你只回复 `echo` 的话，它会先和你进入一个会话状态，并问你 `请输入你要回复的内容`，这时你再次说一些内容例如 `哦豁`，会回复你 `哦豁`。效果和直接输入 `echo 哦豁` 是一致的，这是炸毛框架内的一个封装好的命令参数对话询问功能。有关参数询问功能，请看后面的进阶模块。

