说明

现在handsome主题已经有了微信公众号和浏览器拓展两种方式向时光机发送消息,那么自然就想到QQ端是否也可以做到,所以我就通过对浏览器扩展发送时光机进行抓包,然后基于酷Q和nonebot,实现了通过向QQ小号发送消息的方式向时光机发送消息。

使用方法

和微信公众号的用法大同小异,所有消息需要私聊机器人

发送帮助 时光机查看帮助信息
发送绑定然后根据提示输入绑定信息,发送解绑取消绑定
发送时光鸡然后根据提示输入你要发送的消息(也可以一次性输入时光鸡 你要发送的消息中间加空格即可)
发送开始然后可以逐条发送消息,发送结束结束混合消息,发送取消取消发送
发送的第一条消息如果以#开头即为私密消息
发送博客获取博客地址
发送图床更改图床

如有需要,可以直接加群体验我已经搭建好的QQ机器人

已知问题

  1. 由于QQ可以在一条消息里同时塞进文字和图片,所以发送单条消息也可以达到混合消息的效果,但经我测试在QQ手机客户端如果一条消息同时包含文字和图片,那么图片会无法解析,但是电脑的TIM客户端不存在这个问题。这个问题出在酷Q上,所以要同时发送文字和图片,在手机客户端最好采用逐条发送的模式。
  2. 由于handsome_6.0对上传的图片进行了压缩,所以上传gif图片会被压缩成jpg图片,因此图片增加图床功能并默认采用QQ图片的源地址,省去了下载和上传操作,速度更快,但QQ源图片腾讯可能采取限制而无法引用,而且目前已知腾讯对这些图片的缓存会过一段时间就清掉,所以QQ源图床慎用。最好的当然是接入自己的图床,暂时先懒得弄。

安装方法(Windows)

你可以先在自己的电脑上安装和熟悉使用

1. 准备

所有需要下载的东西已打包->点击下载
因为是基于酷Q和Python运行的,所以需要先安装酷Q Air->下载地址,然后打开酷Q,登陆你的作为QQ机器人的QQ小号,熟悉酷Q的使用,尤其是插件的安装和启用,酷Q论坛里也有许多其他插件可供玩耍。
然后下载安装python,建议下载安装Python 3.7.x 32位版本,因为我是基于这个版本开发的,别的版本尤其是最新的3.8版本可能会有未知的不兼容的bug。安装的时候记得勾选环境变量。

2. 安装插件

这里可以参考CoolQ HTTP API官方说明
将io.github.richardchien.coolqhttpapi.cpk移动至酷Q的app文件下,然后重启酷Q或者在应用管理里重载应用,在应用管理里选中HTTP API插件,点击启用,接下来几个弹窗统统选是。启用成功后会弹出控制台窗口。

如果弹窗提示应用加载失败,先安装 Visual C++ 可再发行软件包

3.启用nonebot

这里可以参考Nonebot官方说明
如果你之前成功开启了插件,那么酷Q的data/app/io.github.richardchien.coolqhttpapi/config/目录中应该已经有了一个名为 <user-id>.json 的文件(<user-id> 为你登录的 QQ 账号),修改其中的内容如下:

json文件内容

{
    "host": "[::]",
    "port": 5700,
    "use_http": true,
    "ws_host": "[::]",
    "ws_port": 6700,
    "use_ws": false,
    "ws_reverse_url": "",
    "ws_reverse_api_url": "ws://127.0.0.1:8080/ws/api/",
    "ws_reverse_event_url": "ws://127.0.0.1:8080/ws/event/",
    "ws_reverse_reconnect_interval": 3000,
    "ws_reverse_reconnect_on_code_1000": true,
    "use_ws_reverse": true,
    "post_url": "",
    "access_token": "",
    "secret": "",
    "post_message_format": "string",
    "serve_data_files": false,
    "update_source": "github",
    "update_channel": "stable",
    "auto_check_update": false,
    "auto_perform_update": false,
    "show_log_console": true,
    "log_level": "info"
}

然后下载找到我写的coolq-cross-bot文件,用python运行该文件夹下的bot.py文件,运行前要先安装依赖库。


打开命令提示符窗口,执行以下命令:

pip install nonebot
pip install aiohttp

然后在控制台进入coolq-cross-bot文件夹内,输入python bot.py运行该文件,当然也可以用IDE运行。


