前几天部署了开源的浮墨笔记(flomo)替代品:Memos。这个项目已经有了 Android、iOS 客户端、浏览器拓展等等一系列生态。但是对比原版的浮墨笔记,少了 QQ / 微信的接入对于我来说不太方便。Memos 提供了简便的 API,我们可以自己动手,部署一个 QQ 机器人。

前置准备

运行 go-cqhttp

我们的机器人在服务端分为两个组件,这两个组件都要部署在我们的服务器上。

首先部署 go-cqhttp。前往 GitHub 上的 release 下载最新适合服务器架构的版本,下载解压之后是一个单文件程序。第一次运行,在提示选择通信方式时,选择「反向 Websocket 通信」,之后程序就会在相同目录下生成配置文件。

编辑配置文件,根据提示将 uin 和 password 字段分别改为自己的 QQ 和密码。虽然配置文件中说「密码为空时可以使用扫码登录」,但是经过实测只有在同一网络环境下 QQ 才会允许扫码登录。部署在服务器上扫码是无法登录的,只能使用密码。
除此之外,修改文件底部 servers 部分 ws-reverse 中 universal 的地址。我设定的是 ws://127.0.0.1:8989/ws/。这个地址告诉 go-cqhttp,该从哪里与后端的 NoneBot 通信。

修改完毕后,再次启动 go-cqhttp,可能会提示需要扫码、滑块验证、手机验证之类,跟着程序的提示进行即可。
程序会提示,对于腾讯云的服务器需要修改 DNS 为 114.114.114.114。编辑 /etc/resolv.conf 并修改就行。
出现以下消息就表明登录成功:

[INFO]: 登录成功 欢迎使用: SkyWT

此时可能会出现大量的「Connection Refused」消息,这是因为我们还没启动后端的 NoneBot。忽略他们即可。

[WARNING]: 连接到反向 WebSocket Universal 服务器 ws://127.0.0.1:8989/ws/ 时出现错误: dial tcp 127.0.0.1:8989: connect: connection refused

接下来,要将 go-cqhttp 放到后台运行,开始编写 NoneBot 的主程序。

编写运行 NoneBot

参阅 NoneBot 的官方指南编写主要的代码,包括 bot.pyconfig.py。在后者中要指定与 go-cqhttp 的 config.yml 中配置一致的 HOST 和 PORT。我的配置分别是 127.0.0.18989

接下来,我们可以通过编写插件的方式使 QQ 机器人实现 Memo 备忘录的功能。
其实直接根据文档里的插件修改一下就可以了:

from nonebot import on_command, CommandSession
import requests
import json

__plugin_name__ = 'Memos'
__plugin_usage__ = r"""
memo [需要添加的 Memo 内容]
"""
MEMOS_API = 'https://memos.skywt.cn/api/memo?openId=************'

@on_command('memo', aliases=('note'))
async def memo(session: CommandSession):
    memo_text = session.current_arg_text.strip()
    if not memo_text:
        await session.send('Memo 内容不能为空!')
        return
    ret = await send_memo(memo_text)
    await session.send(ret)

async def send_memo(memo_text: str) -> str:
    data_to_send = {'content': memo_text}
    r = requests.post(MEMOS_API, data=json.dumps(data_to_send))
    if r.status_code == 200:
        return '添加成功'
    else:
        return '添加失败,请查阅日志'

回到 NoneBot 的主目录启动 bot.py 并放在后台,发送消息 memo 这是一条测试笔记,可以看到正确的输出。
进入 Memos 可以看到成功添加了一条 memo。

聊天界面,机器人回复添加成功

参考资料