阿里云服务器如果一直卡在下载图片且ping不通c2cpicdw.qpic.cn可能是因为节点问题,需添加host记录113.96.232.144 c2cpicdw.qpic.cn

最后重启酷Q软件或者重载插件,弹出来的控制台如下显示成功字样则代表配置成功,这时你就可以私聊机器人发送初始化创建一个数据库后就可以使用了(初始化命令只需执行一次,用于在文件目录下新建bind_info.sqlite文件用于记录绑定信息),最后要注意两个控制台窗口都不能关闭,你可以选择新建一个桌面单独用于运行他们。

安装方法(Linux)

详细参考:CoolQ HTTP API官方说明
Linux系统需要在docker中运行酷Q,所以要先安装docker,安装教程请自行百度,以下仅供参考,以我的Ubuntu16.04 64位为例,ssh连上服务器后运行以下命令安装docker

$ curl -fsSL https://get.docker.com -o get-docker.sh
$ sudo sh get-docker.sh

然后安装酷Q和HTTP API插件(配置参数无所谓,后面手动替换)

$ docker pull richardchien/cqhttp:latest
$ mkdir coolq  # 用于存储 酷Q 的程序文件
$ docker run -ti --rm --name cqhttp-test \
             -v $(pwd)/coolq:/home/user/coolq \  # 将宿主目录挂载到容器内用于持久化 酷Q 的程序文件
             -p 9000:9000 \  # noVNC 端口,用于从浏览器控制 酷Q
             -p 5700:5700 \  # HTTP API 插件开放的端口
             -e COOLQ_ACCOUNT=123456 \ # 要登录的 QQ 账号,可选但建议填
             -e CQHTTP_POST_URL=http://example.com:8080 \  # 事件上报地址
             -e CQHTTP_SERVE_DATA_FILES=yes \  # 允许通过 HTTP 接口访问 酷Q 数据文件
             richardchien/cqhttp:latest

然后访问 http://[你的服务器IP]:9000/ 进入 noVNC(默认密码 MAX8char),登录酷Q,即可开始使用(插件已自动启用,配置文件也根据启动命令的环境变量自动生成了)

如果阿里云主机注意要先开放相应的端口,默认是9000端口

把coolq-cross-bot文件夹上传至服务器,将之前的json文件也上传至服务器并替换掉app/io.github.richardchien.coolqhttpapi/下的ini配置文件(注意将配置文件中127.0.0.1换成172.17.0.1),然后用python3命令运行文件下的bot.py,重启插件

进阶自定义修改(可选)

1. 自定义命令

其实时光机的触发命令不仅可以是‘时光机’,也可以是‘时光鸡’、‘时光姬’等,具体可以在 coolq-cross-bot/plugins/handsome/timeji.py 源码中找到类似下面的语句自行进行修改。
@on_command('timeji', aliases=('时光鸡', '时光机', '时光姬', '动态', '说说'))
其他命令类似。

2. 添加消息来源

如上图所示,在时光机消息的来源处,如果不对handsome的源码进行修改,就会显示来自未知浏览器,找到handsome/libs/UA.php文件,在文件的最后加入如下所示的QQ的来源,名称可以自定义。

public function returnTimeUa(){
        if ($this->ua == "weixin" || $this->ua == "weChat"){
            return array("title"=>_mt("微信公众号"),
                "icon"=>"compass");
        }elseif ($this->ua == "crx"){
            return array("title"=>_mt("Chrome扩展"),
                "icon"=>"chrome");
        }elseif ($this->ua == "qq"){
            return array("title"=>_mt("QQ时光姬"),
                "icon"=>"compass");
        }else{
            $ua = $this->returnOS();
            $ua["icon"] = "disc";
            return $ua;
        }
    }

3.添加消息来源前的图标(6.0主题不需要了)

主题默认呈现出来的都是清一色的小圆点图标,要更改消息来源前的小图标,首先要添加fontawesome图标,然后找到handsome/component/say.php,找到下面第一条语句,改成第二句。

# 找到下面这一句
<i class="glyphicon glyphicon-record m-l-sm"></i>&nbsp;
# 改成下面这样
<i class="<?php echo $ua->returnTimeUa()['icon'] ?> m-l-sm"></i>&nbsp;
最后修改:2020 年 04 月 18 日
你的赞赏是我前进的动力